1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/matrix.h
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_OPENGLES_MATRIX_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_OPENGLES_MATRIX_H
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stddef.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/pixelflinger/ggl_context.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst int OGLES_MODELVIEW_STACK_DEPTH   = 16;
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst int OGLES_PROJECTION_STACK_DEPTH  =  2;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst int OGLES_TEXTURE_STACK_DEPTH     =  2;
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_matrix(ogles_context_t*);
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit_matrix(ogles_context_t*);
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_invalidate_perspective(ogles_context_t* c);
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_validate_transform_impl(ogles_context_t* c, uint32_t want);
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint ogles_surfaceport(ogles_context_t* c, GLint x, GLint y);
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_scissor(ogles_context_t* c,
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei w, GLsizei h);
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_viewport(ogles_context_t* c,
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLint x, GLint y, GLsizei w, GLsizei h);
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline void ogles_validate_transform(
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* c, uint32_t want)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->transforms.dirty & want)
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_validate_transform_impl(c, want);
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfixed vsquare3(GLfixed a, GLfixed b, GLfixed c)
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %2       \n"
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %3, %3       \n"
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %4       \n"
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "movs  %0, %0, lsr #16      \n"
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "adc   %0, %0, %1, lsl #16  \n"
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a), "r"(b), "r"(c)
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "cc"
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
77b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand#elif defined(__mips__)
78b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand
79b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    GLfixed res;
80b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    int32_t t1,t2,t3;
81b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    asm(
82b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mult  %[a], %[a]       \r\n"
83b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "li    %[res],0x8000 \r\n"
84b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "madd   %[b],%[b] \r\n"
85b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "move   %[t3],$zero \r\n"
86b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "madd   %[c],%[c] \r\n"
87b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mflo   %[t1]\r\n"
88b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mfhi   %[t2]\r\n"
89b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "addu   %[t1],%[res],%[t1]\r\n"          /*add 0x8000*/
90b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "sltu   %[t3],%[t1],%[res]\r\n"
91b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "addu   %[t2],%[t2],%[t3]\r\n"
92b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "srl    %[res],%[t1],16\r\n"
93b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "sll    %[t2],%[t2],16\r\n"
94b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "or     %[res],%[res],%[t2]\r\n"
95b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        :   [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2),[t3]"=&r"(t3)
96b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        :   [a] "r" (a),[b] "r" (b),[c] "r" (c)
97b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        : "%hi","%lo"
98b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        );
99b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    return res;
100b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a)*a +
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(b)*b +
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(c)*c + 0x8000)>>16);
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla2a( GLfixed a0, GLfixed b0,
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed c)
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %6, %0, lsr #16  \n"
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %0, %1, lsl #16  \n"
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1)>>16) + c;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a( GLfixed a0, GLfixed b0,
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed a1, GLfixed b1,
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed a2, GLfixed b2,
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed c)
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %8, %0, lsr #16  \n"
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %0, %1, lsl #16  \n"
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2),
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand#elif defined(__mips__)
164b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand
165b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    GLfixed res;
166b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    int32_t t1,t2;
167b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    asm(
168b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mult  %[a0],%[b0]       \r\n"
169b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "madd  %[a1],%[b1]       \r\n"
170b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "madd  %[a2],%[b2]       \r\n"
171b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mflo  %[t2]\r\n"
172b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "mfhi  %[t1]\r\n"
173b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "srl    %[t2],%[t2],16\r\n"
174b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "sll    %[t1],%[t1],16\r\n"
175b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "or     %[t2],%[t2],%[t1]\r\n"
176b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        "addu   %[res],%[t2],%[c]"
177b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        :   [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2)
178b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        :   [a0] "r" (a0),[b0] "r" (b0),[a1] "r" (a1),[b1] "r" (b1),[a2] "r" (a2),[b2] "r" (b2),[c] "r" (c)
179b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        : "%hi","%lo"
180b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand        );
181b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand    return res;
182b43722c3dd69a90f0d0665912bd543aa12521c58Duane Sand
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2)>>16) + c;
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// b0, b1, b2 are signed 16-bit quanities
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// that have been shifted right by 'shift' bits relative to normal
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// S16.16 fixed point
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16( GLfixed a0, int32_t b1b0,
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed a1,
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed a2, int32_t b2,
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLint shift,
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed c)
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %2          \n"
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %3, %2, %0      \n"
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawb %0, %4, %5, %0      \n"
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0), "r"(b1b0),
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2), "r"(b2),
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 = b1b0 & 0xffff;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16_btb( GLfixed a0,
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a1,
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a2,
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   int32_t b1b0, int32_t xxb2,
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLint shift,
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed c)
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %4          \n"
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %2, %4, %0      \n"
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawb %0, %3, %5, %0      \n"
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0),
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2),
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(b1b0), "r"(xxb2),
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 =  b1b0        & 0xffff;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b2 =  xxb2        & 0xffff;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16_btt( GLfixed a0,
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a1,
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a2,
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   int32_t b1b0, int32_t b2xx,
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLint shift,
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed c)
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %4          \n"
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %2, %4, %0      \n"
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %3, %5, %0      \n"
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0),
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2),
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(b1b0), "r"(b2xx),
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 =  b1b0        & 0xffff;
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b2 = (b2xx >> 16) & 0xffff;
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3( GLfixed a0, GLfixed b0,
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a2, GLfixed b2)
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "movs  %0, %0, lsr #16      \n"
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "adc   %0, %0, %1, lsl #16  \n"
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2)
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "cc"
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2 + 0x8000)>>16);
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla4( GLfixed a0, GLfixed b0,
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a2, GLfixed b2,
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a3, GLfixed b3)
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %8, %9       \n"
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "movs  %0, %0, lsr #16      \n"
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "adc   %0, %0, %1, lsl #16  \n"
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2),
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a3), "r"(b3)
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "cc"
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2 +
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a3)*b3 + 0x8000)>>16);
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfixed dot4(const GLfixed* a, const GLfixed* b)
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mla4(a[0], b[0], a[1], b[1], a[2], b[2], a[3], b[3]);
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfixed dot3(const GLfixed* a, const GLfixed* b)
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mla3(a[0], b[0], a[1], b[1], a[2], b[2]);
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_OPENGLES_MATRIX_H
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
400