1 /*===---- __clang_cuda_device_functions.h - CUDA runtime support -----------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===-----------------------------------------------------------------------=== 8 */ 9 10 #ifndef __CLANG_CUDA_DEVICE_FUNCTIONS_H__ 11 #define __CLANG_CUDA_DEVICE_FUNCTIONS_H__ 12 13 #ifndef __OPENMP_NVPTX__ 14 #if CUDA_VERSION < 9000 15 #error This file is intended to be used with CUDA-9+ only. 16 #endif 17 #endif 18 19 // __DEVICE__ is a helper macro with common set of attributes for the wrappers 20 // we implement in this file. We need static in order to avoid emitting unused 21 // functions and __forceinline__ helps inlining these wrappers at -O1. 22 #pragma push_macro("__DEVICE__") 23 #ifdef __OPENMP_NVPTX__ 24 #define __DEVICE__ static __attribute__((always_inline, nothrow)) 25 #else 26 #define __DEVICE__ static __device__ __forceinline__ 27 #endif 28 29 __DEVICE__ int __all(int __a) { return __nvvm_vote_all(__a); } 30 __DEVICE__ int __any(int __a) { return __nvvm_vote_any(__a); } 31 __DEVICE__ unsigned int __ballot(int __a) { return __nvvm_vote_ballot(__a); } 32 __DEVICE__ unsigned int __brev(unsigned int __a) { return __nv_brev(__a); } 33 __DEVICE__ unsigned long long __brevll(unsigned long long __a) { 34 return __nv_brevll(__a); 35 } 36 #if defined(__cplusplus) 37 __DEVICE__ void __brkpt() { __asm__ __volatile__("brkpt;"); } 38 __DEVICE__ void __brkpt(int __a) { __brkpt(); } 39 #else 40 __DEVICE__ void __attribute__((overloadable)) __brkpt(void) { 41 __asm__ __volatile__("brkpt;"); 42 } 43 __DEVICE__ void __attribute__((overloadable)) __brkpt(int __a) { __brkpt(); } 44 #endif 45 __DEVICE__ unsigned int __byte_perm(unsigned int __a, unsigned int __b, 46 unsigned int __c) { 47 return __nv_byte_perm(__a, __b, __c); 48 } 49 __DEVICE__ int __clz(int __a) { return __nv_clz(__a); } 50 __DEVICE__ int __clzll(long long __a) { return __nv_clzll(__a); } 51 __DEVICE__ float __cosf(float __a) { return __nv_fast_cosf(__a); } 52 __DEVICE__ double __dAtomicAdd(double *__p, double __v) { 53 return __nvvm_atom_add_gen_d(__p, __v); 54 } 55 __DEVICE__ double __dAtomicAdd_block(double *__p, double __v) { 56 return __nvvm_atom_cta_add_gen_d(__p, __v); 57 } 58 __DEVICE__ double __dAtomicAdd_system(double *__p, double __v) { 59 return __nvvm_atom_sys_add_gen_d(__p, __v); 60 } 61 __DEVICE__ double __dadd_rd(double __a, double __b) { 62 return __nv_dadd_rd(__a, __b); 63 } 64 __DEVICE__ double __dadd_rn(double __a, double __b) { 65 return __nv_dadd_rn(__a, __b); 66 } 67 __DEVICE__ double __dadd_ru(double __a, double __b) { 68 return __nv_dadd_ru(__a, __b); 69 } 70 __DEVICE__ double __dadd_rz(double __a, double __b) { 71 return __nv_dadd_rz(__a, __b); 72 } 73 __DEVICE__ double __ddiv_rd(double __a, double __b) { 74 return __nv_ddiv_rd(__a, __b); 75 } 76 __DEVICE__ double __ddiv_rn(double __a, double __b) { 77 return __nv_ddiv_rn(__a, __b); 78 } 79 __DEVICE__ double __ddiv_ru(double __a, double __b) { 80 return __nv_ddiv_ru(__a, __b); 81 } 82 __DEVICE__ double __ddiv_rz(double __a, double __b) { 83 return __nv_ddiv_rz(__a, __b); 84 } 85 __DEVICE__ double __dmul_rd(double __a, double __b) { 86 return __nv_dmul_rd(__a, __b); 87 } 88 __DEVICE__ double __dmul_rn(double __a, double __b) { 89 return __nv_dmul_rn(__a, __b); 90 } 91 __DEVICE__ double __dmul_ru(double __a, double __b) { 92 return __nv_dmul_ru(__a, __b); 93 } 94 __DEVICE__ double __dmul_rz(double __a, double __b) { 95 return __nv_dmul_rz(__a, __b); 96 } 97 __DEVICE__ float __double2float_rd(double __a) { 98 return __nv_double2float_rd(__a); 99 } 100 __DEVICE__ float __double2float_rn(double __a) { 101 return __nv_double2float_rn(__a); 102 } 103 __DEVICE__ float __double2float_ru(double __a) { 104 return __nv_double2float_ru(__a); 105 } 106 __DEVICE__ float __double2float_rz(double __a) { 107 return __nv_double2float_rz(__a); 108 } 109 __DEVICE__ int __double2hiint(double __a) { return __nv_double2hiint(__a); } 110 __DEVICE__ int __double2int_rd(double __a) { return __nv_double2int_rd(__a); } 111 __DEVICE__ int __double2int_rn(double __a) { return __nv_double2int_rn(__a); } 112 __DEVICE__ int __double2int_ru(double __a) { return __nv_double2int_ru(__a); } 113 __DEVICE__ int __double2int_rz(double __a) { return __nv_double2int_rz(__a); } 114 __DEVICE__ long long __double2ll_rd(double __a) { 115 return __nv_double2ll_rd(__a); 116 } 117 __DEVICE__ long long __double2ll_rn(double __a) { 118 return __nv_double2ll_rn(__a); 119 } 120 __DEVICE__ long long __double2ll_ru(double __a) { 121 return __nv_double2ll_ru(__a); 122 } 123 __DEVICE__ long long __double2ll_rz(double __a) { 124 return __nv_double2ll_rz(__a); 125 } 126 __DEVICE__ int __double2loint(double __a) { return __nv_double2loint(__a); } 127 __DEVICE__ unsigned int __double2uint_rd(double __a) { 128 return __nv_double2uint_rd(__a); 129 } 130 __DEVICE__ unsigned int __double2uint_rn(double __a) { 131 return __nv_double2uint_rn(__a); 132 } 133 __DEVICE__ unsigned int __double2uint_ru(double __a) { 134 return __nv_double2uint_ru(__a); 135 } 136 __DEVICE__ unsigned int __double2uint_rz(double __a) { 137 return __nv_double2uint_rz(__a); 138 } 139 __DEVICE__ unsigned long long __double2ull_rd(double __a) { 140 return __nv_double2ull_rd(__a); 141 } 142 __DEVICE__ unsigned long long __double2ull_rn(double __a) { 143 return __nv_double2ull_rn(__a); 144 } 145 __DEVICE__ unsigned long long __double2ull_ru(double __a) { 146 return __nv_double2ull_ru(__a); 147 } 148 __DEVICE__ unsigned long long __double2ull_rz(double __a) { 149 return __nv_double2ull_rz(__a); 150 } 151 __DEVICE__ long long __double_as_longlong(double __a) { 152 return __nv_double_as_longlong(__a); 153 } 154 __DEVICE__ double __drcp_rd(double __a) { return __nv_drcp_rd(__a); } 155 __DEVICE__ double __drcp_rn(double __a) { return __nv_drcp_rn(__a); } 156 __DEVICE__ double __drcp_ru(double __a) { return __nv_drcp_ru(__a); } 157 __DEVICE__ double __drcp_rz(double __a) { return __nv_drcp_rz(__a); } 158 __DEVICE__ double __dsqrt_rd(double __a) { return __nv_dsqrt_rd(__a); } 159 __DEVICE__ double __dsqrt_rn(double __a) { return __nv_dsqrt_rn(__a); } 160 __DEVICE__ double __dsqrt_ru(double __a) { return __nv_dsqrt_ru(__a); } 161 __DEVICE__ double __dsqrt_rz(double __a) { return __nv_dsqrt_rz(__a); } 162 __DEVICE__ double __dsub_rd(double __a, double __b) { 163 return __nv_dsub_rd(__a, __b); 164 } 165 __DEVICE__ double __dsub_rn(double __a, double __b) { 166 return __nv_dsub_rn(__a, __b); 167 } 168 __DEVICE__ double __dsub_ru(double __a, double __b) { 169 return __nv_dsub_ru(__a, __b); 170 } 171 __DEVICE__ double __dsub_rz(double __a, double __b) { 172 return __nv_dsub_rz(__a, __b); 173 } 174 __DEVICE__ float __exp10f(float __a) { return __nv_fast_exp10f(__a); } 175 __DEVICE__ float __expf(float __a) { return __nv_fast_expf(__a); } 176 __DEVICE__ float __fAtomicAdd(float *__p, float __v) { 177 return __nvvm_atom_add_gen_f(__p, __v); 178 } 179 __DEVICE__ float __fAtomicAdd_block(float *__p, float __v) { 180 return __nvvm_atom_cta_add_gen_f(__p, __v); 181 } 182 __DEVICE__ float __fAtomicAdd_system(float *__p, float __v) { 183 return __nvvm_atom_sys_add_gen_f(__p, __v); 184 } 185 __DEVICE__ float __fAtomicExch(float *__p, float __v) { 186 return __nv_int_as_float( 187 __nvvm_atom_xchg_gen_i((int *)__p, __nv_float_as_int(__v))); 188 } 189 __DEVICE__ float __fAtomicExch_block(float *__p, float __v) { 190 return __nv_int_as_float( 191 __nvvm_atom_cta_xchg_gen_i((int *)__p, __nv_float_as_int(__v))); 192 } 193 __DEVICE__ float __fAtomicExch_system(float *__p, float __v) { 194 return __nv_int_as_float( 195 __nvvm_atom_sys_xchg_gen_i((int *)__p, __nv_float_as_int(__v))); 196 } 197 __DEVICE__ float __fadd_rd(float __a, float __b) { 198 return __nv_fadd_rd(__a, __b); 199 } 200 __DEVICE__ float __fadd_rn(float __a, float __b) { 201 return __nv_fadd_rn(__a, __b); 202 } 203 __DEVICE__ float __fadd_ru(float __a, float __b) { 204 return __nv_fadd_ru(__a, __b); 205 } 206 __DEVICE__ float __fadd_rz(float __a, float __b) { 207 return __nv_fadd_rz(__a, __b); 208 } 209 __DEVICE__ float __fdiv_rd(float __a, float __b) { 210 return __nv_fdiv_rd(__a, __b); 211 } 212 __DEVICE__ float __fdiv_rn(float __a, float __b) { 213 return __nv_fdiv_rn(__a, __b); 214 } 215 __DEVICE__ float __fdiv_ru(float __a, float __b) { 216 return __nv_fdiv_ru(__a, __b); 217 } 218 __DEVICE__ float __fdiv_rz(float __a, float __b) { 219 return __nv_fdiv_rz(__a, __b); 220 } 221 __DEVICE__ float __fdividef(float __a, float __b) { 222 return __nv_fast_fdividef(__a, __b); 223 } 224 __DEVICE__ int __ffs(int __a) { return __nv_ffs(__a); } 225 __DEVICE__ int __ffsll(long long __a) { return __nv_ffsll(__a); } 226 __DEVICE__ int __finite(double __a) { return __nv_isfinited(__a); } 227 __DEVICE__ int __finitef(float __a) { return __nv_finitef(__a); } 228 #ifdef _MSC_VER 229 __DEVICE__ int __finitel(long double __a); 230 #endif 231 __DEVICE__ int __float2int_rd(float __a) { return __nv_float2int_rd(__a); } 232 __DEVICE__ int __float2int_rn(float __a) { return __nv_float2int_rn(__a); } 233 __DEVICE__ int __float2int_ru(float __a) { return __nv_float2int_ru(__a); } 234 __DEVICE__ int __float2int_rz(float __a) { return __nv_float2int_rz(__a); } 235 __DEVICE__ long long __float2ll_rd(float __a) { return __nv_float2ll_rd(__a); } 236 __DEVICE__ long long __float2ll_rn(float __a) { return __nv_float2ll_rn(__a); } 237 __DEVICE__ long long __float2ll_ru(float __a) { return __nv_float2ll_ru(__a); } 238 __DEVICE__ long long __float2ll_rz(float __a) { return __nv_float2ll_rz(__a); } 239 __DEVICE__ unsigned int __float2uint_rd(float __a) { 240 return __nv_float2uint_rd(__a); 241 } 242 __DEVICE__ unsigned int __float2uint_rn(float __a) { 243 return __nv_float2uint_rn(__a); 244 } 245 __DEVICE__ unsigned int __float2uint_ru(float __a) { 246 return __nv_float2uint_ru(__a); 247 } 248 __DEVICE__ unsigned int __float2uint_rz(float __a) { 249 return __nv_float2uint_rz(__a); 250 } 251 __DEVICE__ unsigned long long __float2ull_rd(float __a) { 252 return __nv_float2ull_rd(__a); 253 } 254 __DEVICE__ unsigned long long __float2ull_rn(float __a) { 255 return __nv_float2ull_rn(__a); 256 } 257 __DEVICE__ unsigned long long __float2ull_ru(float __a) { 258 return __nv_float2ull_ru(__a); 259 } 260 __DEVICE__ unsigned long long __float2ull_rz(float __a) { 261 return __nv_float2ull_rz(__a); 262 } 263 __DEVICE__ int __float_as_int(float __a) { return __nv_float_as_int(__a); } 264 __DEVICE__ unsigned int __float_as_uint(float __a) { 265 return __nv_float_as_uint(__a); 266 } 267 __DEVICE__ double __fma_rd(double __a, double __b, double __c) { 268 return __nv_fma_rd(__a, __b, __c); 269 } 270 __DEVICE__ double __fma_rn(double __a, double __b, double __c) { 271 return __nv_fma_rn(__a, __b, __c); 272 } 273 __DEVICE__ double __fma_ru(double __a, double __b, double __c) { 274 return __nv_fma_ru(__a, __b, __c); 275 } 276 __DEVICE__ double __fma_rz(double __a, double __b, double __c) { 277 return __nv_fma_rz(__a, __b, __c); 278 } 279 __DEVICE__ float __fmaf_ieee_rd(float __a, float __b, float __c) { 280 return __nv_fmaf_ieee_rd(__a, __b, __c); 281 } 282 __DEVICE__ float __fmaf_ieee_rn(float __a, float __b, float __c) { 283 return __nv_fmaf_ieee_rn(__a, __b, __c); 284 } 285 __DEVICE__ float __fmaf_ieee_ru(float __a, float __b, float __c) { 286 return __nv_fmaf_ieee_ru(__a, __b, __c); 287 } 288 __DEVICE__ float __fmaf_ieee_rz(float __a, float __b, float __c) { 289 return __nv_fmaf_ieee_rz(__a, __b, __c); 290 } 291 __DEVICE__ float __fmaf_rd(float __a, float __b, float __c) { 292 return __nv_fmaf_rd(__a, __b, __c); 293 } 294 __DEVICE__ float __fmaf_rn(float __a, float __b, float __c) { 295 return __nv_fmaf_rn(__a, __b, __c); 296 } 297 __DEVICE__ float __fmaf_ru(float __a, float __b, float __c) { 298 return __nv_fmaf_ru(__a, __b, __c); 299 } 300 __DEVICE__ float __fmaf_rz(float __a, float __b, float __c) { 301 return __nv_fmaf_rz(__a, __b, __c); 302 } 303 __DEVICE__ float __fmul_rd(float __a, float __b) { 304 return __nv_fmul_rd(__a, __b); 305 } 306 __DEVICE__ float __fmul_rn(float __a, float __b) { 307 return __nv_fmul_rn(__a, __b); 308 } 309 __DEVICE__ float __fmul_ru(float __a, float __b) { 310 return __nv_fmul_ru(__a, __b); 311 } 312 __DEVICE__ float __fmul_rz(float __a, float __b) { 313 return __nv_fmul_rz(__a, __b); 314 } 315 __DEVICE__ float __frcp_rd(float __a) { return __nv_frcp_rd(__a); } 316 __DEVICE__ float __frcp_rn(float __a) { return __nv_frcp_rn(__a); } 317 __DEVICE__ float __frcp_ru(float __a) { return __nv_frcp_ru(__a); } 318 __DEVICE__ float __frcp_rz(float __a) { return __nv_frcp_rz(__a); } 319 __DEVICE__ float __frsqrt_rn(float __a) { return __nv_frsqrt_rn(__a); } 320 __DEVICE__ float __fsqrt_rd(float __a) { return __nv_fsqrt_rd(__a); } 321 __DEVICE__ float __fsqrt_rn(float __a) { return __nv_fsqrt_rn(__a); } 322 __DEVICE__ float __fsqrt_ru(float __a) { return __nv_fsqrt_ru(__a); } 323 __DEVICE__ float __fsqrt_rz(float __a) { return __nv_fsqrt_rz(__a); } 324 __DEVICE__ float __fsub_rd(float __a, float __b) { 325 return __nv_fsub_rd(__a, __b); 326 } 327 __DEVICE__ float __fsub_rn(float __a, float __b) { 328 return __nv_fsub_rn(__a, __b); 329 } 330 __DEVICE__ float __fsub_ru(float __a, float __b) { 331 return __nv_fsub_ru(__a, __b); 332 } 333 __DEVICE__ float __fsub_rz(float __a, float __b) { 334 return __nv_fsub_rz(__a, __b); 335 } 336 __DEVICE__ int __hadd(int __a, int __b) { return __nv_hadd(__a, __b); } 337 __DEVICE__ double __hiloint2double(int __a, int __b) { 338 return __nv_hiloint2double(__a, __b); 339 } 340 __DEVICE__ int __iAtomicAdd(int *__p, int __v) { 341 return __nvvm_atom_add_gen_i(__p, __v); 342 } 343 __DEVICE__ int __iAtomicAdd_block(int *__p, int __v) { 344 return __nvvm_atom_cta_add_gen_i(__p, __v); 345 } 346 __DEVICE__ int __iAtomicAdd_system(int *__p, int __v) { 347 return __nvvm_atom_sys_add_gen_i(__p, __v); 348 } 349 __DEVICE__ int __iAtomicAnd(int *__p, int __v) { 350 return __nvvm_atom_and_gen_i(__p, __v); 351 } 352 __DEVICE__ int __iAtomicAnd_block(int *__p, int __v) { 353 return __nvvm_atom_cta_and_gen_i(__p, __v); 354 } 355 __DEVICE__ int __iAtomicAnd_system(int *__p, int __v) { 356 return __nvvm_atom_sys_and_gen_i(__p, __v); 357 } 358 __DEVICE__ int __iAtomicCAS(int *__p, int __cmp, int __v) { 359 return __nvvm_atom_cas_gen_i(__p, __cmp, __v); 360 } 361 __DEVICE__ int __iAtomicCAS_block(int *__p, int __cmp, int __v) { 362 return __nvvm_atom_cta_cas_gen_i(__p, __cmp, __v); 363 } 364 __DEVICE__ int __iAtomicCAS_system(int *__p, int __cmp, int __v) { 365 return __nvvm_atom_sys_cas_gen_i(__p, __cmp, __v); 366 } 367 __DEVICE__ int __iAtomicExch(int *__p, int __v) { 368 return __nvvm_atom_xchg_gen_i(__p, __v); 369 } 370 __DEVICE__ int __iAtomicExch_block(int *__p, int __v) { 371 return __nvvm_atom_cta_xchg_gen_i(__p, __v); 372 } 373 __DEVICE__ int __iAtomicExch_system(int *__p, int __v) { 374 return __nvvm_atom_sys_xchg_gen_i(__p, __v); 375 } 376 __DEVICE__ int __iAtomicMax(int *__p, int __v) { 377 return __nvvm_atom_max_gen_i(__p, __v); 378 } 379 __DEVICE__ int __iAtomicMax_block(int *__p, int __v) { 380 return __nvvm_atom_cta_max_gen_i(__p, __v); 381 } 382 __DEVICE__ int __iAtomicMax_system(int *__p, int __v) { 383 return __nvvm_atom_sys_max_gen_i(__p, __v); 384 } 385 __DEVICE__ int __iAtomicMin(int *__p, int __v) { 386 return __nvvm_atom_min_gen_i(__p, __v); 387 } 388 __DEVICE__ int __iAtomicMin_block(int *__p, int __v) { 389 return __nvvm_atom_cta_min_gen_i(__p, __v); 390 } 391 __DEVICE__ int __iAtomicMin_system(int *__p, int __v) { 392 return __nvvm_atom_sys_min_gen_i(__p, __v); 393 } 394 __DEVICE__ int __iAtomicOr(int *__p, int __v) { 395 return __nvvm_atom_or_gen_i(__p, __v); 396 } 397 __DEVICE__ int __iAtomicOr_block(int *__p, int __v) { 398 return __nvvm_atom_cta_or_gen_i(__p, __v); 399 } 400 __DEVICE__ int __iAtomicOr_system(int *__p, int __v) { 401 return __nvvm_atom_sys_or_gen_i(__p, __v); 402 } 403 __DEVICE__ int __iAtomicXor(int *__p, int __v) { 404 return __nvvm_atom_xor_gen_i(__p, __v); 405 } 406 __DEVICE__ int __iAtomicXor_block(int *__p, int __v) { 407 return __nvvm_atom_cta_xor_gen_i(__p, __v); 408 } 409 __DEVICE__ int __iAtomicXor_system(int *__p, int __v) { 410 return __nvvm_atom_sys_xor_gen_i(__p, __v); 411 } 412 __DEVICE__ long long __illAtomicMax(long long *__p, long long __v) { 413 return __nvvm_atom_max_gen_ll(__p, __v); 414 } 415 __DEVICE__ long long __illAtomicMax_block(long long *__p, long long __v) { 416 return __nvvm_atom_cta_max_gen_ll(__p, __v); 417 } 418 __DEVICE__ long long __illAtomicMax_system(long long *__p, long long __v) { 419 return __nvvm_atom_sys_max_gen_ll(__p, __v); 420 } 421 __DEVICE__ long long __illAtomicMin(long long *__p, long long __v) { 422 return __nvvm_atom_min_gen_ll(__p, __v); 423 } 424 __DEVICE__ long long __illAtomicMin_block(long long *__p, long long __v) { 425 return __nvvm_atom_cta_min_gen_ll(__p, __v); 426 } 427 __DEVICE__ long long __illAtomicMin_system(long long *__p, long long __v) { 428 return __nvvm_atom_sys_min_gen_ll(__p, __v); 429 } 430 __DEVICE__ double __int2double_rn(int __a) { return __nv_int2double_rn(__a); } 431 __DEVICE__ float __int2float_rd(int __a) { return __nv_int2float_rd(__a); } 432 __DEVICE__ float __int2float_rn(int __a) { return __nv_int2float_rn(__a); } 433 __DEVICE__ float __int2float_ru(int __a) { return __nv_int2float_ru(__a); } 434 __DEVICE__ float __int2float_rz(int __a) { return __nv_int2float_rz(__a); } 435 __DEVICE__ float __int_as_float(int __a) { return __nv_int_as_float(__a); } 436 __DEVICE__ int __isfinited(double __a) { return __nv_isfinited(__a); } 437 __DEVICE__ int __isinf(double __a) { return __nv_isinfd(__a); } 438 __DEVICE__ int __isinff(float __a) { return __nv_isinff(__a); } 439 #ifdef _MSC_VER 440 __DEVICE__ int __isinfl(long double __a); 441 #endif 442 __DEVICE__ int __isnan(double __a) { return __nv_isnand(__a); } 443 __DEVICE__ int __isnanf(float __a) { return __nv_isnanf(__a); } 444 #ifdef _MSC_VER 445 __DEVICE__ int __isnanl(long double __a); 446 #endif 447 __DEVICE__ double __ll2double_rd(long long __a) { 448 return __nv_ll2double_rd(__a); 449 } 450 __DEVICE__ double __ll2double_rn(long long __a) { 451 return __nv_ll2double_rn(__a); 452 } 453 __DEVICE__ double __ll2double_ru(long long __a) { 454 return __nv_ll2double_ru(__a); 455 } 456 __DEVICE__ double __ll2double_rz(long long __a) { 457 return __nv_ll2double_rz(__a); 458 } 459 __DEVICE__ float __ll2float_rd(long long __a) { return __nv_ll2float_rd(__a); } 460 __DEVICE__ float __ll2float_rn(long long __a) { return __nv_ll2float_rn(__a); } 461 __DEVICE__ float __ll2float_ru(long long __a) { return __nv_ll2float_ru(__a); } 462 __DEVICE__ float __ll2float_rz(long long __a) { return __nv_ll2float_rz(__a); } 463 __DEVICE__ long long __llAtomicAnd(long long *__p, long long __v) { 464 return __nvvm_atom_and_gen_ll(__p, __v); 465 } 466 __DEVICE__ long long __llAtomicAnd_block(long long *__p, long long __v) { 467 return __nvvm_atom_cta_and_gen_ll(__p, __v); 468 } 469 __DEVICE__ long long __llAtomicAnd_system(long long *__p, long long __v) { 470 return __nvvm_atom_sys_and_gen_ll(__p, __v); 471 } 472 __DEVICE__ long long __llAtomicOr(long long *__p, long long __v) { 473 return __nvvm_atom_or_gen_ll(__p, __v); 474 } 475 __DEVICE__ long long __llAtomicOr_block(long long *__p, long long __v) { 476 return __nvvm_atom_cta_or_gen_ll(__p, __v); 477 } 478 __DEVICE__ long long __llAtomicOr_system(long long *__p, long long __v) { 479 return __nvvm_atom_sys_or_gen_ll(__p, __v); 480 } 481 __DEVICE__ long long __llAtomicXor(long long *__p, long long __v) { 482 return __nvvm_atom_xor_gen_ll(__p, __v); 483 } 484 __DEVICE__ long long __llAtomicXor_block(long long *__p, long long __v) { 485 return __nvvm_atom_cta_xor_gen_ll(__p, __v); 486 } 487 __DEVICE__ long long __llAtomicXor_system(long long *__p, long long __v) { 488 return __nvvm_atom_sys_xor_gen_ll(__p, __v); 489 } 490 __DEVICE__ float __log10f(float __a) { return __nv_fast_log10f(__a); } 491 __DEVICE__ float __log2f(float __a) { return __nv_fast_log2f(__a); } 492 __DEVICE__ float __logf(float __a) { return __nv_fast_logf(__a); } 493 __DEVICE__ double __longlong_as_double(long long __a) { 494 return __nv_longlong_as_double(__a); 495 } 496 __DEVICE__ int __mul24(int __a, int __b) { return __nv_mul24(__a, __b); } 497 __DEVICE__ long long __mul64hi(long long __a, long long __b) { 498 return __nv_mul64hi(__a, __b); 499 } 500 __DEVICE__ int __mulhi(int __a, int __b) { return __nv_mulhi(__a, __b); } 501 __DEVICE__ unsigned int __pm0(void) { return __nvvm_read_ptx_sreg_pm0(); } 502 __DEVICE__ unsigned int __pm1(void) { return __nvvm_read_ptx_sreg_pm1(); } 503 __DEVICE__ unsigned int __pm2(void) { return __nvvm_read_ptx_sreg_pm2(); } 504 __DEVICE__ unsigned int __pm3(void) { return __nvvm_read_ptx_sreg_pm3(); } 505 __DEVICE__ int __popc(unsigned int __a) { return __nv_popc(__a); } 506 __DEVICE__ int __popcll(unsigned long long __a) { return __nv_popcll(__a); } 507 __DEVICE__ float __powf(float __a, float __b) { 508 return __nv_fast_powf(__a, __b); 509 } 510 511 // Parameter must have a known integer value. 512 #define __prof_trigger(__a) __asm__ __volatile__("pmevent \t%0;" ::"i"(__a)) 513 __DEVICE__ int __rhadd(int __a, int __b) { return __nv_rhadd(__a, __b); } 514 __DEVICE__ unsigned int __sad(int __a, int __b, unsigned int __c) { 515 return __nv_sad(__a, __b, __c); 516 } 517 __DEVICE__ float __saturatef(float __a) { return __nv_saturatef(__a); } 518 __DEVICE__ int __signbitd(double __a) { return __nv_signbitd(__a); } 519 __DEVICE__ int __signbitf(float __a) { return __nv_signbitf(__a); } 520 __DEVICE__ void __sincosf(float __a, float *__s, float *__c) { 521 return __nv_fast_sincosf(__a, __s, __c); 522 } 523 __DEVICE__ float __sinf(float __a) { return __nv_fast_sinf(__a); } 524 __DEVICE__ int __syncthreads_and(int __a) { return __nvvm_bar0_and(__a); } 525 __DEVICE__ int __syncthreads_count(int __a) { return __nvvm_bar0_popc(__a); } 526 __DEVICE__ int __syncthreads_or(int __a) { return __nvvm_bar0_or(__a); } 527 __DEVICE__ float __tanf(float __a) { return __nv_fast_tanf(__a); } 528 __DEVICE__ void __threadfence(void) { __nvvm_membar_gl(); } 529 __DEVICE__ void __threadfence_block(void) { __nvvm_membar_cta(); }; 530 __DEVICE__ void __threadfence_system(void) { __nvvm_membar_sys(); }; 531 __DEVICE__ void __trap(void) { __asm__ __volatile__("trap;"); } 532 __DEVICE__ unsigned short 533 __usAtomicCAS(unsigned short *__p, unsigned short __cmp, unsigned short __v) { 534 return __nvvm_atom_cas_gen_us(__p, __cmp, __v); 535 } 536 __DEVICE__ unsigned short __usAtomicCAS_block(unsigned short *__p, 537 unsigned short __cmp, 538 unsigned short __v) { 539 return __nvvm_atom_cta_cas_gen_us(__p, __cmp, __v); 540 } 541 __DEVICE__ unsigned short __usAtomicCAS_system(unsigned short *__p, 542 unsigned short __cmp, 543 unsigned short __v) { 544 return __nvvm_atom_sys_cas_gen_us(__p, __cmp, __v); 545 } 546 __DEVICE__ unsigned int __uAtomicAdd(unsigned int *__p, unsigned int __v) { 547 return __nvvm_atom_add_gen_i((int *)__p, __v); 548 } 549 __DEVICE__ unsigned int __uAtomicAdd_block(unsigned int *__p, 550 unsigned int __v) { 551 return __nvvm_atom_cta_add_gen_i((int *)__p, __v); 552 } 553 __DEVICE__ unsigned int __uAtomicAdd_system(unsigned int *__p, 554 unsigned int __v) { 555 return __nvvm_atom_sys_add_gen_i((int *)__p, __v); 556 } 557 __DEVICE__ unsigned int __uAtomicAnd(unsigned int *__p, unsigned int __v) { 558 return __nvvm_atom_and_gen_i((int *)__p, __v); 559 } 560 __DEVICE__ unsigned int __uAtomicAnd_block(unsigned int *__p, 561 unsigned int __v) { 562 return __nvvm_atom_cta_and_gen_i((int *)__p, __v); 563 } 564 __DEVICE__ unsigned int __uAtomicAnd_system(unsigned int *__p, 565 unsigned int __v) { 566 return __nvvm_atom_sys_and_gen_i((int *)__p, __v); 567 } 568 __DEVICE__ unsigned int __uAtomicCAS(unsigned int *__p, unsigned int __cmp, 569 unsigned int __v) { 570 return __nvvm_atom_cas_gen_i((int *)__p, __cmp, __v); 571 } 572 __DEVICE__ unsigned int 573 __uAtomicCAS_block(unsigned int *__p, unsigned int __cmp, unsigned int __v) { 574 return __nvvm_atom_cta_cas_gen_i((int *)__p, __cmp, __v); 575 } 576 __DEVICE__ unsigned int 577 __uAtomicCAS_system(unsigned int *__p, unsigned int __cmp, unsigned int __v) { 578 return __nvvm_atom_sys_cas_gen_i((int *)__p, __cmp, __v); 579 } 580 __DEVICE__ unsigned int __uAtomicDec(unsigned int *__p, unsigned int __v) { 581 return __nvvm_atom_dec_gen_ui(__p, __v); 582 } 583 __DEVICE__ unsigned int __uAtomicDec_block(unsigned int *__p, 584 unsigned int __v) { 585 return __nvvm_atom_cta_dec_gen_ui(__p, __v); 586 } 587 __DEVICE__ unsigned int __uAtomicDec_system(unsigned int *__p, 588 unsigned int __v) { 589 return __nvvm_atom_sys_dec_gen_ui(__p, __v); 590 } 591 __DEVICE__ unsigned int __uAtomicExch(unsigned int *__p, unsigned int __v) { 592 return __nvvm_atom_xchg_gen_i((int *)__p, __v); 593 } 594 __DEVICE__ unsigned int __uAtomicExch_block(unsigned int *__p, 595 unsigned int __v) { 596 return __nvvm_atom_cta_xchg_gen_i((int *)__p, __v); 597 } 598 __DEVICE__ unsigned int __uAtomicExch_system(unsigned int *__p, 599 unsigned int __v) { 600 return __nvvm_atom_sys_xchg_gen_i((int *)__p, __v); 601 } 602 __DEVICE__ unsigned int __uAtomicInc(unsigned int *__p, unsigned int __v) { 603 return __nvvm_atom_inc_gen_ui(__p, __v); 604 } 605 __DEVICE__ unsigned int __uAtomicInc_block(unsigned int *__p, 606 unsigned int __v) { 607 return __nvvm_atom_cta_inc_gen_ui(__p, __v); 608 } 609 __DEVICE__ unsigned int __uAtomicInc_system(unsigned int *__p, 610 unsigned int __v) { 611 return __nvvm_atom_sys_inc_gen_ui(__p, __v); 612 } 613 __DEVICE__ unsigned int __uAtomicMax(unsigned int *__p, unsigned int __v) { 614 return __nvvm_atom_max_gen_ui(__p, __v); 615 } 616 __DEVICE__ unsigned int __uAtomicMax_block(unsigned int *__p, 617 unsigned int __v) { 618 return __nvvm_atom_cta_max_gen_ui(__p, __v); 619 } 620 __DEVICE__ unsigned int __uAtomicMax_system(unsigned int *__p, 621 unsigned int __v) { 622 return __nvvm_atom_sys_max_gen_ui(__p, __v); 623 } 624 __DEVICE__ unsigned int __uAtomicMin(unsigned int *__p, unsigned int __v) { 625 return __nvvm_atom_min_gen_ui(__p, __v); 626 } 627 __DEVICE__ unsigned int __uAtomicMin_block(unsigned int *__p, 628 unsigned int __v) { 629 return __nvvm_atom_cta_min_gen_ui(__p, __v); 630 } 631 __DEVICE__ unsigned int __uAtomicMin_system(unsigned int *__p, 632 unsigned int __v) { 633 return __nvvm_atom_sys_min_gen_ui(__p, __v); 634 } 635 __DEVICE__ unsigned int __uAtomicOr(unsigned int *__p, unsigned int __v) { 636 return __nvvm_atom_or_gen_i((int *)__p, __v); 637 } 638 __DEVICE__ unsigned int __uAtomicOr_block(unsigned int *__p, unsigned int __v) { 639 return __nvvm_atom_cta_or_gen_i((int *)__p, __v); 640 } 641 __DEVICE__ unsigned int __uAtomicOr_system(unsigned int *__p, 642 unsigned int __v) { 643 return __nvvm_atom_sys_or_gen_i((int *)__p, __v); 644 } 645 __DEVICE__ unsigned int __uAtomicXor(unsigned int *__p, unsigned int __v) { 646 return __nvvm_atom_xor_gen_i((int *)__p, __v); 647 } 648 __DEVICE__ unsigned int __uAtomicXor_block(unsigned int *__p, 649 unsigned int __v) { 650 return __nvvm_atom_cta_xor_gen_i((int *)__p, __v); 651 } 652 __DEVICE__ unsigned int __uAtomicXor_system(unsigned int *__p, 653 unsigned int __v) { 654 return __nvvm_atom_sys_xor_gen_i((int *)__p, __v); 655 } 656 __DEVICE__ unsigned int __uhadd(unsigned int __a, unsigned int __b) { 657 return __nv_uhadd(__a, __b); 658 } 659 __DEVICE__ double __uint2double_rn(unsigned int __a) { 660 return __nv_uint2double_rn(__a); 661 } 662 __DEVICE__ float __uint2float_rd(unsigned int __a) { 663 return __nv_uint2float_rd(__a); 664 } 665 __DEVICE__ float __uint2float_rn(unsigned int __a) { 666 return __nv_uint2float_rn(__a); 667 } 668 __DEVICE__ float __uint2float_ru(unsigned int __a) { 669 return __nv_uint2float_ru(__a); 670 } 671 __DEVICE__ float __uint2float_rz(unsigned int __a) { 672 return __nv_uint2float_rz(__a); 673 } 674 __DEVICE__ float __uint_as_float(unsigned int __a) { 675 return __nv_uint_as_float(__a); 676 } // 677 __DEVICE__ double __ull2double_rd(unsigned long long __a) { 678 return __nv_ull2double_rd(__a); 679 } 680 __DEVICE__ double __ull2double_rn(unsigned long long __a) { 681 return __nv_ull2double_rn(__a); 682 } 683 __DEVICE__ double __ull2double_ru(unsigned long long __a) { 684 return __nv_ull2double_ru(__a); 685 } 686 __DEVICE__ double __ull2double_rz(unsigned long long __a) { 687 return __nv_ull2double_rz(__a); 688 } 689 __DEVICE__ float __ull2float_rd(unsigned long long __a) { 690 return __nv_ull2float_rd(__a); 691 } 692 __DEVICE__ float __ull2float_rn(unsigned long long __a) { 693 return __nv_ull2float_rn(__a); 694 } 695 __DEVICE__ float __ull2float_ru(unsigned long long __a) { 696 return __nv_ull2float_ru(__a); 697 } 698 __DEVICE__ float __ull2float_rz(unsigned long long __a) { 699 return __nv_ull2float_rz(__a); 700 } 701 __DEVICE__ unsigned long long __ullAtomicAdd(unsigned long long *__p, 702 unsigned long long __v) { 703 return __nvvm_atom_add_gen_ll((long long *)__p, __v); 704 } 705 __DEVICE__ unsigned long long __ullAtomicAdd_block(unsigned long long *__p, 706 unsigned long long __v) { 707 return __nvvm_atom_cta_add_gen_ll((long long *)__p, __v); 708 } 709 __DEVICE__ unsigned long long __ullAtomicAdd_system(unsigned long long *__p, 710 unsigned long long __v) { 711 return __nvvm_atom_sys_add_gen_ll((long long *)__p, __v); 712 } 713 __DEVICE__ unsigned long long __ullAtomicAnd(unsigned long long *__p, 714 unsigned long long __v) { 715 return __nvvm_atom_and_gen_ll((long long *)__p, __v); 716 } 717 __DEVICE__ unsigned long long __ullAtomicAnd_block(unsigned long long *__p, 718 unsigned long long __v) { 719 return __nvvm_atom_cta_and_gen_ll((long long *)__p, __v); 720 } 721 __DEVICE__ unsigned long long __ullAtomicAnd_system(unsigned long long *__p, 722 unsigned long long __v) { 723 return __nvvm_atom_sys_and_gen_ll((long long *)__p, __v); 724 } 725 __DEVICE__ unsigned long long __ullAtomicCAS(unsigned long long *__p, 726 unsigned long long __cmp, 727 unsigned long long __v) { 728 return __nvvm_atom_cas_gen_ll((long long *)__p, __cmp, __v); 729 } 730 __DEVICE__ unsigned long long __ullAtomicCAS_block(unsigned long long *__p, 731 unsigned long long __cmp, 732 unsigned long long __v) { 733 return __nvvm_atom_cta_cas_gen_ll((long long *)__p, __cmp, __v); 734 } 735 __DEVICE__ unsigned long long __ullAtomicCAS_system(unsigned long long *__p, 736 unsigned long long __cmp, 737 unsigned long long __v) { 738 return __nvvm_atom_sys_cas_gen_ll((long long *)__p, __cmp, __v); 739 } 740 __DEVICE__ unsigned long long __ullAtomicExch(unsigned long long *__p, 741 unsigned long long __v) { 742 return __nvvm_atom_xchg_gen_ll((long long *)__p, __v); 743 } 744 __DEVICE__ unsigned long long __ullAtomicExch_block(unsigned long long *__p, 745 unsigned long long __v) { 746 return __nvvm_atom_cta_xchg_gen_ll((long long *)__p, __v); 747 } 748 __DEVICE__ unsigned long long __ullAtomicExch_system(unsigned long long *__p, 749 unsigned long long __v) { 750 return __nvvm_atom_sys_xchg_gen_ll((long long *)__p, __v); 751 } 752 __DEVICE__ unsigned long long __ullAtomicMax(unsigned long long *__p, 753 unsigned long long __v) { 754 return __nvvm_atom_max_gen_ull(__p, __v); 755 } 756 __DEVICE__ unsigned long long __ullAtomicMax_block(unsigned long long *__p, 757 unsigned long long __v) { 758 return __nvvm_atom_cta_max_gen_ull(__p, __v); 759 } 760 __DEVICE__ unsigned long long __ullAtomicMax_system(unsigned long long *__p, 761 unsigned long long __v) { 762 return __nvvm_atom_sys_max_gen_ull(__p, __v); 763 } 764 __DEVICE__ unsigned long long __ullAtomicMin(unsigned long long *__p, 765 unsigned long long __v) { 766 return __nvvm_atom_min_gen_ull(__p, __v); 767 } 768 __DEVICE__ unsigned long long __ullAtomicMin_block(unsigned long long *__p, 769 unsigned long long __v) { 770 return __nvvm_atom_cta_min_gen_ull(__p, __v); 771 } 772 __DEVICE__ unsigned long long __ullAtomicMin_system(unsigned long long *__p, 773 unsigned long long __v) { 774 return __nvvm_atom_sys_min_gen_ull(__p, __v); 775 } 776 __DEVICE__ unsigned long long __ullAtomicOr(unsigned long long *__p, 777 unsigned long long __v) { 778 return __nvvm_atom_or_gen_ll((long long *)__p, __v); 779 } 780 __DEVICE__ unsigned long long __ullAtomicOr_block(unsigned long long *__p, 781 unsigned long long __v) { 782 return __nvvm_atom_cta_or_gen_ll((long long *)__p, __v); 783 } 784 __DEVICE__ unsigned long long __ullAtomicOr_system(unsigned long long *__p, 785 unsigned long long __v) { 786 return __nvvm_atom_sys_or_gen_ll((long long *)__p, __v); 787 } 788 __DEVICE__ unsigned long long __ullAtomicXor(unsigned long long *__p, 789 unsigned long long __v) { 790 return __nvvm_atom_xor_gen_ll((long long *)__p, __v); 791 } 792 __DEVICE__ unsigned long long __ullAtomicXor_block(unsigned long long *__p, 793 unsigned long long __v) { 794 return __nvvm_atom_cta_xor_gen_ll((long long *)__p, __v); 795 } 796 __DEVICE__ unsigned long long __ullAtomicXor_system(unsigned long long *__p, 797 unsigned long long __v) { 798 return __nvvm_atom_sys_xor_gen_ll((long long *)__p, __v); 799 } 800 __DEVICE__ unsigned int __umul24(unsigned int __a, unsigned int __b) { 801 return __nv_umul24(__a, __b); 802 } 803 __DEVICE__ unsigned long long __umul64hi(unsigned long long __a, 804 unsigned long long __b) { 805 return __nv_umul64hi(__a, __b); 806 } 807 __DEVICE__ unsigned int __umulhi(unsigned int __a, unsigned int __b) { 808 return __nv_umulhi(__a, __b); 809 } 810 __DEVICE__ unsigned int __urhadd(unsigned int __a, unsigned int __b) { 811 return __nv_urhadd(__a, __b); 812 } 813 __DEVICE__ unsigned int __usad(unsigned int __a, unsigned int __b, 814 unsigned int __c) { 815 return __nv_usad(__a, __b, __c); 816 } 817 818 #if CUDA_VERSION >= 9000 && CUDA_VERSION < 9020 819 __DEVICE__ unsigned int __vabs2(unsigned int __a) { return __nv_vabs2(__a); } 820 __DEVICE__ unsigned int __vabs4(unsigned int __a) { return __nv_vabs4(__a); } 821 __DEVICE__ unsigned int __vabsdiffs2(unsigned int __a, unsigned int __b) { 822 return __nv_vabsdiffs2(__a, __b); 823 } 824 __DEVICE__ unsigned int __vabsdiffs4(unsigned int __a, unsigned int __b) { 825 return __nv_vabsdiffs4(__a, __b); 826 } 827 __DEVICE__ unsigned int __vabsdiffu2(unsigned int __a, unsigned int __b) { 828 return __nv_vabsdiffu2(__a, __b); 829 } 830 __DEVICE__ unsigned int __vabsdiffu4(unsigned int __a, unsigned int __b) { 831 return __nv_vabsdiffu4(__a, __b); 832 } 833 __DEVICE__ unsigned int __vabsss2(unsigned int __a) { 834 return __nv_vabsss2(__a); 835 } 836 __DEVICE__ unsigned int __vabsss4(unsigned int __a) { 837 return __nv_vabsss4(__a); 838 } 839 __DEVICE__ unsigned int __vadd2(unsigned int __a, unsigned int __b) { 840 return __nv_vadd2(__a, __b); 841 } 842 __DEVICE__ unsigned int __vadd4(unsigned int __a, unsigned int __b) { 843 return __nv_vadd4(__a, __b); 844 } 845 __DEVICE__ unsigned int __vaddss2(unsigned int __a, unsigned int __b) { 846 return __nv_vaddss2(__a, __b); 847 } 848 __DEVICE__ unsigned int __vaddss4(unsigned int __a, unsigned int __b) { 849 return __nv_vaddss4(__a, __b); 850 } 851 __DEVICE__ unsigned int __vaddus2(unsigned int __a, unsigned int __b) { 852 return __nv_vaddus2(__a, __b); 853 } 854 __DEVICE__ unsigned int __vaddus4(unsigned int __a, unsigned int __b) { 855 return __nv_vaddus4(__a, __b); 856 } 857 __DEVICE__ unsigned int __vavgs2(unsigned int __a, unsigned int __b) { 858 return __nv_vavgs2(__a, __b); 859 } 860 __DEVICE__ unsigned int __vavgs4(unsigned int __a, unsigned int __b) { 861 return __nv_vavgs4(__a, __b); 862 } 863 __DEVICE__ unsigned int __vavgu2(unsigned int __a, unsigned int __b) { 864 return __nv_vavgu2(__a, __b); 865 } 866 __DEVICE__ unsigned int __vavgu4(unsigned int __a, unsigned int __b) { 867 return __nv_vavgu4(__a, __b); 868 } 869 __DEVICE__ unsigned int __vcmpeq2(unsigned int __a, unsigned int __b) { 870 return __nv_vcmpeq2(__a, __b); 871 } 872 __DEVICE__ unsigned int __vcmpeq4(unsigned int __a, unsigned int __b) { 873 return __nv_vcmpeq4(__a, __b); 874 } 875 __DEVICE__ unsigned int __vcmpges2(unsigned int __a, unsigned int __b) { 876 return __nv_vcmpges2(__a, __b); 877 } 878 __DEVICE__ unsigned int __vcmpges4(unsigned int __a, unsigned int __b) { 879 return __nv_vcmpges4(__a, __b); 880 } 881 __DEVICE__ unsigned int __vcmpgeu2(unsigned int __a, unsigned int __b) { 882 return __nv_vcmpgeu2(__a, __b); 883 } 884 __DEVICE__ unsigned int __vcmpgeu4(unsigned int __a, unsigned int __b) { 885 return __nv_vcmpgeu4(__a, __b); 886 } 887 __DEVICE__ unsigned int __vcmpgts2(unsigned int __a, unsigned int __b) { 888 return __nv_vcmpgts2(__a, __b); 889 } 890 __DEVICE__ unsigned int __vcmpgts4(unsigned int __a, unsigned int __b) { 891 return __nv_vcmpgts4(__a, __b); 892 } 893 __DEVICE__ unsigned int __vcmpgtu2(unsigned int __a, unsigned int __b) { 894 return __nv_vcmpgtu2(__a, __b); 895 } 896 __DEVICE__ unsigned int __vcmpgtu4(unsigned int __a, unsigned int __b) { 897 return __nv_vcmpgtu4(__a, __b); 898 } 899 __DEVICE__ unsigned int __vcmples2(unsigned int __a, unsigned int __b) { 900 return __nv_vcmples2(__a, __b); 901 } 902 __DEVICE__ unsigned int __vcmples4(unsigned int __a, unsigned int __b) { 903 return __nv_vcmples4(__a, __b); 904 } 905 __DEVICE__ unsigned int __vcmpleu2(unsigned int __a, unsigned int __b) { 906 return __nv_vcmpleu2(__a, __b); 907 } 908 __DEVICE__ unsigned int __vcmpleu4(unsigned int __a, unsigned int __b) { 909 return __nv_vcmpleu4(__a, __b); 910 } 911 __DEVICE__ unsigned int __vcmplts2(unsigned int __a, unsigned int __b) { 912 return __nv_vcmplts2(__a, __b); 913 } 914 __DEVICE__ unsigned int __vcmplts4(unsigned int __a, unsigned int __b) { 915 return __nv_vcmplts4(__a, __b); 916 } 917 __DEVICE__ unsigned int __vcmpltu2(unsigned int __a, unsigned int __b) { 918 return __nv_vcmpltu2(__a, __b); 919 } 920 __DEVICE__ unsigned int __vcmpltu4(unsigned int __a, unsigned int __b) { 921 return __nv_vcmpltu4(__a, __b); 922 } 923 __DEVICE__ unsigned int __vcmpne2(unsigned int __a, unsigned int __b) { 924 return __nv_vcmpne2(__a, __b); 925 } 926 __DEVICE__ unsigned int __vcmpne4(unsigned int __a, unsigned int __b) { 927 return __nv_vcmpne4(__a, __b); 928 } 929 __DEVICE__ unsigned int __vhaddu2(unsigned int __a, unsigned int __b) { 930 return __nv_vhaddu2(__a, __b); 931 } 932 __DEVICE__ unsigned int __vhaddu4(unsigned int __a, unsigned int __b) { 933 return __nv_vhaddu4(__a, __b); 934 } 935 __DEVICE__ unsigned int __vmaxs2(unsigned int __a, unsigned int __b) { 936 return __nv_vmaxs2(__a, __b); 937 } 938 __DEVICE__ unsigned int __vmaxs4(unsigned int __a, unsigned int __b) { 939 return __nv_vmaxs4(__a, __b); 940 } 941 __DEVICE__ unsigned int __vmaxu2(unsigned int __a, unsigned int __b) { 942 return __nv_vmaxu2(__a, __b); 943 } 944 __DEVICE__ unsigned int __vmaxu4(unsigned int __a, unsigned int __b) { 945 return __nv_vmaxu4(__a, __b); 946 } 947 __DEVICE__ unsigned int __vmins2(unsigned int __a, unsigned int __b) { 948 return __nv_vmins2(__a, __b); 949 } 950 __DEVICE__ unsigned int __vmins4(unsigned int __a, unsigned int __b) { 951 return __nv_vmins4(__a, __b); 952 } 953 __DEVICE__ unsigned int __vminu2(unsigned int __a, unsigned int __b) { 954 return __nv_vminu2(__a, __b); 955 } 956 __DEVICE__ unsigned int __vminu4(unsigned int __a, unsigned int __b) { 957 return __nv_vminu4(__a, __b); 958 } 959 __DEVICE__ unsigned int __vneg2(unsigned int __a) { return __nv_vneg2(__a); } 960 __DEVICE__ unsigned int __vneg4(unsigned int __a) { return __nv_vneg4(__a); } 961 __DEVICE__ unsigned int __vnegss2(unsigned int __a) { 962 return __nv_vnegss2(__a); 963 } 964 __DEVICE__ unsigned int __vnegss4(unsigned int __a) { 965 return __nv_vnegss4(__a); 966 } 967 __DEVICE__ unsigned int __vsads2(unsigned int __a, unsigned int __b) { 968 return __nv_vsads2(__a, __b); 969 } 970 __DEVICE__ unsigned int __vsads4(unsigned int __a, unsigned int __b) { 971 return __nv_vsads4(__a, __b); 972 } 973 __DEVICE__ unsigned int __vsadu2(unsigned int __a, unsigned int __b) { 974 return __nv_vsadu2(__a, __b); 975 } 976 __DEVICE__ unsigned int __vsadu4(unsigned int __a, unsigned int __b) { 977 return __nv_vsadu4(__a, __b); 978 } 979 __DEVICE__ unsigned int __vseteq2(unsigned int __a, unsigned int __b) { 980 return __nv_vseteq2(__a, __b); 981 } 982 __DEVICE__ unsigned int __vseteq4(unsigned int __a, unsigned int __b) { 983 return __nv_vseteq4(__a, __b); 984 } 985 __DEVICE__ unsigned int __vsetges2(unsigned int __a, unsigned int __b) { 986 return __nv_vsetges2(__a, __b); 987 } 988 __DEVICE__ unsigned int __vsetges4(unsigned int __a, unsigned int __b) { 989 return __nv_vsetges4(__a, __b); 990 } 991 __DEVICE__ unsigned int __vsetgeu2(unsigned int __a, unsigned int __b) { 992 return __nv_vsetgeu2(__a, __b); 993 } 994 __DEVICE__ unsigned int __vsetgeu4(unsigned int __a, unsigned int __b) { 995 return __nv_vsetgeu4(__a, __b); 996 } 997 __DEVICE__ unsigned int __vsetgts2(unsigned int __a, unsigned int __b) { 998 return __nv_vsetgts2(__a, __b); 999 } 1000 __DEVICE__ unsigned int __vsetgts4(unsigned int __a, unsigned int __b) { 1001 return __nv_vsetgts4(__a, __b); 1002 } 1003 __DEVICE__ unsigned int __vsetgtu2(unsigned int __a, unsigned int __b) { 1004 return __nv_vsetgtu2(__a, __b); 1005 } 1006 __DEVICE__ unsigned int __vsetgtu4(unsigned int __a, unsigned int __b) { 1007 return __nv_vsetgtu4(__a, __b); 1008 } 1009 __DEVICE__ unsigned int __vsetles2(unsigned int __a, unsigned int __b) { 1010 return __nv_vsetles2(__a, __b); 1011 } 1012 __DEVICE__ unsigned int __vsetles4(unsigned int __a, unsigned int __b) { 1013 return __nv_vsetles4(__a, __b); 1014 } 1015 __DEVICE__ unsigned int __vsetleu2(unsigned int __a, unsigned int __b) { 1016 return __nv_vsetleu2(__a, __b); 1017 } 1018 __DEVICE__ unsigned int __vsetleu4(unsigned int __a, unsigned int __b) { 1019 return __nv_vsetleu4(__a, __b); 1020 } 1021 __DEVICE__ unsigned int __vsetlts2(unsigned int __a, unsigned int __b) { 1022 return __nv_vsetlts2(__a, __b); 1023 } 1024 __DEVICE__ unsigned int __vsetlts4(unsigned int __a, unsigned int __b) { 1025 return __nv_vsetlts4(__a, __b); 1026 } 1027 __DEVICE__ unsigned int __vsetltu2(unsigned int __a, unsigned int __b) { 1028 return __nv_vsetltu2(__a, __b); 1029 } 1030 __DEVICE__ unsigned int __vsetltu4(unsigned int __a, unsigned int __b) { 1031 return __nv_vsetltu4(__a, __b); 1032 } 1033 __DEVICE__ unsigned int __vsetne2(unsigned int __a, unsigned int __b) { 1034 return __nv_vsetne2(__a, __b); 1035 } 1036 __DEVICE__ unsigned int __vsetne4(unsigned int __a, unsigned int __b) { 1037 return __nv_vsetne4(__a, __b); 1038 } 1039 __DEVICE__ unsigned int __vsub2(unsigned int __a, unsigned int __b) { 1040 return __nv_vsub2(__a, __b); 1041 } 1042 __DEVICE__ unsigned int __vsub4(unsigned int __a, unsigned int __b) { 1043 return __nv_vsub4(__a, __b); 1044 } 1045 __DEVICE__ unsigned int __vsubss2(unsigned int __a, unsigned int __b) { 1046 return __nv_vsubss2(__a, __b); 1047 } 1048 __DEVICE__ unsigned int __vsubss4(unsigned int __a, unsigned int __b) { 1049 return __nv_vsubss4(__a, __b); 1050 } 1051 __DEVICE__ unsigned int __vsubus2(unsigned int __a, unsigned int __b) { 1052 return __nv_vsubus2(__a, __b); 1053 } 1054 __DEVICE__ unsigned int __vsubus4(unsigned int __a, unsigned int __b) { 1055 return __nv_vsubus4(__a, __b); 1056 } 1057 #else // CUDA_VERSION >= 9020 1058 // CUDA no longer provides inline assembly (or bitcode) implementation of these 1059 // functions, so we have to reimplment them. The implementation is naive and is 1060 // not optimized for performance. 1061 1062 // Helper function to convert N-bit boolean subfields into all-0 or all-1. 1063 // E.g. __bool2mask(0x01000100,8) -> 0xff00ff00 1064 // __bool2mask(0x00010000,16) -> 0xffff0000 1065 __DEVICE__ unsigned int __bool2mask(unsigned int __a, int shift) { 1066 return (__a << shift) - __a; 1067 } 1068 __DEVICE__ unsigned int __vabs2(unsigned int __a) { 1069 unsigned int r; 1070 __asm__("vabsdiff2.s32.s32.s32 %0,%1,%2,%3;" 1071 : "=r"(r) 1072 : "r"(__a), "r"(0), "r"(0)); 1073 return r; 1074 } 1075 __DEVICE__ unsigned int __vabs4(unsigned int __a) { 1076 unsigned int r; 1077 __asm__("vabsdiff4.s32.s32.s32 %0,%1,%2,%3;" 1078 : "=r"(r) 1079 : "r"(__a), "r"(0), "r"(0)); 1080 return r; 1081 } 1082 __DEVICE__ unsigned int __vabsdiffs2(unsigned int __a, unsigned int __b) { 1083 unsigned int r; 1084 __asm__("vabsdiff2.s32.s32.s32 %0,%1,%2,%3;" 1085 : "=r"(r) 1086 : "r"(__a), "r"(__b), "r"(0)); 1087 return r; 1088 } 1089 1090 __DEVICE__ unsigned int __vabsdiffs4(unsigned int __a, unsigned int __b) { 1091 unsigned int r; 1092 __asm__("vabsdiff4.s32.s32.s32 %0,%1,%2,%3;" 1093 : "=r"(r) 1094 : "r"(__a), "r"(__b), "r"(0)); 1095 return r; 1096 } 1097 __DEVICE__ unsigned int __vabsdiffu2(unsigned int __a, unsigned int __b) { 1098 unsigned int r; 1099 __asm__("vabsdiff2.u32.u32.u32 %0,%1,%2,%3;" 1100 : "=r"(r) 1101 : "r"(__a), "r"(__b), "r"(0)); 1102 return r; 1103 } 1104 __DEVICE__ unsigned int __vabsdiffu4(unsigned int __a, unsigned int __b) { 1105 unsigned int r; 1106 __asm__("vabsdiff4.u32.u32.u32 %0,%1,%2,%3;" 1107 : "=r"(r) 1108 : "r"(__a), "r"(__b), "r"(0)); 1109 return r; 1110 } 1111 __DEVICE__ unsigned int __vabsss2(unsigned int __a) { 1112 unsigned int r; 1113 __asm__("vabsdiff2.s32.s32.s32.sat %0,%1,%2,%3;" 1114 : "=r"(r) 1115 : "r"(__a), "r"(0), "r"(0)); 1116 return r; 1117 } 1118 __DEVICE__ unsigned int __vabsss4(unsigned int __a) { 1119 unsigned int r; 1120 __asm__("vabsdiff4.s32.s32.s32.sat %0,%1,%2,%3;" 1121 : "=r"(r) 1122 : "r"(__a), "r"(0), "r"(0)); 1123 return r; 1124 } 1125 __DEVICE__ unsigned int __vadd2(unsigned int __a, unsigned int __b) { 1126 unsigned int r; 1127 __asm__("vadd2.u32.u32.u32 %0,%1,%2,%3;" 1128 : "=r"(r) 1129 : "r"(__a), "r"(__b), "r"(0)); 1130 return r; 1131 } 1132 __DEVICE__ unsigned int __vadd4(unsigned int __a, unsigned int __b) { 1133 unsigned int r; 1134 __asm__("vadd4.u32.u32.u32 %0,%1,%2,%3;" 1135 : "=r"(r) 1136 : "r"(__a), "r"(__b), "r"(0)); 1137 return r; 1138 } 1139 __DEVICE__ unsigned int __vaddss2(unsigned int __a, unsigned int __b) { 1140 unsigned int r; 1141 __asm__("vadd2.s32.s32.s32.sat %0,%1,%2,%3;" 1142 : "=r"(r) 1143 : "r"(__a), "r"(__b), "r"(0)); 1144 return r; 1145 } 1146 __DEVICE__ unsigned int __vaddss4(unsigned int __a, unsigned int __b) { 1147 unsigned int r; 1148 __asm__("vadd4.s32.s32.s32.sat %0,%1,%2,%3;" 1149 : "=r"(r) 1150 : "r"(__a), "r"(__b), "r"(0)); 1151 return r; 1152 } 1153 __DEVICE__ unsigned int __vaddus2(unsigned int __a, unsigned int __b) { 1154 unsigned int r; 1155 __asm__("vadd2.u32.u32.u32.sat %0,%1,%2,%3;" 1156 : "=r"(r) 1157 : "r"(__a), "r"(__b), "r"(0)); 1158 return r; 1159 } 1160 __DEVICE__ unsigned int __vaddus4(unsigned int __a, unsigned int __b) { 1161 unsigned int r; 1162 __asm__("vadd4.u32.u32.u32.sat %0,%1,%2,%3;" 1163 : "=r"(r) 1164 : "r"(__a), "r"(__b), "r"(0)); 1165 return r; 1166 } 1167 __DEVICE__ unsigned int __vavgs2(unsigned int __a, unsigned int __b) { 1168 unsigned int r; 1169 __asm__("vavrg2.s32.s32.s32 %0,%1,%2,%3;" 1170 : "=r"(r) 1171 : "r"(__a), "r"(__b), "r"(0)); 1172 return r; 1173 } 1174 __DEVICE__ unsigned int __vavgs4(unsigned int __a, unsigned int __b) { 1175 unsigned int r; 1176 __asm__("vavrg4.s32.s32.s32 %0,%1,%2,%3;" 1177 : "=r"(r) 1178 : "r"(__a), "r"(__b), "r"(0)); 1179 return r; 1180 } 1181 __DEVICE__ unsigned int __vavgu2(unsigned int __a, unsigned int __b) { 1182 unsigned int r; 1183 __asm__("vavrg2.u32.u32.u32 %0,%1,%2,%3;" 1184 : "=r"(r) 1185 : "r"(__a), "r"(__b), "r"(0)); 1186 return r; 1187 } 1188 __DEVICE__ unsigned int __vavgu4(unsigned int __a, unsigned int __b) { 1189 unsigned int r; 1190 __asm__("vavrg4.u32.u32.u32 %0,%1,%2,%3;" 1191 : "=r"(r) 1192 : "r"(__a), "r"(__b), "r"(0)); 1193 return r; 1194 } 1195 __DEVICE__ unsigned int __vseteq2(unsigned int __a, unsigned int __b) { 1196 unsigned int r; 1197 __asm__("vset2.u32.u32.eq %0,%1,%2,%3;" 1198 : "=r"(r) 1199 : "r"(__a), "r"(__b), "r"(0)); 1200 return r; 1201 } 1202 __DEVICE__ unsigned int __vcmpeq2(unsigned int __a, unsigned int __b) { 1203 return __bool2mask(__vseteq2(__a, __b), 16); 1204 } 1205 __DEVICE__ unsigned int __vseteq4(unsigned int __a, unsigned int __b) { 1206 unsigned int r; 1207 __asm__("vset4.u32.u32.eq %0,%1,%2,%3;" 1208 : "=r"(r) 1209 : "r"(__a), "r"(__b), "r"(0)); 1210 return r; 1211 } 1212 __DEVICE__ unsigned int __vcmpeq4(unsigned int __a, unsigned int __b) { 1213 return __bool2mask(__vseteq4(__a, __b), 8); 1214 } 1215 __DEVICE__ unsigned int __vsetges2(unsigned int __a, unsigned int __b) { 1216 unsigned int r; 1217 __asm__("vset2.s32.s32.ge %0,%1,%2,%3;" 1218 : "=r"(r) 1219 : "r"(__a), "r"(__b), "r"(0)); 1220 return r; 1221 } 1222 __DEVICE__ unsigned int __vcmpges2(unsigned int __a, unsigned int __b) { 1223 return __bool2mask(__vsetges2(__a, __b), 16); 1224 } 1225 __DEVICE__ unsigned int __vsetges4(unsigned int __a, unsigned int __b) { 1226 unsigned int r; 1227 __asm__("vset4.s32.s32.ge %0,%1,%2,%3;" 1228 : "=r"(r) 1229 : "r"(__a), "r"(__b), "r"(0)); 1230 return r; 1231 } 1232 __DEVICE__ unsigned int __vcmpges4(unsigned int __a, unsigned int __b) { 1233 return __bool2mask(__vsetges4(__a, __b), 8); 1234 } 1235 __DEVICE__ unsigned int __vsetgeu2(unsigned int __a, unsigned int __b) { 1236 unsigned int r; 1237 __asm__("vset2.u32.u32.ge %0,%1,%2,%3;" 1238 : "=r"(r) 1239 : "r"(__a), "r"(__b), "r"(0)); 1240 return r; 1241 } 1242 __DEVICE__ unsigned int __vcmpgeu2(unsigned int __a, unsigned int __b) { 1243 return __bool2mask(__vsetgeu2(__a, __b), 16); 1244 } 1245 __DEVICE__ unsigned int __vsetgeu4(unsigned int __a, unsigned int __b) { 1246 unsigned int r; 1247 __asm__("vset4.u32.u32.ge %0,%1,%2,%3;" 1248 : "=r"(r) 1249 : "r"(__a), "r"(__b), "r"(0)); 1250 return r; 1251 } 1252 __DEVICE__ unsigned int __vcmpgeu4(unsigned int __a, unsigned int __b) { 1253 return __bool2mask(__vsetgeu4(__a, __b), 8); 1254 } 1255 __DEVICE__ unsigned int __vsetgts2(unsigned int __a, unsigned int __b) { 1256 unsigned int r; 1257 __asm__("vset2.s32.s32.gt %0,%1,%2,%3;" 1258 : "=r"(r) 1259 : "r"(__a), "r"(__b), "r"(0)); 1260 return r; 1261 } 1262 __DEVICE__ unsigned int __vcmpgts2(unsigned int __a, unsigned int __b) { 1263 return __bool2mask(__vsetgts2(__a, __b), 16); 1264 } 1265 __DEVICE__ unsigned int __vsetgts4(unsigned int __a, unsigned int __b) { 1266 unsigned int r; 1267 __asm__("vset4.s32.s32.gt %0,%1,%2,%3;" 1268 : "=r"(r) 1269 : "r"(__a), "r"(__b), "r"(0)); 1270 return r; 1271 } 1272 __DEVICE__ unsigned int __vcmpgts4(unsigned int __a, unsigned int __b) { 1273 return __bool2mask(__vsetgts4(__a, __b), 8); 1274 } 1275 __DEVICE__ unsigned int __vsetgtu2(unsigned int __a, unsigned int __b) { 1276 unsigned int r; 1277 __asm__("vset2.u32.u32.gt %0,%1,%2,%3;" 1278 : "=r"(r) 1279 : "r"(__a), "r"(__b), "r"(0)); 1280 return r; 1281 } 1282 __DEVICE__ unsigned int __vcmpgtu2(unsigned int __a, unsigned int __b) { 1283 return __bool2mask(__vsetgtu2(__a, __b), 16); 1284 } 1285 __DEVICE__ unsigned int __vsetgtu4(unsigned int __a, unsigned int __b) { 1286 unsigned int r; 1287 __asm__("vset4.u32.u32.gt %0,%1,%2,%3;" 1288 : "=r"(r) 1289 : "r"(__a), "r"(__b), "r"(0)); 1290 return r; 1291 } 1292 __DEVICE__ unsigned int __vcmpgtu4(unsigned int __a, unsigned int __b) { 1293 return __bool2mask(__vsetgtu4(__a, __b), 8); 1294 } 1295 __DEVICE__ unsigned int __vsetles2(unsigned int __a, unsigned int __b) { 1296 unsigned int r; 1297 __asm__("vset2.s32.s32.le %0,%1,%2,%3;" 1298 : "=r"(r) 1299 : "r"(__a), "r"(__b), "r"(0)); 1300 return r; 1301 } 1302 __DEVICE__ unsigned int __vcmples2(unsigned int __a, unsigned int __b) { 1303 return __bool2mask(__vsetles2(__a, __b), 16); 1304 } 1305 __DEVICE__ unsigned int __vsetles4(unsigned int __a, unsigned int __b) { 1306 unsigned int r; 1307 __asm__("vset4.s32.s32.le %0,%1,%2,%3;" 1308 : "=r"(r) 1309 : "r"(__a), "r"(__b), "r"(0)); 1310 return r; 1311 } 1312 __DEVICE__ unsigned int __vcmples4(unsigned int __a, unsigned int __b) { 1313 return __bool2mask(__vsetles4(__a, __b), 8); 1314 } 1315 __DEVICE__ unsigned int __vsetleu2(unsigned int __a, unsigned int __b) { 1316 unsigned int r; 1317 __asm__("vset2.u32.u32.le %0,%1,%2,%3;" 1318 : "=r"(r) 1319 : "r"(__a), "r"(__b), "r"(0)); 1320 return r; 1321 } 1322 __DEVICE__ unsigned int __vcmpleu2(unsigned int __a, unsigned int __b) { 1323 return __bool2mask(__vsetleu2(__a, __b), 16); 1324 } 1325 __DEVICE__ unsigned int __vsetleu4(unsigned int __a, unsigned int __b) { 1326 unsigned int r; 1327 __asm__("vset4.u32.u32.le %0,%1,%2,%3;" 1328 : "=r"(r) 1329 : "r"(__a), "r"(__b), "r"(0)); 1330 return r; 1331 } 1332 __DEVICE__ unsigned int __vcmpleu4(unsigned int __a, unsigned int __b) { 1333 return __bool2mask(__vsetleu4(__a, __b), 8); 1334 } 1335 __DEVICE__ unsigned int __vsetlts2(unsigned int __a, unsigned int __b) { 1336 unsigned int r; 1337 __asm__("vset2.s32.s32.lt %0,%1,%2,%3;" 1338 : "=r"(r) 1339 : "r"(__a), "r"(__b), "r"(0)); 1340 return r; 1341 } 1342 __DEVICE__ unsigned int __vcmplts2(unsigned int __a, unsigned int __b) { 1343 return __bool2mask(__vsetlts2(__a, __b), 16); 1344 } 1345 __DEVICE__ unsigned int __vsetlts4(unsigned int __a, unsigned int __b) { 1346 unsigned int r; 1347 __asm__("vset4.s32.s32.lt %0,%1,%2,%3;" 1348 : "=r"(r) 1349 : "r"(__a), "r"(__b), "r"(0)); 1350 return r; 1351 } 1352 __DEVICE__ unsigned int __vcmplts4(unsigned int __a, unsigned int __b) { 1353 return __bool2mask(__vsetlts4(__a, __b), 8); 1354 } 1355 __DEVICE__ unsigned int __vsetltu2(unsigned int __a, unsigned int __b) { 1356 unsigned int r; 1357 __asm__("vset2.u32.u32.lt %0,%1,%2,%3;" 1358 : "=r"(r) 1359 : "r"(__a), "r"(__b), "r"(0)); 1360 return r; 1361 } 1362 __DEVICE__ unsigned int __vcmpltu2(unsigned int __a, unsigned int __b) { 1363 return __bool2mask(__vsetltu2(__a, __b), 16); 1364 } 1365 __DEVICE__ unsigned int __vsetltu4(unsigned int __a, unsigned int __b) { 1366 unsigned int r; 1367 __asm__("vset4.u32.u32.lt %0,%1,%2,%3;" 1368 : "=r"(r) 1369 : "r"(__a), "r"(__b), "r"(0)); 1370 return r; 1371 } 1372 __DEVICE__ unsigned int __vcmpltu4(unsigned int __a, unsigned int __b) { 1373 return __bool2mask(__vsetltu4(__a, __b), 8); 1374 } 1375 __DEVICE__ unsigned int __vsetne2(unsigned int __a, unsigned int __b) { 1376 unsigned int r; 1377 __asm__("vset2.u32.u32.ne %0,%1,%2,%3;" 1378 : "=r"(r) 1379 : "r"(__a), "r"(__b), "r"(0)); 1380 return r; 1381 } 1382 __DEVICE__ unsigned int __vcmpne2(unsigned int __a, unsigned int __b) { 1383 return __bool2mask(__vsetne2(__a, __b), 16); 1384 } 1385 __DEVICE__ unsigned int __vsetne4(unsigned int __a, unsigned int __b) { 1386 unsigned int r; 1387 __asm__("vset4.u32.u32.ne %0,%1,%2,%3;" 1388 : "=r"(r) 1389 : "r"(__a), "r"(__b), "r"(0)); 1390 return r; 1391 } 1392 __DEVICE__ unsigned int __vcmpne4(unsigned int __a, unsigned int __b) { 1393 return __bool2mask(__vsetne4(__a, __b), 8); 1394 } 1395 1396 // Based on ITEM 23 in AIM-239: http://dspace.mit.edu/handle/1721.1/6086 1397 // (a & b) + (a | b) = a + b = (a ^ b) + 2 * (a & b) => 1398 // (a + b) / 2 = ((a ^ b) >> 1) + (a & b) 1399 // To operate on multiple sub-elements we need to make sure to mask out bits 1400 // that crossed over into adjacent elements during the shift. 1401 __DEVICE__ unsigned int __vhaddu2(unsigned int __a, unsigned int __b) { 1402 return (((__a ^ __b) >> 1) & ~0x80008000u) + (__a & __b); 1403 } 1404 __DEVICE__ unsigned int __vhaddu4(unsigned int __a, unsigned int __b) { 1405 return (((__a ^ __b) >> 1) & ~0x80808080u) + (__a & __b); 1406 } 1407 1408 __DEVICE__ unsigned int __vmaxs2(unsigned int __a, unsigned int __b) { 1409 unsigned int r; 1410 if ((__a & 0x8000) && (__b & 0x8000)) { 1411 // Work around a bug in ptxas which produces invalid result if low element 1412 // is negative. 1413 unsigned mask = __vcmpgts2(__a, __b); 1414 r = (__a & mask) | (__b & ~mask); 1415 } else { 1416 __asm__("vmax2.s32.s32.s32 %0,%1,%2,%3;" 1417 : "=r"(r) 1418 : "r"(__a), "r"(__b), "r"(0)); 1419 } 1420 return r; 1421 } 1422 __DEVICE__ unsigned int __vmaxs4(unsigned int __a, unsigned int __b) { 1423 unsigned int r; 1424 __asm__("vmax4.s32.s32.s32 %0,%1,%2,%3;" 1425 : "=r"(r) 1426 : "r"(__a), "r"(__b), "r"(0)); 1427 return r; 1428 } 1429 __DEVICE__ unsigned int __vmaxu2(unsigned int __a, unsigned int __b) { 1430 unsigned int r; 1431 __asm__("vmax2.u32.u32.u32 %0,%1,%2,%3;" 1432 : "=r"(r) 1433 : "r"(__a), "r"(__b), "r"(0)); 1434 return r; 1435 } 1436 __DEVICE__ unsigned int __vmaxu4(unsigned int __a, unsigned int __b) { 1437 unsigned int r; 1438 __asm__("vmax4.u32.u32.u32 %0,%1,%2,%3;" 1439 : "=r"(r) 1440 : "r"(__a), "r"(__b), "r"(0)); 1441 return r; 1442 } 1443 __DEVICE__ unsigned int __vmins2(unsigned int __a, unsigned int __b) { 1444 unsigned int r; 1445 __asm__("vmin2.s32.s32.s32 %0,%1,%2,%3;" 1446 : "=r"(r) 1447 : "r"(__a), "r"(__b), "r"(0)); 1448 return r; 1449 } 1450 __DEVICE__ unsigned int __vmins4(unsigned int __a, unsigned int __b) { 1451 unsigned int r; 1452 __asm__("vmin4.s32.s32.s32 %0,%1,%2,%3;" 1453 : "=r"(r) 1454 : "r"(__a), "r"(__b), "r"(0)); 1455 return r; 1456 } 1457 __DEVICE__ unsigned int __vminu2(unsigned int __a, unsigned int __b) { 1458 unsigned int r; 1459 __asm__("vmin2.u32.u32.u32 %0,%1,%2,%3;" 1460 : "=r"(r) 1461 : "r"(__a), "r"(__b), "r"(0)); 1462 return r; 1463 } 1464 __DEVICE__ unsigned int __vminu4(unsigned int __a, unsigned int __b) { 1465 unsigned int r; 1466 __asm__("vmin4.u32.u32.u32 %0,%1,%2,%3;" 1467 : "=r"(r) 1468 : "r"(__a), "r"(__b), "r"(0)); 1469 return r; 1470 } 1471 __DEVICE__ unsigned int __vsads2(unsigned int __a, unsigned int __b) { 1472 unsigned int r; 1473 __asm__("vabsdiff2.s32.s32.s32.add %0,%1,%2,%3;" 1474 : "=r"(r) 1475 : "r"(__a), "r"(__b), "r"(0)); 1476 return r; 1477 } 1478 __DEVICE__ unsigned int __vsads4(unsigned int __a, unsigned int __b) { 1479 unsigned int r; 1480 __asm__("vabsdiff4.s32.s32.s32.add %0,%1,%2,%3;" 1481 : "=r"(r) 1482 : "r"(__a), "r"(__b), "r"(0)); 1483 return r; 1484 } 1485 __DEVICE__ unsigned int __vsadu2(unsigned int __a, unsigned int __b) { 1486 unsigned int r; 1487 __asm__("vabsdiff2.u32.u32.u32.add %0,%1,%2,%3;" 1488 : "=r"(r) 1489 : "r"(__a), "r"(__b), "r"(0)); 1490 return r; 1491 } 1492 __DEVICE__ unsigned int __vsadu4(unsigned int __a, unsigned int __b) { 1493 unsigned int r; 1494 __asm__("vabsdiff4.u32.u32.u32.add %0,%1,%2,%3;" 1495 : "=r"(r) 1496 : "r"(__a), "r"(__b), "r"(0)); 1497 return r; 1498 } 1499 1500 __DEVICE__ unsigned int __vsub2(unsigned int __a, unsigned int __b) { 1501 unsigned int r; 1502 __asm__("vsub2.u32.u32.u32 %0,%1,%2,%3;" 1503 : "=r"(r) 1504 : "r"(__a), "r"(__b), "r"(0)); 1505 return r; 1506 } 1507 __DEVICE__ unsigned int __vneg2(unsigned int __a) { return __vsub2(0, __a); } 1508 1509 __DEVICE__ unsigned int __vsub4(unsigned int __a, unsigned int __b) { 1510 unsigned int r; 1511 __asm__("vsub4.u32.u32.u32 %0,%1,%2,%3;" 1512 : "=r"(r) 1513 : "r"(__a), "r"(__b), "r"(0)); 1514 return r; 1515 } 1516 __DEVICE__ unsigned int __vneg4(unsigned int __a) { return __vsub4(0, __a); } 1517 __DEVICE__ unsigned int __vsubss2(unsigned int __a, unsigned int __b) { 1518 unsigned int r; 1519 __asm__("vsub2.s32.s32.s32.sat %0,%1,%2,%3;" 1520 : "=r"(r) 1521 : "r"(__a), "r"(__b), "r"(0)); 1522 return r; 1523 } 1524 __DEVICE__ unsigned int __vnegss2(unsigned int __a) { 1525 return __vsubss2(0, __a); 1526 } 1527 __DEVICE__ unsigned int __vsubss4(unsigned int __a, unsigned int __b) { 1528 unsigned int r; 1529 __asm__("vsub4.s32.s32.s32.sat %0,%1,%2,%3;" 1530 : "=r"(r) 1531 : "r"(__a), "r"(__b), "r"(0)); 1532 return r; 1533 } 1534 __DEVICE__ unsigned int __vnegss4(unsigned int __a) { 1535 return __vsubss4(0, __a); 1536 } 1537 __DEVICE__ unsigned int __vsubus2(unsigned int __a, unsigned int __b) { 1538 unsigned int r; 1539 __asm__("vsub2.u32.u32.u32.sat %0,%1,%2,%3;" 1540 : "=r"(r) 1541 : "r"(__a), "r"(__b), "r"(0)); 1542 return r; 1543 } 1544 __DEVICE__ unsigned int __vsubus4(unsigned int __a, unsigned int __b) { 1545 unsigned int r; 1546 __asm__("vsub4.u32.u32.u32.sat %0,%1,%2,%3;" 1547 : "=r"(r) 1548 : "r"(__a), "r"(__b), "r"(0)); 1549 return r; 1550 } 1551 #endif // CUDA_VERSION >= 9020 1552 1553 // For OpenMP we require the user to include <time.h> as we need to know what 1554 // clock_t is on the system. 1555 #ifndef __OPENMP_NVPTX__ 1556 __DEVICE__ /* clock_t= */ int clock() { return __nvvm_read_ptx_sreg_clock(); } 1557 #endif 1558 __DEVICE__ long long clock64() { return __nvvm_read_ptx_sreg_clock64(); } 1559 1560 // These functions shouldn't be declared when including this header 1561 // for math function resolution purposes. 1562 #ifndef __OPENMP_NVPTX__ 1563 __DEVICE__ void *memcpy(void *__a, const void *__b, size_t __c) { 1564 return __builtin_memcpy(__a, __b, __c); 1565 } 1566 __DEVICE__ void *memset(void *__a, int __b, size_t __c) { 1567 return __builtin_memset(__a, __b, __c); 1568 } 1569 #endif 1570 1571 #pragma pop_macro("__DEVICE__") 1572 #endif // __CLANG_CUDA_DEVICE_FUNCTIONS_H__ 1573