15a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
25a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * Copyright (C) 2012 The Android Open Source Project
35a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines *
45a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
55a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * you may not use this file except in compliance with the License.
65a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * You may obtain a copy of the License at
75a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines *
85a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
95a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines *
105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * Unless required by applicable law or agreed to in writing, software
115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * See the License for the specific language governing permissions and
145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * limitations under the License.
155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
18be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet#include "rs_core.rsh"
195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high);
215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) convert_uchar4(short4);
225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) convert_uchar4(float4);
235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) convert_float4(uchar4);
245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) sqrt(float);
255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * CLAMP
285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#define _CLAMP(T) \
305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T __attribute__((overloadable)) clamp(T amount, T low, T high) {             \
315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return amount < low ? low : (amount > high ? high : amount);                    \
325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##2 __attribute__((overloadable)) clamp(T##2 amount, T##2 low, T##2 high) { \
355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##2 r;                                                                         \
365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##3 __attribute__((overloadable)) clamp(T##3 amount, T##3 low, T##3 high) { \
425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##3 r;                                                                         \
435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##4 __attribute__((overloadable)) clamp(T##4 amount, T##4 low, T##4 high) { \
505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##4 r;                                                                         \
515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);       \
555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##2 __attribute__((overloadable)) clamp(T##2 amount, T low, T high) {       \
595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##2 r;                                                                         \
605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##3 __attribute__((overloadable)) clamp(T##3 amount, T low, T high) {       \
665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##3 r;                                                                         \
675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}                                                                                   \
725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                                    \
735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern T##4 __attribute__((overloadable)) clamp(T##4 amount, T low, T high) {       \
745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    T##4 r;                                                                         \
755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);               \
795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;                                                                       \
805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
82f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#if !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
83a673fb0db28eac2300fcfa04549138c1c9202014Stephen Hines// These functions must be defined here if we are not using the SSE
84a673fb0db28eac2300fcfa04549138c1c9202014Stephen Hines// implementation, which includes when we are built as part of the
85f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// debug runtime (libclcore_debug.bc) or compiling with debug info.
86146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines
875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(float);
88146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines
89146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines#else
90146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines
91146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float __attribute__((overloadable)) clamp(float amount, float low, float high);
92146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high);
93146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high);
94146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high);
95146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high);
96146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high);
97146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hinesextern float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high);
98146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines
99f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#endif // !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
100146e138f5c6eb4980ee6d85d33b951b87b6e8efeStephen Hines
1012173a9968276b2b91b7ed3d0a76d9e642710843bPirama Arumuga Nainar_CLAMP(half);
1025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(double);
1035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(char);
1045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(uchar);
1055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(short);
1065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(ushort);
1075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(int);
1085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(uint);
1095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(long);
1105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines_CLAMP(ulong);
1115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#undef _CLAMP
1135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
1155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * FMAX
1165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
1175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) fmax(float v1, float v2) {
1195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
1205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) fmax(float2 v1, float2 v2) {
1235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float2 r;
1245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
1255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
1265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) fmax(float3 v1, float3 v2) {
1305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 r;
1315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
1325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
1335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
1345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) fmax(float4 v1, float4 v2) {
1385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 r;
1395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
1405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
1415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
1425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
1435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) fmax(float2 v1, float v2) {
1475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float2 r;
1485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2 ? v1.x : v2;
1495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2 ? v1.y : v2;
1505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) fmax(float3 v1, float v2) {
1545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 r;
1555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2 ? v1.x : v2;
1565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2 ? v1.y : v2;
1575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2 ? v1.z : v2;
1585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) fmax(float4 v1, float v2) {
1625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 r;
1635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2 ? v1.x : v2;
1645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2 ? v1.y : v2;
1655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2 ? v1.z : v2;
1665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2 ? v1.w : v2;
1675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) fmin(float v1, float v2) {
1715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
1725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
1765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * FMIN
1775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
1785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) fmin(float2 v1, float2 v2) {
1795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float2 r;
1805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
1815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
1825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) fmin(float3 v1, float3 v2) {
1865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 r;
1875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
1885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
1895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
1905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
1915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) fmin(float4 v1, float4 v2) {
1945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 r;
1955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
1965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
1975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
1985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
1995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) fmin(float2 v1, float v2) {
2035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float2 r;
2045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2 ? v1.x : v2;
2055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2 ? v1.y : v2;
2065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) fmin(float3 v1, float v2) {
2105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 r;
2115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2 ? v1.x : v2;
2125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2 ? v1.y : v2;
2135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2 ? v1.z : v2;
2145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) fmin(float4 v1, float v2) {
2185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 r;
2195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2 ? v1.x : v2;
2205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2 ? v1.y : v2;
2215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2 ? v1.z : v2;
2225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2 ? v1.w : v2;
2235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
2285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * MAX
2295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
2305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char __attribute__((overloadable)) max(char v1, char v2) {
2325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
2335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char2 __attribute__((overloadable)) max(char2 v1, char2 v2) {
2365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char2 r;
2375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char3 __attribute__((overloadable)) max(char3 v1, char3 v2) {
2435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char3 r;
2445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
2475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char4 __attribute__((overloadable)) max(char4 v1, char4 v2) {
2515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char4 r;
2525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
2555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
2565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short __attribute__((overloadable)) max(short v1, short v2) {
2605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
2615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short2 __attribute__((overloadable)) max(short2 v1, short2 v2) {
2645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short2 r;
2655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short3 __attribute__((overloadable)) max(short3 v1, short3 v2) {
2715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short3 r;
2725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
2755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short4 __attribute__((overloadable)) max(short4 v1, short4 v2) {
2795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short4 r;
2805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
2835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
2845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int __attribute__((overloadable)) max(int v1, int v2) {
2885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
2895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int2 __attribute__((overloadable)) max(int2 v1, int2 v2) {
2925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int2 r;
2935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
2945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
2955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
2965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int3 __attribute__((overloadable)) max(int3 v1, int3 v2) {
2995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int3 r;
3005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int4 __attribute__((overloadable)) max(int4 v1, int4 v2) {
3075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int4 r;
3085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
3125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar __attribute__((overloadable)) max(uchar v1, uchar v2) {
3165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
3175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar2 __attribute__((overloadable)) max(uchar2 v1, uchar2 v2) {
3205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar2 r;
3215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar3 __attribute__((overloadable)) max(uchar3 v1, uchar3 v2) {
3275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar3 r;
3285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) max(uchar4 v1, uchar4 v2) {
3355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 r;
3365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
3405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort __attribute__((overloadable)) max(ushort v1, ushort v2) {
3445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
3455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort2 __attribute__((overloadable)) max(ushort2 v1, ushort2 v2) {
3485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort2 r;
3495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort3 __attribute__((overloadable)) max(ushort3 v1, ushort3 v2) {
3555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort3 r;
3565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort4 __attribute__((overloadable)) max(ushort4 v1, ushort4 v2) {
3635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort4 r;
3645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
3685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint __attribute__((overloadable)) max(uint v1, uint v2) {
3725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 > v2 ? v1 : v2;
3735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint2 __attribute__((overloadable)) max(uint2 v1, uint2 v2) {
3765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint2 r;
3775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint3 __attribute__((overloadable)) max(uint3 v1, uint3 v2) {
3835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint3 r;
3845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint4 __attribute__((overloadable)) max(uint4 v1, uint4 v2) {
3915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint4 r;
3925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x > v2.x ? v1.x : v2.x;
3935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y > v2.y ? v1.y : v2.y;
3945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z > v2.z ? v1.z : v2.z;
3955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w > v2.w ? v1.w : v2.w;
3965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
3975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) max(float v1, float v2) {
4005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) max(float2 v1, float2 v2) {
4045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) max(float2 v1, float v2) {
4085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) max(float3 v1, float3 v2) {
4125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) max(float3 v1, float v2) {
4165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) max(float4 v1, float4 v2) {
4205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) max(float4 v1, float v2) {
4245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmax(v1, v2);
4255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
4295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * MIN
4305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
4315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int8_t __attribute__((overloadable)) min(int8_t v1, int8_t v2) {
4335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
4345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char2 __attribute__((overloadable)) min(char2 v1, char2 v2) {
4375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char2 r;
4385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char3 __attribute__((overloadable)) min(char3 v1, char3 v2) {
4445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char3 r;
4455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
4485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern char4 __attribute__((overloadable)) min(char4 v1, char4 v2) {
4525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    char4 r;
4535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
4565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
4575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int16_t __attribute__((overloadable)) min(int16_t v1, int16_t v2) {
4615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
4625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short2 __attribute__((overloadable)) min(short2 v1, short2 v2) {
4655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short2 r;
4665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short3 __attribute__((overloadable)) min(short3 v1, short3 v2) {
4725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short3 r;
4735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
4765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern short4 __attribute__((overloadable)) min(short4 v1, short4 v2) {
4805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short4 r;
4815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
4845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
4855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int32_t __attribute__((overloadable)) min(int32_t v1, int32_t v2) {
4895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
4905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int2 __attribute__((overloadable)) min(int2 v1, int2 v2) {
4935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int2 r;
4945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
4955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
4965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
4975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
4995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int3 __attribute__((overloadable)) min(int3 v1, int3 v2) {
5005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int3 r;
5015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern int4 __attribute__((overloadable)) min(int4 v1, int4 v2) {
5085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    int4 r;
5095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
5135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar __attribute__((overloadable)) min(uchar v1, uchar v2) {
5175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
5185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar2 __attribute__((overloadable)) min(uchar2 v1, uchar2 v2) {
5215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar2 r;
5225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar3 __attribute__((overloadable)) min(uchar3 v1, uchar3 v2) {
5285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar3 r;
5295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) min(uchar4 v1, uchar4 v2) {
5365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 r;
5375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
5415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort __attribute__((overloadable)) min(ushort v1, ushort v2) {
5455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
5465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort2 __attribute__((overloadable)) min(ushort2 v1, ushort2 v2) {
5495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort2 r;
5505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort3 __attribute__((overloadable)) min(ushort3 v1, ushort3 v2) {
5565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort3 r;
5575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern ushort4 __attribute__((overloadable)) min(ushort4 v1, ushort4 v2) {
5645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ushort4 r;
5655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
5695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint __attribute__((overloadable)) min(uint v1, uint v2) {
5735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return v1 < v2 ? v1 : v2;
5745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint2 __attribute__((overloadable)) min(uint2 v1, uint2 v2) {
5775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint2 r;
5785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint3 __attribute__((overloadable)) min(uint3 v1, uint3 v2) {
5845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint3 r;
5855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
5915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint4 __attribute__((overloadable)) min(uint4 v1, uint4 v2) {
5925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uint4 r;
5935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = v1.x < v2.x ? v1.x : v2.x;
5945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = v1.y < v2.y ? v1.y : v2.y;
5955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = v1.z < v2.z ? v1.z : v2.z;
5965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = v1.w < v2.w ? v1.w : v2.w;
5975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
5985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
5995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) min(float v1, float v2) {
6015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) min(float2 v1, float2 v2) {
6055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) min(float2 v1, float v2) {
6095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) min(float3 v1, float3 v2) {
6135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) min(float3 v1, float v2) {
6175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) min(float4 v1, float4 v2) {
6215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) min(float4 v1, float v2) {
6255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return fmin(v1, v2);
6265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
6295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * YUV
6305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
6315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v) {
6335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short Y = ((short)y) - 16;
6345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short U = ((short)u) - 128;
6355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short V = ((short)v) - 128;
6365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    short4 p;
6385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.r = (Y * 298 + V * 409 + 128) >> 8;
6395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.g = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
6405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.b = (Y * 298 + U * 516 + 128) >> 8;
6415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.a = 255;
6425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.r = rsClamp(p.r, (short)0, (short)255);
6435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.g = rsClamp(p.g, (short)0, (short)255);
6445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    p.b = rsClamp(p.b, (short)0, (short)255);
6455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return convert_uchar4(p);
6475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
6505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * half_RECIP
6515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
6525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) half_recip(float2 v) {
654ba92a7085bbb8916334a6571ff33355873883173Jason Sams    return ((float2) 1.f) / v;
6555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) half_recip(float3 v) {
658ba92a7085bbb8916334a6571ff33355873883173Jason Sams    return ((float3) 1.f) / v;
6595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) half_recip(float4 v) {
662ba92a7085bbb8916334a6571ff33355873883173Jason Sams    return ((float4) 1.f) / v;
6635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/*
6685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * half_rsqrt
6695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
6705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float __attribute__((overloadable)) half_rsqrt(float v) {
6725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return 1.f / sqrt(v);
6735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float2 __attribute__((overloadable)) half_rsqrt(float2 v) {
6765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float2 r;
6775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = half_rsqrt(v.x);
6785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = half_rsqrt(v.y);
6795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
6805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable)) half_rsqrt(float3 v) {
6835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 r;
6845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = half_rsqrt(v.x);
6855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = half_rsqrt(v.y);
6865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = half_rsqrt(v.z);
6875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
6885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable)) half_rsqrt(float4 v) {
6915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 r;
6925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.x = half_rsqrt(v.x);
6935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.y = half_rsqrt(v.y);
6945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.z = half_rsqrt(v.z);
6955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    r.w = half_rsqrt(v.w);
6965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return r;
6975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
6985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
6995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/**
7005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * matrix ops
7015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
7025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable))
7045a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesrsMatrixMultiply(const rs_matrix4x4 *m, float4 in) {
7055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 ret;
7065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w);
7075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w);
7085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w);
7095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w);
7105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return ret;
7115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable))
7145a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesrsMatrixMultiply(const rs_matrix4x4 *m, float3 in) {
7155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 ret;
7165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
7175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
7185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
7195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
7205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return ret;
7215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float4 __attribute__((overloadable))
7245a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesrsMatrixMultiply(const rs_matrix4x4 *m, float2 in) {
7255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float4 ret;
7265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12];
7275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13];
7285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14];
7295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15];
7305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return ret;
7315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable))
7345a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesrsMatrixMultiply(const rs_matrix3x3 *m, float3 in) {
7355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 ret;
7365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z);
7375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z);
7385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z);
7395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return ret;
7405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern float3 __attribute__((overloadable))
7435a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesrsMatrixMultiply(const rs_matrix3x3 *m, float2 in) {
7445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    float3 ret;
7455a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y);
7465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y);
7475a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y);
7485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return ret;
7495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines/**
7525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines * Pixel Ops
7535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines */
7545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
7555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines{
7565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 c;
7575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.x = (uchar)clamp((r * 255.f + 0.5f), 0.f, 255.f);
7585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.y = (uchar)clamp((g * 255.f + 0.5f), 0.f, 255.f);
7595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.z = (uchar)clamp((b * 255.f + 0.5f), 0.f, 255.f);
7605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.w = 255;
7615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return c;
7625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
7655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines{
7665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 c;
7675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.x = (uchar)clamp((r * 255.f + 0.5f), 0.f, 255.f);
7685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.y = (uchar)clamp((g * 255.f + 0.5f), 0.f, 255.f);
7695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.z = (uchar)clamp((b * 255.f + 0.5f), 0.f, 255.f);
7705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    c.w = (uchar)clamp((a * 255.f + 0.5f), 0.f, 255.f);
7715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return c;
7725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
7755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines{
7765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color *= 255.f;
7775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color += 0.5f;
7785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color = clamp(color, 0.f, 255.f);
7795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 c = {color.x, color.y, color.z, 255};
7805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return c;
7815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
7825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
7835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
7845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines{
7855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color *= 255.f;
7865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color += 0.5f;
7875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    color = clamp(color, 0.f, 255.f);
7885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    uchar4 c = {color.x, color.y, color.z, color.w};
7895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return c;
7905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
791