10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2011 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <cutils/compiler.h>
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h"
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsScriptC.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix4x4.h"
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix3x3.h"
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix2x2.h"
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsdCore.h"
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsdRuntime.h"
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
32048436b8e1b9c5bdcdc0e0d552b147bbc6e2d7bfStephen Hinesstatic float SC_tgamma(float v) {
33048436b8e1b9c5bdcdc0e0d552b147bbc6e2d7bfStephen Hines    return float(tgamma((double)v));
34048436b8e1b9c5bdcdc0e0d552b147bbc6e2d7bfStephen Hines}
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_exp10(float v) {
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return pow(10.f, v);
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesstatic float SC_fract(float v, float *iptr) {
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int i = (int)floor(v);
4222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines    iptr[0] = (float)i;
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return fmin(v - i, 0x1.fffffep-1f);
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_log2(float v) {
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return log10(v) / log10(2.f);
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if 0
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_pown(float v, int p) {
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return powf(v, (float)p);
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_powr(float v, float p) {
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return powf(v, p);
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesfloat SC_rootn(float v, int r) {
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return pow(v, 1.f / r);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesfloat SC_rsqrt(float v) {
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return 1.f / sqrtf(v);
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesfloat SC_sincos(float v, float *cosptr) {
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    *cosptr = cosf(v);
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return sinf(v);
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Integer
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_abs_i32(int32_t v) {return abs(v);}
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);}
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);}
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);}
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);}
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);}
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);}
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);}
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);}
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);}
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);}
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);}
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);}
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);}
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);}
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);}
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);}
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);}
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);}
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);}
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);}
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Float util
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_clamp_f32(float amount, float low, float high) {
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return amount < low ? low : (amount > high ? high : amount);
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_max_f32(float v, float v2) {
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return rsMax(v, v2);
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_min_f32(float v, float v2) {
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return rsMin(v, v2);
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_step_f32(float edge, float v) {
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (v < edge) return 0.f;
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return 1.f;
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_sign_f32(float value) {
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (value > 0) return 1.f;
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (value < 0) return -1.f;
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return value;
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadIdentity_4x4(Matrix4x4 *m) {
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadIdentity();
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadIdentity_3x3(Matrix3x3 *m) {
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadIdentity();
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadIdentity_2x2(Matrix2x2 *m) {
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadIdentity();
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_4x4_f(Matrix4x4 *m, const float *f) {
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(f);
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_3x3_f(Matrix3x3 *m, const float *f) {
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(f);
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_2x2_f(Matrix2x2 *m, const float *f) {
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(f);
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *s) {
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(s);
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_4x4_3x3(Matrix4x4 *m, const Matrix3x3 *s) {
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(s);
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_4x4_2x2(Matrix4x4 *m, const Matrix2x2 *s) {
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(s);
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *s) {
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(s);
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoad_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *s) {
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->load(s);
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadRotate(rot, x, y, z);
1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadScale(Matrix4x4 *m, float x, float y, float z) {
1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadScale(x, y, z);
1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadTranslate(Matrix4x4 *m, float x, float y, float z) {
1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadTranslate(x, y, z);
1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->rotate(rot, x, y, z);
1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixScale(Matrix4x4 *m, float x, float y, float z) {
1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->scale(x, y, z);
1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixTranslate(Matrix4x4 *m, float x, float y, float z) {
1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->translate(x, y, z);
1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadMultiply_4x4_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *lhs, const Matrix4x4 *rhs) {
1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadMultiply(lhs, rhs);
1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadMultiply_3x3_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *lhs, const Matrix3x3 *rhs) {
1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadMultiply(lhs, rhs);
1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadMultiply_2x2_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *lhs, const Matrix2x2 *rhs) {
1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadMultiply(lhs, rhs);
1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixMultiply_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *rhs) {
1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->multiply(rhs);
1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixMultiply_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *rhs) {
1990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->multiply(rhs);
2000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixMultiply_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *rhs) {
2020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->multiply(rhs);
2030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadOrtho(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
2060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadOrtho(l, r, b, t, n, f);
2070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadFrustum(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
2090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadFrustum(l, r, b, t, n, f);
2100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixLoadPerspective(Matrix4x4 *m, float fovy, float aspect, float near, float far) {
2120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->loadPerspective(fovy, aspect, near, far);
2130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic bool SC_MatrixInverse_4x4(Matrix4x4 *m) {
2160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return m->inverse();
2170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic bool SC_MatrixInverseTranspose_4x4(Matrix4x4 *m) {
2190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return m->inverseTranspose();
2200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixTranspose_4x4(Matrix4x4 *m) {
2220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->transpose();
2230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixTranspose_3x3(Matrix3x3 *m) {
2250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->transpose();
2260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic void SC_MatrixTranspose_2x2(Matrix2x2 *m) {
2280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m->transpose();
2290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_randf(float max) {
2320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    float r = (float)rand();
2330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    r *= max;
2340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    r /= RAND_MAX;
2350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return r;
2360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_randf2(float min, float max) {
2390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    float r = (float)rand();
2400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    r /= RAND_MAX;
2410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    r = r * (max - min) + min;
2420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return r;
2430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int SC_randi(int max) {
2460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return (int)SC_randf(max);
2470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int SC_randi2(int min, int max) {
2500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return (int)SC_randf2(min, max);
2510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_frac(float v) {
2540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int i = (int)floor(v);
2550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return fmin(v - i, 0x1.fffffep-1f);
2560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) {
2600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t prev;
2610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
2630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int32_t ret = android_atomic_release_cas(expectedValue, newValue, ptr);
2640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!ret) {
2650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // The android cas return 0 if it wrote the value.  This means the
2660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // previous value was the expected value and we can return.
2670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            return expectedValue;
2680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // We didn't write the value and need to load the "previous" value.
2700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
2710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // A race condition exists where the expected value could appear after our cas failed
2730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // above.  In this case loop until we have a legit previous value or the
2740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // write passes.
2750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } while (prev == expectedValue);
2760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
2770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicInc(volatile int32_t *ptr) {
2810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return android_atomic_inc(ptr);
2820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicDec(volatile int32_t *ptr) {
2850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return android_atomic_dec(ptr);
2860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicAdd(volatile int32_t *ptr, int32_t value) {
2890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return android_atomic_add(value, ptr);
2900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicSub(volatile int32_t *ptr, int32_t value) {
2930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t prev, status;
2940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
2950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
2960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas(prev, prev - value, ptr);
2970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
2980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
2990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicAnd(volatile int32_t *ptr, int32_t value) {
3020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return android_atomic_and(value, ptr);
3030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicOr(volatile int32_t *ptr, int32_t value) {
3060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return android_atomic_or(value, ptr);
3070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicXor(volatile int32_t *ptr, int32_t value) {
3100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t prev, status;
3110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
3120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
3130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas(prev, prev ^ value, ptr);
3140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
3150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
3160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_AtomicUMin(volatile uint32_t *ptr, uint32_t value) {
3190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t prev, status;
3200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
3210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
3220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t n = rsMin(value, prev);
3230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas((int32_t) prev, (int32_t)n, (volatile int32_t*) ptr);
3240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
3250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
3260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) {
3290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t prev, status;
3300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
3310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
3320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int32_t n = rsMin(value, prev);
3330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas(prev, n, ptr);
3340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
3350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
3360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic uint32_t SC_AtomicUMax(volatile uint32_t *ptr, uint32_t value) {
3390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t prev, status;
3400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
3410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
3420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t n = rsMax(value, prev);
3430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas((int32_t) prev, (int32_t) n, (volatile int32_t*) ptr);
3440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
3450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
3460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int32_t SC_AtomicMax(volatile int32_t *ptr, int32_t value) {
3490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t prev, status;
3500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    do {
3510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        prev = *ptr;
3520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int32_t n = rsMax(value, prev);
3530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        status = android_atomic_release_cas(prev, n, ptr);
3540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } while (CC_UNLIKELY(status != 0));
3550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return prev;
3560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
3610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Class implementation
3620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////////////////////////////////////////////////////
3630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// llvm name mangling ref
3650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//  <builtin-type> ::= v  # void
3660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= b  # bool
3670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= c  # char
3680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= a  # signed char
3690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= h  # unsigned char
3700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= s  # short
3710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= t  # unsigned short
3720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= i  # int
3730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= j  # unsigned int
3740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= l  # long
3750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= m  # unsigned long
3760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= x  # long long, __int64
3770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= y  # unsigned long long, __int64
3780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= f  # float
3790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//                 ::= d  # double
3800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
38122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat acos(float x) {
38222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return acosf(x);
38322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
38422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
38522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat acosh(float x) {
38622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return acoshf(x);
38722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
38822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
38922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat asin(float x) {
39022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return asinf(x);
39122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
39222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
39322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat asinh(float x) {
39422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return asinhf(x);
39522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
39622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
39722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat atan(float x) {
39822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return atanf(x);
39922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
40022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
40122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat atan2(float y, float x) {
40222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return atan2f(y, x);
40322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
40422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
40522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat atanh(float x) {
40622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return atanhf(x);
40722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
40822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
40922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat cbrt(float x) {
41022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return cbrtf(x);
41122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
41222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
41322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat ceil(float x) {
41422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return ceilf(x);
41522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
41622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
41722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat copysign(float x, float y) {
41822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return copysignf(x, y);
41922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
42022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
42122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat cos(float x) {
42222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return cosf(x);
42322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
42422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
42522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat cosh(float x) {
42622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return coshf(x);
42722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
42822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
42922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat erfc(float x) {
43022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return erfcf(x);
43122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
43222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
43322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat erf(float x) {
43422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return erff(x);
43522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
43622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
43722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat exp(float x) {
43822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return expf(x);
43922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
44022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
44122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat exp2(float x) {
44222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return exp2f(x);
44322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
44422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
44522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat exp10(float x) {
44622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_exp10(x);
44722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
44822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
44922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat expm1(float x) {
45022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return expm1f(x);
45122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
45222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
45322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fabs(float x) {
45422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fabsf(x);
45522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
45622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
45722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fdim(float x, float y) {
45822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fdimf(x, y);
45922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
46022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
46122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat floor(float x) {
46222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return floorf(x);
46322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
46422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
46522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fma(float x, float y, float z) {
46622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fmaf(x, y, z);
46722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
46822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
46922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fmax(float x, float y) {
47022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fmaxf(x, y);
47122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
47222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
47322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fmin(float x, float y) {
47422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fminf(x, y);
47522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
47622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
47722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fmod(float x, float y) {
47822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return fmodf(x, y);
47922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
48022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
48122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat fract(float x, float *y) {
48222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_fract(x, y);
48322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
48422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
48522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat frexp(float x, int *y) {
48622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return frexpf(x, y);
48722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
48822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
48922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat hypot(float x, float y) {
49022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return hypotf(x, y);
49122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
49222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
49322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesint ilogb(float x) {
49422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return ilogbf(x);
49522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
49622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
49722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat ldexp(float x, int y) {
49822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return ldexpf(x, y);
49922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
50022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
50122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat lgamma(float x) {
50222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return lgammaf(x);
50322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
50422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
50522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat lgamma(float x, int *y) {
50622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return lgammaf_r(x, y);
50722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
50822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
50922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat log(float x) {
51022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return logf(x);
51122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
51222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
51322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat log2(float x) {
51422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_log2(x);
51522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
51622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
51722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat log10(float x) {
51822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return log10f(x);
51922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
52022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
52122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat log1p(float x) {
52222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return log1pf(x);
52322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
52422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
52522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat logb(float x) {
52622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return logbf(x);
52722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
52822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
52922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat modf(float x, float *y) {
53022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return modff(x, y);
53122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
53222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
53322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat nextafter(float x, float y) {
53422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return nextafterf(x, y);
53522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
53622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
53722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat pow(float x, float y) {
53822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return powf(x, y);
53922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
54022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
54122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat remainder(float x, float y) {
54222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return remainderf(x, y);
54322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
54422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
54522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat remquo(float x, float y, int *z) {
54622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return remquof(x, y, z);
54722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
54822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
54922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat rint(float x) {
55022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return rintf(x);
55122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
55222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
55322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat rootn(float x, int y) {
55422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_rootn(x, y);
55522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
55622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
55722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat round(float x) {
55822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return roundf(x);
55922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
56022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
56122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat rsqrt(float x) {
56222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_rsqrt(x);
56322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
56422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
56522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat sin(float x) {
56622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return sinf(x);
56722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
56822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
56922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat sincos(float x, float *y) {
57022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_sincos(x, y);
57122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
57222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
57322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat sinh(float x) {
57422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return sinhf(x);
57522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
57622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
57722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat sqrt(float x) {
57822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return sqrtf(x);
57922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
58022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
58122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat tan(float x) {
58222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return tanf(x);
58322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
58422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
58522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat tanh(float x) {
58622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return tanhf(x);
58722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
58822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
58922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat tgamma(float x) {
590048436b8e1b9c5bdcdc0e0d552b147bbc6e2d7bfStephen Hines  return SC_tgamma(x);
59122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
59222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
59322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesfloat trunc(float x) {
59422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return truncf(x);
59522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
59622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
59722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesuint32_t clz(uint32_t v) {
59822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_u32(v);
59922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
60022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
60122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesuint16_t clz(uint16_t v) {
60222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_u16(v);
60322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
60422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
60522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesuint8_t clz(uint8_t v) {
60622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_u8(v);
60722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
60822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
60922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesint32_t clz(int32_t v) {
61022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_i32(v);
61122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
61222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
61322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesint16_t clz(int16_t v) {
61422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_i16(v);
61522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
61622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
61722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hineschar clz(char v) {
61822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_clz_i8(v);
61922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
62022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
62122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesint16_t abs(int16_t v) {
62222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_abs_i16(v);
62322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
62422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
62522b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesextern "C" {
62622b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hinesint _Z3absi(int v) {
62722b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_abs_i32(v);
62822b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
62922b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
63022b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
63122b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hineschar abs(char v) {
63222b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines  return SC_abs_i8(v);
63322b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines}
63422b64d47ff0ee55e91cb659d15aad9cdead8adc6Stephen Hines
6350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic RsdSymbolTable gSyms[] = {
6360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4acosf", (void *)&acosf, true },
6370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5acoshf", (void *)&acoshf, true },
6380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4asinf", (void *)&asinf, true },
6390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5asinhf", (void *)&asinhf, true },
6400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4atanf", (void *)&atanf, true },
6410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5atan2ff", (void *)&atan2f, true },
6420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5atanhf", (void *)&atanhf, true },
6430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4cbrtf", (void *)&cbrtf, true },
6440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4ceilf", (void *)&ceilf, true },
6450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z8copysignff", (void *)&copysignf, true },
6460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3cosf", (void *)&cosf, true },
6470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4coshf", (void *)&coshf, true },
6480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4erfcf", (void *)&erfcf, true },
6490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3erff", (void *)&erff, true },
6500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3expf", (void *)&expf, true },
6510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4exp2f", (void *)&exp2f, true },
6520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5exp10f", (void *)&SC_exp10, true },
6530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5expm1f", (void *)&expm1f, true },
6540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4fabsf", (void *)&fabsf, true },
6550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4fdimff", (void *)&fdimf, true },
6560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5floorf", (void *)&floorf, true },
6570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3fmafff", (void *)&fmaf, true },
6580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4fmaxff", (void *)&fmaxf, true },
6590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4fminff", (void *)&fminf, true },  // float fmin(float, float)
6600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4fmodff", (void *)&fmodf, true },
6610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5fractfPf", (void *)&SC_fract, true },
6620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5frexpfPi", (void *)&frexpf, true },
6630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5hypotff", (void *)&hypotf, true },
6640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5ilogbf", (void *)&ilogbf, true },
6650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5ldexpfi", (void *)&ldexpf, true },
6660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6lgammaf", (void *)&lgammaf, true },
6670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6lgammafPi", (void *)&lgammaf_r, true },
6680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3logf", (void *)&logf, true },
6690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4log2f", (void *)&SC_log2, true },
6700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5log10f", (void *)&log10f, true },
6710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5log1pf", (void *)&log1pf, true },
6720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4logbf", (void *)&logbf, true },
6730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4modffPf", (void *)&modff, true },
6740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //{ "_Z3nanj", (void *)&SC_nan, true },
6750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z9nextafterff", (void *)&nextafterf, true },
6760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3powff", (void *)&powf, true },
6770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z9remainderff", (void *)&remainderf, true },
6780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6remquoffPi", (void *)&remquof, true },
6790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4rintf", (void *)&rintf, true },
6800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5rootnfi", (void *)&SC_rootn, true },
6810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5roundf", (void *)&roundf, true },
6820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5rsqrtf", (void *)&SC_rsqrt, true },
6830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3sinf", (void *)&sinf, true },
6840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6sincosfPf", (void *)&SC_sincos, true },
6850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4sinhf", (void *)&sinhf, true },
6860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4sqrtf", (void *)&sqrtf, true },
6870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3tanf", (void *)&tanf, true },
6880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4tanhf", (void *)&tanhf, true },
689048436b8e1b9c5bdcdc0e0d552b147bbc6e2d7bfStephen Hines    { "_Z6tgammaf", (void *)&SC_tgamma, true },
6900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5truncf", (void *)&truncf, true },
6910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3absi", (void *)&SC_abs_i32, true },
6930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3abss", (void *)&SC_abs_i16, true },
6940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3absc", (void *)&SC_abs_i8, true },
6950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzj", (void *)&SC_clz_u32, true },
6960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzt", (void *)&SC_clz_u16, true },
6970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzh", (void *)&SC_clz_u8, true },
6980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzi", (void *)&SC_clz_i32, true },
6990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzs", (void *)&SC_clz_i16, true },
7000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3clzc", (void *)&SC_clz_i8, true },
7010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxjj", (void *)&SC_max_u32, true },
7020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxtt", (void *)&SC_max_u16, true },
7030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxhh", (void *)&SC_max_u8, true },
7040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxii", (void *)&SC_max_i32, true },
7050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxss", (void *)&SC_max_i16, true },
7060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxcc", (void *)&SC_max_i8, true },
7070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3minjj", (void *)&SC_min_u32, true },
7080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3mintt", (void *)&SC_min_u16, true },
7090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3minhh", (void *)&SC_min_u8, true },
7100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3minii", (void *)&SC_min_i32, true },
7110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3minss", (void *)&SC_min_i16, true },
7120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3mincc", (void *)&SC_min_i8, true },
7130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z5clampfff", (void *)&SC_clamp_f32, true },
7150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3maxff", (void *)&SC_max_f32, true },
7160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z3minff", (void *)&SC_min_f32, true },
7170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4stepff", (void *)&SC_step_f32, true },
7180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    //{ "smoothstep", (void *)&, true },
7190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z4signf", (void *)&SC_sign_f32, true },
7200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // matrix
7220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadIdentityP12rs_matrix4x4", (void *)&SC_MatrixLoadIdentity_4x4, true },
7230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadIdentityP12rs_matrix3x3", (void *)&SC_MatrixLoadIdentity_3x3, true },
7240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadIdentityP12rs_matrix2x2", (void *)&SC_MatrixLoadIdentity_2x2, true },
7250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix4x4PKf", (void *)&SC_MatrixLoad_4x4_f, true },
7270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix3x3PKf", (void *)&SC_MatrixLoad_3x3_f, true },
7280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix2x2PKf", (void *)&SC_MatrixLoad_2x2_f, true },
7290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix4x4PKS_", (void *)&SC_MatrixLoad_4x4_4x4, true },
7310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix3x3", (void *)&SC_MatrixLoad_4x4_3x3, true },
7320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix2x2", (void *)&SC_MatrixLoad_4x4_2x2, true },
7330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix3x3PKS_", (void *)&SC_MatrixLoad_3x3_3x3, true },
7340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z12rsMatrixLoadP12rs_matrix2x2PKS_", (void *)&SC_MatrixLoad_2x2_2x2, true },
7350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z18rsMatrixLoadRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadRotate, true },
7370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z17rsMatrixLoadScaleP12rs_matrix4x4fff", (void *)&SC_MatrixLoadScale, true },
7380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z21rsMatrixLoadTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixLoadTranslate, true },
7390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z14rsMatrixRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixRotate, true },
7400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z13rsMatrixScaleP12rs_matrix4x4fff", (void *)&SC_MatrixScale, true },
7410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z17rsMatrixTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixTranslate, true },
7420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadMultiplyP12rs_matrix4x4PKS_S2_", (void *)&SC_MatrixLoadMultiply_4x4_4x4_4x4, true },
7440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z16rsMatrixMultiplyP12rs_matrix4x4PKS_", (void *)&SC_MatrixMultiply_4x4_4x4, true },
7450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadMultiplyP12rs_matrix3x3PKS_S2_", (void *)&SC_MatrixLoadMultiply_3x3_3x3_3x3, true },
7460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z16rsMatrixMultiplyP12rs_matrix3x3PKS_", (void *)&SC_MatrixMultiply_3x3_3x3, true },
7470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z20rsMatrixLoadMultiplyP12rs_matrix2x2PKS_S2_", (void *)&SC_MatrixLoadMultiply_2x2_2x2_2x2, true },
7480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z16rsMatrixMultiplyP12rs_matrix2x2PKS_", (void *)&SC_MatrixMultiply_2x2_2x2, true },
7490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z17rsMatrixLoadOrthoP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadOrtho, true },
7510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z19rsMatrixLoadFrustumP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadFrustum, true },
7520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z23rsMatrixLoadPerspectiveP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadPerspective, true },
7530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z15rsMatrixInverseP12rs_matrix4x4", (void *)&SC_MatrixInverse_4x4, true },
7550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z24rsMatrixInverseTransposeP12rs_matrix4x4", (void *)&SC_MatrixInverseTranspose_4x4, true },
7560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_4x4, true },
757ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    { "_Z17rsMatrixTransposeP12rs_matrix3x3", (void *)&SC_MatrixTranspose_3x3, true },
758ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    { "_Z17rsMatrixTransposeP12rs_matrix2x2", (void *)&SC_MatrixTranspose_2x2, true },
7590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // RS Math
7610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6rsRandi", (void *)&SC_randi, true },
7620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6rsRandii", (void *)&SC_randi2, true },
7630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6rsRandf", (void *)&SC_randf, true },
7640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6rsRandff", (void *)&SC_randf2, true },
7650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z6rsFracf", (void *)&SC_frac, true },
7660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Atomics
7680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicIncPVi", (void *)&SC_AtomicInc, true },
7690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicIncPVj", (void *)&SC_AtomicInc, true },
7700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicDecPVi", (void *)&SC_AtomicDec, true },
7710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicDecPVj", (void *)&SC_AtomicDec, true },
7720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicAddPVii", (void *)&SC_AtomicAdd, true },
7730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicAddPVjj", (void *)&SC_AtomicAdd, true },
7740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicSubPVii", (void *)&SC_AtomicSub, true },
7750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicSubPVjj", (void *)&SC_AtomicSub, true },
7760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicAndPVii", (void *)&SC_AtomicAnd, true },
7770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicAndPVjj", (void *)&SC_AtomicAnd, true },
7780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z10rsAtomicOrPVii", (void *)&SC_AtomicOr, true },
7790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z10rsAtomicOrPVjj", (void *)&SC_AtomicOr, true },
7800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicXorPVii", (void *)&SC_AtomicXor, true },
7810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicXorPVjj", (void *)&SC_AtomicXor, true },
7820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicMinPVii", (void *)&SC_AtomicMin, true },
7830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicUMin, true },
7840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicMaxPVii", (void *)&SC_AtomicMax, true },
7850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicUMax, true },
7860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicCasPViii", (void *)&SC_AtomicCas, true },
7870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { "_Z11rsAtomicCasPVjjj", (void *)&SC_AtomicCas, true },
7880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    { NULL, NULL, false }
7900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
7910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesconst RsdSymbolTable * rsdLookupSymbolMath(const char *sym) {
7930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const RsdSymbolTable *syms = gSyms;
7940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
7950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    while (syms->mPtr) {
7960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!strcmp(syms->mName, sym)) {
7970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            return syms;
7980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
7990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        syms++;
8000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
8010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return NULL;
8020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
8030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
804