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
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a)*a +
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(b)*b +
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(c)*c + 0x8000)>>16);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla2a( GLfixed a0, GLfixed b0,
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed c)
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %6, %0, lsr #16  \n"
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %0, %1, lsl #16  \n"
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1)>>16) + c;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a( GLfixed a0, GLfixed b0,
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed a1, GLfixed b1,
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed a2, GLfixed b2,
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                             GLfixed c)
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %8, %0, lsr #16  \n"
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add   %0, %0, %1, lsl #16  \n"
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2),
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2)>>16) + c;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// b0, b1, b2 are signed 16-bit quanities
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// that have been shifted right by 'shift' bits relative to normal
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// S16.16 fixed point
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16( GLfixed a0, int32_t b1b0,
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed a1,
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed a2, int32_t b2,
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLint shift,
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               GLfixed c)
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %2          \n"
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %3, %2, %0      \n"
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawb %0, %4, %5, %0      \n"
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0), "r"(b1b0),
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2), "r"(b2),
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 = b1b0 & 0xffff;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16_btb( GLfixed a0,
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a1,
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a2,
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   int32_t b1b0, int32_t xxb2,
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLint shift,
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed c)
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %4          \n"
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %2, %4, %0      \n"
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawb %0, %3, %5, %0      \n"
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0),
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2),
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(b1b0), "r"(xxb2),
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 =  b1b0        & 0xffff;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b2 =  xxb2        & 0xffff;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3a16_btt( GLfixed a0,
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a1,
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed a2,
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   int32_t b1b0, int32_t b2xx,
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLint shift,
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                   GLfixed c)
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smulwb %0, %1, %4          \n"
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %2, %4, %0      \n"
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlawt %0, %3, %5, %0      \n"
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "add    %0, %7, %0, lsl %6  \n"
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r)
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "r"(a0),
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a1),
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(a2),
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(b1b0), "r"(b2xx),
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(shift),
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "r"(c)
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t accum;
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b0 =  b1b0        & 0xffff;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b1 = (b1b0 >> 16) & 0xffff;
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int16_t b2 = (b2xx >> 16) & 0xffff;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum  = int64_t(a0)*int16_t(b0) >> 16;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a1)*int16_t(b1) >> 16;
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum += int64_t(a2)*int16_t(b2) >> 16;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    accum = (accum << shift) + c;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return accum;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla3( GLfixed a0, GLfixed b0,
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a2, GLfixed b2)
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "movs  %0, %0, lsr #16      \n"
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "adc   %0, %0, %1, lsl #16  \n"
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2)
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "cc"
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2 + 0x8000)>>16);
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline GLfixed mla4( GLfixed a0, GLfixed b0,
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a1, GLfixed b1,
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a2, GLfixed b2,
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            GLfixed a3, GLfixed b3)
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && !defined(__thumb__)
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed r;
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t t;
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    asm(
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smull %0, %1, %2, %3       \n"
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %4, %5       \n"
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %6, %7       \n"
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "smlal %0, %1, %8, %9       \n"
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "movs  %0, %0, lsr #16      \n"
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        "adc   %0, %0, %1, lsl #16  \n"
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "=&r"(r), "=&r"(t)
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "%r"(a0), "r"(b0),
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a1), "r"(b1),
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a2), "r"(b2),
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "%r"(a3), "r"(b3)
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        :   "cc"
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        );
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((   int64_t(a0)*b0 +
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a1)*b1 +
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a2)*b2 +
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int64_t(a3)*b3 + 0x8000)>>16);
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfixed dot4(const GLfixed* a, const GLfixed* b)
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mla4(a[0], b[0], a[1], b[1], a[2], b[2], a[3], b[3]);
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfixed dot3(const GLfixed* a, const GLfixed* b)
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mla3(a[0], b[0], a[1], b[1], a[2], b[2]);
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_OPENGLES_MATRIX_H
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
356