13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUVECTORUTIL_HPP 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUVECTORUTIL_HPP 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------- 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Vector utility functions. 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deInt32.h" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <ostream> 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <math.h> 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const float PI = 3.141592653589793238f; 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_WIN32 && DE_COMPILER == DE_COMPILER_CLANG) 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float abs (float f) { return deFloatAbs(f); } 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T add (T a, T b) { return a + b; } 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T sub (T a, T b) { return a - b; } 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T mul (T a, T b) { return a * b; } 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T div (T a, T b) { return a / b; } 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T bitwiseNot (T a) { return ~a; } 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T bitwiseAnd (T a, T b) { return a & b; } 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T bitwiseOr (T a, T b) { return a | b; } 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T bitwiseXor (T a, T b) { return a ^ b; } 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T logicalNot (T a) { return !a; } 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T logicalAnd (T a, T b) { return a && b; } 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T logicalOr (T a, T b) { return a || b; } 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T mod (T a, T b) { return a % b; } 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<> inline float mod (float x, float y) { return x - y * floor(x / y); } 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T negate (T f) { return -f; } 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<> inline deUint32 negate<deUint32> (deUint32 f) { return (deUint32)-(int)f; } 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float radians (float f) { return deFloatRadians(f); } 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float degrees (float f) { return deFloatDegrees(f); } 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float exp2 (float f) { return deFloatExp2(f); } 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float log2 (float f) { return deFloatLog2(f); } 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float inverseSqrt (float f) { return deFloatRsq(f); } 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float sign (float f) { return (f < 0.0f) ? -1.0f : ((f > 0.0f) ? +1.0f : 0.0f); } 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float fract (float f) { return f - deFloatFloor(f); } 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float mix (float x, float y, float a) { return x * (1.0f - a) + y * a; } 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float step (float edge, float x) { return (x < edge) ? 0.0f : 1.0f; } 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float smoothStep (float edge0, float edge1, float x) 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (x <= edge0) return 0.0f; 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (x >= edge1) return 1.0f; 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float t = de::clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return t * t * (3.0f - 2.0f * t); 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryinline double mix (double x, double y, double a) { return x * (1.0 - a) + y * a; } 818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryinline double step (double edge, double x) { return (x < edge) ? 0.0 : 1.0; } 828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float length (float f) { return deFloatAbs(f); } 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float distance (float x, float y) { return deFloatAbs(x - y); } 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float dot (float x, float y) { return (x * y); } 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float normalize (float f) { return sign(f); } 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float faceForward (float n, float i, float ref) { return ((ref * i) < 0.0f) ? n : -n; } 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float reflect (float i, float n) { return i - 2.0f * (n * i) * n; } 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float refract (float i, float n, float eta) 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float cosAngle = (n * i); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float k = 1.0f - eta * eta * (1.0f - cosAngle * cosAngle); 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (k < 0.0f) 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 0.0f; 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return eta * i - (eta * cosAngle + ::sqrt(k)) * n; 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float asinh (float a) { return deFloatAsinh(a); } 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float acosh (float a) { return deFloatAcosh(a); } 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float atanh (float a) { return deFloatAtanh(a); } 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool lessThan (T a, T b) { return (a < b); } 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool lessThanEqual (T a, T b) { return (a <= b); } 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool greaterThan (T a, T b) { return (a > b); } 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool greaterThanEqual (T a, T b) { return (a >= b); } 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool equal (T a, T b) { return (a == b); } 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool notEqual (T a, T b) { return (a != b); } 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool allEqual (T a, T b) { return (a == b); } 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline bool anyNotEqual (T a, T b) { return (a != b); } 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool boolNot (bool a) { return !a; } 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline int chopToInt (float a) { return deChopFloatToInt32(a); } 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float trunc (float a) { return (float)chopToInt(a); } 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float roundToEven (float a) 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float q = deFloatFrac(a); 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float r = a-q; 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (q > 0.5f) 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry r += 1.0f; 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (q == 0.5 && (((int)r) % 2 != 0)) 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry r += 1.0f; 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return r; 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline T dot (const Vector<T, Size>& a, const Vector<T, Size>& b) 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry T res = T(); 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res += a.m_data[i] * b.m_data[i]; 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline T lengthSquared (const Vector<T, Size>& a) 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry T sqSum = T(); 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sqSum += a.m_data[i] * a.m_data[i]; 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return sqSum; 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline T length (const Vector<T, Size>& a) 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return ::sqrt(lengthSquared(a)); 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline T distance (const Vector<T, Size>& a, const Vector<T, Size>& b) 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return length(a - b); 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> cross (const Vector<T, Size>& a, const Vector<T, Size>& b) 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(Size == 3); 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return Vector<T, Size>( 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry a.y() * b.z() - b.y() * a.z(), 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry a.z() * b.x() - b.z() * a.x(), 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry a.x() * b.y() - b.x() * a.y()); 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> normalize (const Vector<T, Size>& a) 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry T ooLen = T(1) / length(a); 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = ooLen * a.m_data[i]; 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> faceForward (const Vector<T, Size>& n, const Vector<T, Size>& i, const Vector<T, Size>& ref) 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return (dot(ref, i) < T(0)) ? n: -n; 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> reflect (const Vector<T, Size>& i, const Vector<T, Size>& n) 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return i - T(2) * dot(n, i) * n; 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> refract (const Vector<T, Size>& i, const Vector<T, Size>& n, T eta) 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry T cosAngle = dot(n, i); 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry T k = T(1) - eta * eta * (T(1) - cosAngle * cosAngle); 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (k < T(0)) 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return Vector<T, Size>(T(0)); 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return i * eta - n * T(eta * cosAngle + ::sqrt(k)); 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <int Size> 2073c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<float, Size> mix (const Vector<float, Size>& x, const Vector<float, Size>& y, float a) 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<float, Size> res; 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = deFloatMix(x.m_data[i], y.m_data[i], a); 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytemplate <int Size> 2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryVector<double, Size> mix (const Vector<double, Size>& x, const Vector<double, Size>& y, double a) 2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Vector<double, Size> res; 2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int i = 0; i < Size; i++) 2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry res.m_data[i] = deMix(x.m_data[i], y.m_data[i], a); 2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return res; 2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Piece-wise compare operators. 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> equal (const Vector<T, Size>& a, const Vector<T, Size>& b) 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] == b.m_data[i]; 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> notEqual (const Vector<T, Size>& a, const Vector<T, Size>& b) 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] != b.m_data[i]; 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> lessThan (const Vector<T, Size>& a, const Vector<T, Size>& b) 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] < b.m_data[i]; 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> lessThanEqual (const Vector<T, Size>& a, const Vector<T, Size>& b) 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] <= b.m_data[i]; 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> greaterThan (const Vector<T, Size>& a, const Vector<T, Size>& b) 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] > b.m_data[i]; 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> greaterThanEqual (const Vector<T, Size>& a, const Vector<T, Size>& b) 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = a.m_data[i] >= b.m_data[i]; 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Equality comparison operators. 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool allEqual (const Vector<T, Size>& a, const Vector<T, Size>& b) 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool res = true; 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res = res && a.m_data[i] == b.m_data[i]; 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool anyNotEqual (const Vector<T, Size>& a, const Vector<T, Size>& b) 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool res = false; 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res = res || a.m_data[i] != b.m_data[i]; 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Boolean built-ins. 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <int Size> 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<bool, Size> boolNot (const Vector<bool, Size>& a) 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<bool, Size> res; 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = !a.m_data[i]; 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <int Size> 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool boolAny (const Vector<bool, Size>& a) 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (a.m_data[i] == true) 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return false; 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <int Size> 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool boolAll (const Vector<bool, Size>& a) 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (a.m_data[i] == false) 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return false; 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <int Size> 3303c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<int, Size> chopToInt (const Vector<float, Size>& v) 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<int, Size> res; 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = chopToInt(v.m_data[i]); 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Vector construction using selection based on boolean vector. 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> select (T trueVal, T falseVal, const Vector<bool, Size>& cond) 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res[i] = cond[i] ? trueVal : falseVal; 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Component-wise selection. 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> select (const Vector<T, Size>& trueVal, const Vector<T, Size>& falseVal, const Vector<bool, Size>& cond) 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res[i] = cond[i] ? trueVal[i] : falseVal[i]; 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Absolute difference (abs(a - b)) 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline Vector<T, Size> absDiff (const Vector<T, Size>& a, const Vector<T, Size>& b) 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < Size; ndx++) 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res[ndx] = (a[ndx] > b[ndx]) ? (a[ndx] - b[ndx]) : (b[ndx] - a[ndx]); 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Macros for component-wise ops. 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define TCU_DECLARE_VECTOR_UNARY_FUNC(FUNC_NAME, OP_NAME) \ 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> \ 3773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<T, Size> FUNC_NAME (const Vector<T, Size>& v) \ 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ \ 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; \ 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) \ 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = OP_NAME(v.m_data[i]); \ 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; \ 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define TCU_DECLARE_VECTOR_BINARY_FUNC(FUNC_NAME, OP_NAME) \ 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> \ 3873c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<T, Size> FUNC_NAME (const Vector<T, Size>& a, const Vector<T, Size>& b) \ 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ \ 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; \ 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) \ 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = OP_NAME(a.m_data[i], b.m_data[i]); \ 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; \ 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define TCU_DECLARE_VECTOR_TERNARY_FUNC(FUNC_NAME, OP_NAME) \ 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> \ 3973c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<T, Size> FUNC_NAME (const Vector<T, Size>& a, const Vector<T, Size>& b, const Vector<T, Size>& c) \ 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ \ 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vector<T, Size> res; \ 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < Size; i++) \ 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res.m_data[i] = OP_NAME(a.m_data[i], b.m_data[i], c.m_data[i]); \ 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; \ 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \todo [2011-07-01 pyry] Add some prefix to vector funcs and remove this hack. 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(min) 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# undef min 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(max) 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# undef max 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(negate, negate) 4143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(bitwiseNot, bitwiseNot) 4153c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(add, add) 4163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(sub, sub) 4173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(mul, mul) 4183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(div, div) 4193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(mod, mod) 4203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseAnd, bitwiseAnd) 4213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseOr, bitwiseOr) 4223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseXor, bitwiseXor) 4233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(logicalNot, logicalNot) 4243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(logicalAnd, logicalAnd) 4253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(logicalOr, logicalOr) 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4273c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(radians, deFloatRadians) 4283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(degrees, deFloatDegrees) 4293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(sin, deFloatSin) 4303c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(cos, deFloatCos) 4313c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(tan, deFloatTan) 4323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(asin, deFloatAsin) 4333c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(acos, deFloatAcos) 4343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(atan, deFloatAtanOver) 4353c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(atan2, deFloatAtan2) 4363c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(sinh, deFloatSinh) 4373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(cosh, deFloatCosh) 4383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(tanh, deFloatTanh) 4393c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(asinh, deFloatAsinh) 4403c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(acosh, deFloatAcosh) 4413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(atanh, deFloatAtanh) 4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(pow, deFloatPow) 4443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(exp, deFloatExp) 4453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(log, deFloatLog) 4463c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(exp2, deFloatExp2) 4473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(log2, deFloatLog2) 4483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(sqrt, deFloatSqrt) 4493c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(inverseSqrt, deFloatRsq) 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4513c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(abs, de::abs) 4523c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(sign, deFloatSign) 4533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(floor, deFloatFloor) 4543c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(trunc, trunc) 4553c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(roundToEven, roundToEven) 4563c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(ceil, deFloatCeil) 4573c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_UNARY_FUNC(fract, deFloatFrac) 4583c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(min, de::min) 4593c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(max, de::max) 4603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_TERNARY_FUNC(clamp, de::clamp) 4613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_TERNARY_FUNC(mix, deFloatMix) 4623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_BINARY_FUNC(step, deFloatStep) 4633c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTCU_DECLARE_VECTOR_TERNARY_FUNC(smoothStep, deFloatSmoothStep) 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUVECTORUTIL_HPP 468