@@ -9,43 +9,81 @@ SPDX-License-Identifier: MIT
99#include "../include/BiF_Definitions.cl"
1010#include "../../Headers/spirv.h"
1111
12+ // Bitselect can be implemented with the following boolean function:
13+ // s0 & s1 | ~s0 & s2
14+ // where s0 = c, s1 = b, s2 = a
15+ // This maps to boolean function 0xD8.
1216
1317INLINE
1418char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN (bitselect , _i8_i8_i8 , )( char a , char b , char c )
1519{
16- char temp ;
17- temp = (c & b ) | (~c & a );
18- return temp ;
20+ if (BIF_FLAG_CTRL_GET (UseBfn ))
21+ {
22+ return (char ) __builtin_IB_bfn_i16 ((short )as_uchar (c ), (short )as_uchar (b ), (short )as_uchar (a ), 0xD8 );
23+ }
24+ else
25+ {
26+ char temp ;
27+ temp = (c & b ) | (~c & a );
28+ return temp ;
29+ }
1930}
2031
2132GENERATE_SPIRV_OCL_VECTOR_FUNCTIONS_3ARGS ( bitselect , char , char , i8 )
2233
2334INLINE
2435short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN (bitselect , _i16_i16_i16 , )( short a , short b , short c )
2536{
26- short temp ;
27- temp = (c & b ) | (~c & a );
28- return temp ;
37+ if (BIF_FLAG_CTRL_GET (UseBfn ))
38+ {
39+ return __builtin_IB_bfn_i16 (c , b , a , 0xD8 );
40+ }
41+ else
42+ {
43+ short temp ;
44+ temp = (c & b ) | (~c & a );
45+ return temp ;
46+ }
2947}
3048
3149GENERATE_SPIRV_OCL_VECTOR_FUNCTIONS_3ARGS ( bitselect , short , short , i16 )
3250
3351INLINE
3452int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN (bitselect , _i32_i32_i32 , )( int a , int b , int c )
3553{
36- int temp ;
37- temp = (c & b ) | (~c & a );
38- return temp ;
54+ if (BIF_FLAG_CTRL_GET (UseBfn ))
55+ {
56+ return __builtin_IB_bfn_i32 (c , b , a , 0xD8 );
57+ }
58+ else
59+ {
60+ int temp ;
61+ temp = (c & b ) | (~c & a );
62+ return temp ;
63+ }
3964}
4065
4166GENERATE_SPIRV_OCL_VECTOR_FUNCTIONS_3ARGS ( bitselect , int , int , i32 )
4267
4368INLINE
4469long SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN (bitselect , _i64_i64_i64 , )( long a , long b , long c )
4570{
46- long temp ;
47- temp = (c & b ) | (~c & a );
48- return temp ;
71+ if (BIF_FLAG_CTRL_GET (UseBfn ))
72+ {
73+ int2 tmpA = as_int2 (a );
74+ int2 tmpB = as_int2 (b );
75+ int2 tmpC = as_int2 (c );
76+ int2 tmpResult ;
77+ tmpResult .s0 = __builtin_IB_bfn_i32 (tmpC .s0 , tmpB .s0 , tmpA .s0 , 0xD8 );
78+ tmpResult .s1 = __builtin_IB_bfn_i32 (tmpC .s1 , tmpB .s1 , tmpA .s1 , 0xD8 );
79+ return as_long (tmpResult );
80+ }
81+ else
82+ {
83+ long temp ;
84+ temp = (c & b ) | (~c & a );
85+ return temp ;
86+ }
4987}
5088
5189GENERATE_SPIRV_OCL_VECTOR_FUNCTIONS_3ARGS ( bitselect , long , long , i64 )
0 commit comments