1/*========================== begin_copyright_notice ============================ 2 3Copyright (C) 2017-2021 Intel Corporation 4 5SPDX-License-Identifier: MIT 6 7============================= end_copyright_notice ===========================*/ 8 9#include "../include/BiF_Definitions.cl" 10#include "../../Headers/spirv.h" 11 12 13INLINE 14uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i8, )( char2 x ) 15{ 16 uchar2 temp; 17 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0); 18 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1); 19 return temp; 20} 21 22INLINE 23uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i8, )( char3 x ) 24{ 25 uchar3 temp; 26 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0); 27 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1); 28 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2); 29 return temp; 30} 31 32INLINE 33uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i8, )( char4 x ) 34{ 35 uchar4 temp; 36 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0); 37 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1); 38 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2); 39 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3); 40 return temp; 41} 42 43INLINE 44uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i8, )( char8 x ) 45{ 46 uchar8 temp; 47 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0); 48 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1); 49 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2); 50 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3); 51 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s4); 52 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s5); 53 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s6); 54 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s7); 55 return temp; 56} 57 58INLINE 59uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i8, )( char16 x ) 60{ 61 uchar16 temp; 62 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0); 63 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1); 64 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2); 65 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3); 66 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s4); 67 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s5); 68 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s6); 69 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s7); 70 temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s8); 71 temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s9); 72 temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sa); 73 temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sb); 74 temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sc); 75 temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sd); 76 temp.se = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.se); 77 temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sf); 78 return temp; 79} 80 81INLINE 82uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i8, )( uchar x ) 83{ 84 return x; 85} 86 87INLINE 88uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i8, )( uchar2 x ) 89{ 90 return x; 91} 92 93INLINE 94uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i8, )( uchar3 x ) 95{ 96 return x; 97} 98 99INLINE 100uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i8, )( uchar4 x ) 101{ 102 return x; 103} 104 105INLINE 106uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i8, )( uchar8 x ) 107{ 108 return x; 109} 110 111INLINE 112uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i8, )( uchar16 x ) 113{ 114 return x; 115} 116 117 118 119INLINE 120ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i16, )( short2 x ) 121{ 122 ushort2 temp; 123 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0); 124 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1); 125 return temp; 126} 127 128INLINE 129ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i16, )( short3 x ) 130{ 131 ushort3 temp; 132 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0); 133 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1); 134 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2); 135 return temp; 136} 137 138INLINE 139ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i16, )( short4 x ) 140{ 141 ushort4 temp; 142 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0); 143 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1); 144 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2); 145 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3); 146 return temp; 147} 148 149INLINE 150ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i16, )( short8 x ) 151{ 152 ushort8 temp; 153 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0); 154 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1); 155 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2); 156 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3); 157 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s4); 158 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s5); 159 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s6); 160 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s7); 161 return temp; 162} 163 164INLINE 165ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i16, )( short16 x ) 166{ 167 ushort16 temp; 168 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0); 169 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1); 170 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2); 171 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3); 172 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s4); 173 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s5); 174 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s6); 175 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s7); 176 temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s8); 177 temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s9); 178 temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sa); 179 temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sb); 180 temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sc); 181 temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sd); 182 temp.se = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.se); 183 temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sf); 184 return temp; 185} 186 187INLINE 188ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i16, )( ushort x ) 189{ 190 return x; 191} 192 193INLINE 194ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i16, )( ushort2 x ) 195{ 196 return x; 197} 198 199INLINE 200ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i16, )( ushort3 x ) 201{ 202 return x; 203} 204 205INLINE 206ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i16, )( ushort4 x ) 207{ 208 return x; 209} 210 211INLINE 212ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i16, )( ushort8 x ) 213{ 214 return x; 215} 216 217INLINE 218ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i16, )( ushort16 x ) 219{ 220 return x; 221} 222 223 224 225INLINE 226uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i32, )( int2 x ) 227{ 228 uint2 temp; 229 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0); 230 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1); 231 return temp; 232} 233 234INLINE 235uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i32, )( int3 x ) 236{ 237 uint3 temp; 238 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0); 239 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1); 240 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2); 241 return temp; 242} 243 244INLINE 245uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i32, )( int4 x ) 246{ 247 uint4 temp; 248 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0); 249 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1); 250 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2); 251 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3); 252 return temp; 253} 254 255INLINE 256uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i32, )( int8 x ) 257{ 258 uint8 temp; 259 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0); 260 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1); 261 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2); 262 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3); 263 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s4); 264 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s5); 265 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s6); 266 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s7); 267 return temp; 268} 269 270INLINE 271uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i32, )( int16 x ) 272{ 273 uint16 temp; 274 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0); 275 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1); 276 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2); 277 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3); 278 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s4); 279 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s5); 280 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s6); 281 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s7); 282 temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s8); 283 temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s9); 284 temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sa); 285 temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sb); 286 temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sc); 287 temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sd); 288 temp.se = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.se); 289 temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sf); 290 return temp; 291} 292 293INLINE 294uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i32, )( uint x ) 295{ 296 return x; 297} 298 299INLINE 300uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i32, )( uint2 x ) 301{ 302 return x; 303} 304 305INLINE 306uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i32, )( uint3 x ) 307{ 308 return x; 309} 310 311INLINE 312uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i32, )( uint4 x ) 313{ 314 return x; 315} 316 317INLINE 318uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i32, )( uint8 x ) 319{ 320 return x; 321} 322 323INLINE 324uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i32, )( uint16 x ) 325{ 326 return x; 327} 328 329INLINE 330ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _i64, )( long x ) 331{ 332 // -x would overflow if x = 0x8000000000000000, resulting undefined behavior 333 // -ux would never overflow and is well-defined. 334 // In llvm, -x could be "sub nsw 0, x", where -ux is "sub 0, ux". "nsw" indicates 335 // the result might be undefined. 336 // With this, this function will always return -INT64_MIN for x = INT64_MIN 337 // Note that the standard lib int abs(int) has undefined behavior when x = MIN. 338 ulong ux = (ulong)x; 339 return (ulong)((x >= 0) ? ux : -ux); 340} 341 342INLINE 343ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i64, )( long2 x ) 344{ 345 ulong2 temp; 346 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0); 347 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1); 348 return temp; 349} 350 351INLINE 352ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i64, )( long3 x ) 353{ 354 ulong3 temp; 355 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0); 356 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1); 357 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2); 358 return temp; 359} 360 361INLINE 362ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i64, )( long4 x ) 363{ 364 ulong4 temp; 365 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0); 366 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1); 367 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2); 368 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3); 369 return temp; 370} 371 372INLINE 373ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i64, )( long8 x ) 374{ 375 ulong8 temp; 376 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0); 377 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1); 378 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2); 379 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3); 380 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s4); 381 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s5); 382 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s6); 383 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s7); 384 return temp; 385} 386 387INLINE 388ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i64, )( long16 x ) 389{ 390 ulong16 temp; 391 temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0); 392 temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1); 393 temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2); 394 temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3); 395 temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s4); 396 temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s5); 397 temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s6); 398 temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s7); 399 temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s8); 400 temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s9); 401 temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sa); 402 temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sb); 403 temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sc); 404 temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sd); 405 temp.se = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.se); 406 temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sf); 407 return temp; 408} 409 410INLINE 411ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i64, )( ulong x ) 412{ 413 return x; 414} 415 416INLINE 417ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i64, )( ulong2 x ) 418{ 419 return x; 420} 421 422INLINE 423ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i64, )( ulong3 x ) 424{ 425 return x; 426} 427 428INLINE 429ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i64, )( ulong4 x ) 430{ 431 return x; 432} 433 434INLINE 435ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i64, )( ulong8 x ) 436{ 437 return x; 438} 439 440INLINE 441ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i64, )( ulong16 x ) 442{ 443 return x; 444} 445 446