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