2
2
/*
3
3
* List of LLVM intrinsics
4
4
*
5
- * INTRINS(id, llvm_id)
5
+ * INTRINS(id, llvm_id, llvm_argument_type )
6
6
* To define a simple intrinsic
7
- * INTRINS_OVR(id, llvm_id)
8
- * To define an overloaded intrinsic
7
+ * INTRINS_OVR(id, llvm_id, llvm_argument_type)
8
+ * To define an overloaded intrinsic with a single argument
9
+ * INTRINS_OVR_2_ARG(id, llvm_id, llvm_argument_type1, llvm_argument_type2)
10
+ * To define an overloaded intrinsic with two arguments
11
+ * INTRINS_OVR_3_ARG(id, llvm_id, llvm_argument_type1, llvm_argument_type2, llvm_argument_type3)
12
+ * To define an overloaded intrinsic with three arguments
9
13
*/
10
14
11
- INTRINS_OVR (MEMSET , memset )
12
- INTRINS_OVR (MEMCPY , memcpy )
13
- INTRINS_OVR (MEMMOVE , memmove )
14
- INTRINS_OVR (SADD_OVF_I32 , sadd_with_overflow )
15
- INTRINS_OVR (UADD_OVF_I32 , uadd_with_overflow )
16
- INTRINS_OVR (SSUB_OVF_I32 , ssub_with_overflow )
17
- INTRINS_OVR (USUB_OVF_I32 , usub_with_overflow )
18
- INTRINS_OVR (SMUL_OVF_I32 , smul_with_overflow )
19
- INTRINS_OVR (UMUL_OVF_I32 , umul_with_overflow )
20
- INTRINS_OVR (SADD_OVF_I64 , sadd_with_overflow )
21
- INTRINS_OVR (UADD_OVF_I64 , uadd_with_overflow )
22
- INTRINS_OVR (SSUB_OVF_I64 , ssub_with_overflow )
23
- INTRINS_OVR (USUB_OVF_I64 , usub_with_overflow )
24
- INTRINS_OVR (SMUL_OVF_I64 , smul_with_overflow )
25
- INTRINS_OVR (UMUL_OVF_I64 , umul_with_overflow )
26
- INTRINS_OVR (SIN , sin )
27
- INTRINS_OVR (COS , cos )
28
- INTRINS_OVR (SQRT , sqrt )
29
- INTRINS_OVR (FLOOR , floor )
30
- INTRINS_OVR (FLOORF , floor )
31
- INTRINS_OVR (CEIL , ceil )
32
- INTRINS_OVR (CEILF , ceil )
33
- INTRINS_OVR (FMA , fma )
34
- INTRINS_OVR (FMAF , fma )
15
+ INTRINS_OVR_2_ARG (MEMSET , memset , LLVMPointerType ( LLVMInt8Type (), 0 ), LLVMInt32Type () )
16
+ INTRINS_OVR_3_ARG (MEMCPY , memcpy , LLVMPointerType ( LLVMInt8Type (), 0 ), LLVMPointerType ( LLVMInt8Type (), 0 ), LLVMInt32Type () )
17
+ INTRINS_OVR_3_ARG (MEMMOVE , memmove , LLVMPointerType ( LLVMInt8Type (), 0 ), LLVMPointerType ( LLVMInt8Type (), 0 ), LLVMInt64Type () )
18
+ INTRINS_OVR (SADD_OVF_I32 , sadd_with_overflow , LLVMInt32Type () )
19
+ INTRINS_OVR (UADD_OVF_I32 , uadd_with_overflow , LLVMInt32Type () )
20
+ INTRINS_OVR (SSUB_OVF_I32 , ssub_with_overflow , LLVMInt32Type () )
21
+ INTRINS_OVR (USUB_OVF_I32 , usub_with_overflow , LLVMInt32Type () )
22
+ INTRINS_OVR (SMUL_OVF_I32 , smul_with_overflow , LLVMInt32Type () )
23
+ INTRINS_OVR (UMUL_OVF_I32 , umul_with_overflow , LLVMInt32Type () )
24
+ INTRINS_OVR (SADD_OVF_I64 , sadd_with_overflow , LLVMInt64Type () )
25
+ INTRINS_OVR (UADD_OVF_I64 , uadd_with_overflow , LLVMInt64Type () )
26
+ INTRINS_OVR (SSUB_OVF_I64 , ssub_with_overflow , LLVMInt64Type () )
27
+ INTRINS_OVR (USUB_OVF_I64 , usub_with_overflow , LLVMInt64Type () )
28
+ INTRINS_OVR (SMUL_OVF_I64 , smul_with_overflow , LLVMInt64Type () )
29
+ INTRINS_OVR (UMUL_OVF_I64 , umul_with_overflow , LLVMInt64Type () )
30
+ INTRINS_OVR (SIN , sin , LLVMDoubleType () )
31
+ INTRINS_OVR (COS , cos , LLVMDoubleType () )
32
+ INTRINS_OVR (SQRT , sqrt , LLVMDoubleType () )
33
+ INTRINS_OVR (FLOOR , floor , LLVMDoubleType () )
34
+ INTRINS_OVR (FLOORF , floor , LLVMFloatType () )
35
+ INTRINS_OVR (CEIL , ceil , LLVMDoubleType () )
36
+ INTRINS_OVR (CEILF , ceil , LLVMFloatType () )
37
+ INTRINS_OVR (FMA , fma , LLVMDoubleType () )
38
+ INTRINS_OVR (FMAF , fma , LLVMFloatType () )
35
39
/* This isn't an intrinsic, instead llvm seems to special case it by name */
36
- INTRINS_OVR (FABS , fabs )
37
- INTRINS_OVR (ABSF , fabs )
38
- INTRINS_OVR (SINF , sin )
39
- INTRINS_OVR (COSF , cos )
40
- INTRINS_OVR (SQRTF , sqrt )
41
- INTRINS_OVR (POWF , pow )
42
- INTRINS_OVR (POW , pow )
43
- INTRINS_OVR (EXP , exp )
44
- INTRINS_OVR (EXPF , exp )
45
- INTRINS_OVR (LOG , log )
46
- INTRINS_OVR (LOG2 , log2 )
47
- INTRINS_OVR (LOG2F , log2 )
48
- INTRINS_OVR (LOG10 , log10 )
49
- INTRINS_OVR (LOG10F , log10 )
50
- INTRINS_OVR (TRUNC , trunc )
51
- INTRINS_OVR (TRUNCF , trunc )
52
- INTRINS_OVR (COPYSIGN , copysign )
53
- INTRINS_OVR (COPYSIGNF , copysign )
54
- INTRINS_OVR (EXPECT_I8 , expect )
55
- INTRINS_OVR (EXPECT_I1 , expect )
56
- INTRINS_OVR (CTPOP_I32 , ctpop )
57
- INTRINS_OVR (CTPOP_I64 , ctpop )
58
- INTRINS_OVR (CTLZ_I32 , ctlz )
59
- INTRINS_OVR (CTLZ_I64 , ctlz )
60
- INTRINS_OVR (CTTZ_I32 , cttz )
61
- INTRINS_OVR (CTTZ_I64 , cttz )
40
+ INTRINS_OVR (FABS , fabs , LLVMDoubleType () )
41
+ INTRINS_OVR (ABSF , fabs , LLVMFloatType () )
42
+ INTRINS_OVR (SINF , sin , LLVMFloatType () )
43
+ INTRINS_OVR (COSF , cos , LLVMFloatType () )
44
+ INTRINS_OVR (SQRTF , sqrt , LLVMFloatType () )
45
+ INTRINS_OVR (POWF , pow , LLVMFloatType () )
46
+ INTRINS_OVR (POW , pow , LLVMDoubleType () )
47
+ INTRINS_OVR (EXP , exp , LLVMDoubleType () )
48
+ INTRINS_OVR (EXPF , exp , LLVMFloatType () )
49
+ INTRINS_OVR (LOG , log , LLVMDoubleType () )
50
+ INTRINS_OVR (LOG2 , log2 , LLVMDoubleType () )
51
+ INTRINS_OVR (LOG2F , log2 , LLVMFloatType () )
52
+ INTRINS_OVR (LOG10 , log10 , LLVMDoubleType () )
53
+ INTRINS_OVR (LOG10F , log10 , LLVMFloatType () )
54
+ INTRINS_OVR (TRUNC , trunc , LLVMDoubleType () )
55
+ INTRINS_OVR (TRUNCF , trunc , LLVMFloatType () )
56
+ INTRINS_OVR (COPYSIGN , copysign , LLVMDoubleType () )
57
+ INTRINS_OVR (COPYSIGNF , copysign , LLVMFloatType () )
58
+ INTRINS_OVR (EXPECT_I8 , expect , LLVMInt8Type () )
59
+ INTRINS_OVR (EXPECT_I1 , expect , LLVMInt1Type () )
60
+ INTRINS_OVR (CTPOP_I32 , ctpop , LLVMInt32Type () )
61
+ INTRINS_OVR (CTPOP_I64 , ctpop , LLVMInt64Type () )
62
+ INTRINS_OVR (CTLZ_I32 , ctlz , LLVMInt32Type () )
63
+ INTRINS_OVR (CTLZ_I64 , ctlz , LLVMInt64Type () )
64
+ INTRINS_OVR (CTTZ_I32 , cttz , LLVMInt32Type () )
65
+ INTRINS_OVR (CTTZ_I64 , cttz , LLVMInt64Type () )
62
66
INTRINS (PREFETCH , prefetch )
63
67
INTRINS (BZHI_I32 , x86_bmi_bzhi_32 )
64
68
INTRINS (BZHI_I64 , x86_bmi_bzhi_64 )
@@ -96,10 +100,10 @@ INTRINS(SSE_SQRT_PD, x86_sse2_sqrt_pd)
96
100
INTRINS (SSE_SQRT_SD , x86_sse2_sqrt_sd )
97
101
INTRINS (SSE_PMULUDQ , x86_sse2_pmulu_dq )
98
102
#else
99
- INTRINS_OVR (SSE_SQRT_PD , sqrt )
100
- INTRINS_OVR (SSE_SQRT_PS , sqrt )
101
- INTRINS_OVR (SSE_SQRT_SD , sqrt )
102
- INTRINS_OVR (SSE_SQRT_SS , sqrt )
103
+ INTRINS_OVR (SSE_SQRT_PD , sqrt , sse_r8_t )
104
+ INTRINS_OVR (SSE_SQRT_PS , sqrt , sse_r4_t )
105
+ INTRINS_OVR (SSE_SQRT_SD , sqrt , LLVMDoubleType () )
106
+ INTRINS_OVR (SSE_SQRT_SS , sqrt , LLVMFloatType () )
103
107
#endif
104
108
INTRINS (SSE_RCP_PS , x86_sse_rcp_ps )
105
109
INTRINS (SSE_RSQRT_PS , x86_sse_rsqrt_ps )
@@ -221,15 +225,15 @@ INTRINS(AESNI_AESENCLAST, x86_aesni_aesenclast)
221
225
INTRINS (AESNI_AESIMC , x86_aesni_aesimc )
222
226
#if LLVM_API_VERSION >= 800
223
227
// these intrinsics were renamed in LLVM 8
224
- INTRINS_OVR (SSE_SADD_SATI8 , sadd_sat )
225
- INTRINS_OVR (SSE_UADD_SATI8 , uadd_sat )
226
- INTRINS_OVR (SSE_SADD_SATI16 , sadd_sat )
227
- INTRINS_OVR (SSE_UADD_SATI16 , uadd_sat )
228
+ INTRINS_OVR (SSE_SADD_SATI8 , sadd_sat , sse_i1_t )
229
+ INTRINS_OVR (SSE_UADD_SATI8 , uadd_sat , sse_i1_t )
230
+ INTRINS_OVR (SSE_SADD_SATI16 , sadd_sat , sse_i1_t )
231
+ INTRINS_OVR (SSE_UADD_SATI16 , uadd_sat , sse_i1_t )
228
232
229
- INTRINS_OVR (SSE_SSUB_SATI8 , ssub_sat )
230
- INTRINS_OVR (SSE_USUB_SATI8 , usub_sat )
231
- INTRINS_OVR (SSE_SSUB_SATI16 , ssub_sat )
232
- INTRINS_OVR (SSE_USUB_SATI16 , usub_sat )
233
+ INTRINS_OVR (SSE_SSUB_SATI8 , ssub_sat , sse_i2_t )
234
+ INTRINS_OVR (SSE_USUB_SATI8 , usub_sat , sse_i2_t )
235
+ INTRINS_OVR (SSE_SSUB_SATI16 , ssub_sat , sse_i2_t )
236
+ INTRINS_OVR (SSE_USUB_SATI16 , usub_sat , sse_i2_t )
233
237
#else
234
238
INTRINS (SSE_SADD_SATI8 , x86_sse2_padds_b )
235
239
INTRINS (SSE_UADD_SATI8 , x86_sse2_paddus_b )
@@ -243,14 +247,14 @@ INTRINS(SSE_USUB_SATI16, x86_sse2_psubus_w)
243
247
#endif
244
248
#endif
245
249
#if defined(TARGET_WASM ) && LLVM_API_VERSION >= 800
246
- INTRINS_OVR (WASM_ANYTRUE_V16 , wasm_anytrue )
247
- INTRINS_OVR (WASM_ANYTRUE_V8 , wasm_anytrue )
248
- INTRINS_OVR (WASM_ANYTRUE_V4 , wasm_anytrue )
249
- INTRINS_OVR (WASM_ANYTRUE_V2 , wasm_anytrue )
250
+ INTRINS_OVR (WASM_ANYTRUE_V16 , wasm_anytrue , sse_i1_t )
251
+ INTRINS_OVR (WASM_ANYTRUE_V8 , wasm_anytrue , sse_i2_t )
252
+ INTRINS_OVR (WASM_ANYTRUE_V4 , wasm_anytrue , sse_i4_t )
253
+ INTRINS_OVR (WASM_ANYTRUE_V2 , wasm_anytrue , sse_i8_t )
250
254
#endif
251
255
#if defined(TARGET_ARM64 )
252
- INTRINS_OVR (BITREVERSE_I32 , bitreverse )
253
- INTRINS_OVR (BITREVERSE_I64 , bitreverse )
256
+ INTRINS_OVR (BITREVERSE_I32 , bitreverse , LLVMInt32Type () )
257
+ INTRINS_OVR (BITREVERSE_I64 , bitreverse , LLVMInt64Type () )
254
258
INTRINS (AARCH64_CRC32B , aarch64_crc32b )
255
259
INTRINS (AARCH64_CRC32H , aarch64_crc32h )
256
260
INTRINS (AARCH64_CRC32W , aarch64_crc32w )
@@ -273,14 +277,16 @@ INTRINS(AARCH64_SHA256SU0, aarch64_crypto_sha256su0)
273
277
INTRINS (AARCH64_SHA256SU1 , aarch64_crypto_sha256su1 )
274
278
INTRINS (AARCH64_SHA256H , aarch64_crypto_sha256h )
275
279
INTRINS (AARCH64_SHA256H2 , aarch64_crypto_sha256h2 )
276
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_FLOAT , fabs )
277
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_DOUBLE , fabs )
278
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT8 , aarch64_neon_abs )
279
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT16 , aarch64_neon_abs )
280
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT32 , aarch64_neon_abs )
281
- INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT64 , aarch64_neon_abs )
280
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_FLOAT , fabs , sse_r4_t )
281
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_DOUBLE , fabs , sse_r8_t )
282
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT8 , aarch64_neon_abs , sse_i1_t )
283
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT16 , aarch64_neon_abs , sse_i2_t )
284
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT32 , aarch64_neon_abs , sse_i4_t )
285
+ INTRINS_OVR (AARCH64_ADV_SIMD_ABS_INT64 , aarch64_neon_abs , sse_i8_t )
282
286
#endif
283
287
284
288
#undef INTRINS
285
289
#undef INTRINS_OVR
290
+ #undef INTRINS_OVR_2_ARG
291
+ #undef INTRINS_OVR_3_ARG
286
292
0 commit comments