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