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