Refactored INTRINS_OVR to include type infomration, and use it to generate add_intrin...
authorNathan Ricci <naricc@microsoft.com>
Thu, 11 Feb 2021 18:20:32 +0000 (13:20 -0500)
committerGitHub <noreply@github.com>
Thu, 11 Feb 2021 18:20:32 +0000 (13:20 -0500)
Co-authored-by: Nathan Ricci <naricc@xam-emag-01.redmond.corp.microsoft.com>
src/mono/mono/mini/llvm-intrinsics.h
src/mono/mono/mini/mini-llvm-cpp.cpp
src/mono/mono/mini/mini-llvm-cpp.h
src/mono/mono/mini/mini-llvm.c

index 8271d79..c7fa9f6 100644 (file)
@@ -2,63 +2,67 @@
 /*
  * List of LLVM intrinsics
  *
- * INTRINS(id, llvm_id)
+ * INTRINS(id, llvm_id, llvm_argument_type)
  *   To define a simple intrinsic
- * INTRINS_OVR(id, llvm_id)
- *   To define an overloaded intrinsic
+ * INTRINS_OVR(id, llvm_id, llvm_argument_type)
+ *   To define an overloaded intrinsic with a single argument
+ * INTRINS_OVR_2_ARG(id, llvm_id, llvm_argument_type1, llvm_argument_type2)
+ *   To define an overloaded intrinsic with two arguments
+ * INTRINS_OVR_3_ARG(id, llvm_id, llvm_argument_type1, llvm_argument_type2, llvm_argument_type3)
+ *      To define an overloaded intrinsic with three arguments
  */
 
-INTRINS_OVR(MEMSET, memset)
-INTRINS_OVR(MEMCPY, memcpy)
-INTRINS_OVR(MEMMOVE, memmove)
-INTRINS_OVR(SADD_OVF_I32, sadd_with_overflow)
-INTRINS_OVR(UADD_OVF_I32, uadd_with_overflow)
-INTRINS_OVR(SSUB_OVF_I32, ssub_with_overflow)
-INTRINS_OVR(USUB_OVF_I32, usub_with_overflow)
-INTRINS_OVR(SMUL_OVF_I32, smul_with_overflow)
-INTRINS_OVR(UMUL_OVF_I32, umul_with_overflow)
-INTRINS_OVR(SADD_OVF_I64, sadd_with_overflow)
-INTRINS_OVR(UADD_OVF_I64, uadd_with_overflow)
-INTRINS_OVR(SSUB_OVF_I64, ssub_with_overflow)
-INTRINS_OVR(USUB_OVF_I64, usub_with_overflow)
-INTRINS_OVR(SMUL_OVF_I64, smul_with_overflow)
-INTRINS_OVR(UMUL_OVF_I64, umul_with_overflow)
-INTRINS_OVR(SIN, sin)
-INTRINS_OVR(COS, cos)
-INTRINS_OVR(SQRT, sqrt)
-INTRINS_OVR(FLOOR, floor)
-INTRINS_OVR(FLOORF, floor)
-INTRINS_OVR(CEIL, ceil)
-INTRINS_OVR(CEILF, ceil)
-INTRINS_OVR(FMA, fma)
-INTRINS_OVR(FMAF, fma)
+INTRINS_OVR_2_ARG(MEMSET, memset, LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type ())
+INTRINS_OVR_3_ARG(MEMCPY, memcpy, LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type () )
+INTRINS_OVR_3_ARG(MEMMOVE, memmove, LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt64Type ())
+INTRINS_OVR(SADD_OVF_I32, sadd_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(UADD_OVF_I32, uadd_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(SSUB_OVF_I32, ssub_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(USUB_OVF_I32, usub_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(SMUL_OVF_I32, smul_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(UMUL_OVF_I32, umul_with_overflow, LLVMInt32Type ())
+INTRINS_OVR(SADD_OVF_I64, sadd_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(UADD_OVF_I64, uadd_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(SSUB_OVF_I64, ssub_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(USUB_OVF_I64, usub_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(SMUL_OVF_I64, smul_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(UMUL_OVF_I64, umul_with_overflow, LLVMInt64Type ())
+INTRINS_OVR(SIN, sin, LLVMDoubleType ())
+INTRINS_OVR(COS, cos, LLVMDoubleType ())
+INTRINS_OVR(SQRT, sqrt, LLVMDoubleType ())
+INTRINS_OVR(FLOOR, floor, LLVMDoubleType ())
+INTRINS_OVR(FLOORF, floor, LLVMFloatType ())
+INTRINS_OVR(CEIL, ceil, LLVMDoubleType ())
+INTRINS_OVR(CEILF, ceil, LLVMFloatType ())
+INTRINS_OVR(FMA, fma, LLVMDoubleType ())
+INTRINS_OVR(FMAF, fma, LLVMFloatType ())
        /* This isn't an intrinsic, instead llvm seems to special case it by name */
-INTRINS_OVR(FABS, fabs)
-INTRINS_OVR(ABSF, fabs)
-INTRINS_OVR(SINF, sin)
-INTRINS_OVR(COSF, cos)
-INTRINS_OVR(SQRTF, sqrt)
-INTRINS_OVR(POWF, pow)
-INTRINS_OVR(POW, pow)
-INTRINS_OVR(EXP, exp)
-INTRINS_OVR(EXPF, exp)
-INTRINS_OVR(LOG, log)
-INTRINS_OVR(LOG2, log2)
-INTRINS_OVR(LOG2F, log2)
-INTRINS_OVR(LOG10, log10)
-INTRINS_OVR(LOG10F, log10)
-INTRINS_OVR(TRUNC, trunc)
-INTRINS_OVR(TRUNCF, trunc)
-INTRINS_OVR(COPYSIGN, copysign)
-INTRINS_OVR(COPYSIGNF, copysign)
-INTRINS_OVR(EXPECT_I8, expect)
-INTRINS_OVR(EXPECT_I1, expect)
-INTRINS_OVR(CTPOP_I32, ctpop)
-INTRINS_OVR(CTPOP_I64, ctpop)
-INTRINS_OVR(CTLZ_I32, ctlz)
-INTRINS_OVR(CTLZ_I64, ctlz)
-INTRINS_OVR(CTTZ_I32, cttz)
-INTRINS_OVR(CTTZ_I64, cttz)
+INTRINS_OVR(FABS, fabs, LLVMDoubleType ())
+INTRINS_OVR(ABSF, fabs,LLVMFloatType ())
+INTRINS_OVR(SINF, sin, LLVMFloatType ())
+INTRINS_OVR(COSF, cos, LLVMFloatType ())
+INTRINS_OVR(SQRTF, sqrt, LLVMFloatType ())
+INTRINS_OVR(POWF, pow, LLVMFloatType ())
+INTRINS_OVR(POW, pow, LLVMDoubleType ())
+INTRINS_OVR(EXP, exp, LLVMDoubleType ())
+INTRINS_OVR(EXPF, exp, LLVMFloatType ())
+INTRINS_OVR(LOG, log, LLVMDoubleType ())
+INTRINS_OVR(LOG2, log2, LLVMDoubleType ())
+INTRINS_OVR(LOG2F, log2, LLVMFloatType ())
+INTRINS_OVR(LOG10, log10, LLVMDoubleType ())
+INTRINS_OVR(LOG10F, log10, LLVMFloatType ())
+INTRINS_OVR(TRUNC, trunc, LLVMDoubleType ())
+INTRINS_OVR(TRUNCF, trunc, LLVMFloatType ())
+INTRINS_OVR(COPYSIGN, copysign, LLVMDoubleType ())
+INTRINS_OVR(COPYSIGNF, copysign, LLVMFloatType ())
+INTRINS_OVR(EXPECT_I8, expect, LLVMInt8Type ())
+INTRINS_OVR(EXPECT_I1, expect, LLVMInt1Type ())
+INTRINS_OVR(CTPOP_I32, ctpop, LLVMInt32Type ())
+INTRINS_OVR(CTPOP_I64, ctpop, LLVMInt64Type ())
+INTRINS_OVR(CTLZ_I32, ctlz, LLVMInt32Type ())
+INTRINS_OVR(CTLZ_I64, ctlz, LLVMInt64Type ())
+INTRINS_OVR(CTTZ_I32, cttz, LLVMInt32Type ())
+INTRINS_OVR(CTTZ_I64, cttz, LLVMInt64Type ())
 INTRINS(PREFETCH, prefetch)
 INTRINS(BZHI_I32, x86_bmi_bzhi_32)
 INTRINS(BZHI_I64, x86_bmi_bzhi_64)
@@ -96,10 +100,10 @@ INTRINS(SSE_SQRT_PD, x86_sse2_sqrt_pd)
 INTRINS(SSE_SQRT_SD, x86_sse2_sqrt_sd)
 INTRINS(SSE_PMULUDQ, x86_sse2_pmulu_dq)
 #else
-INTRINS_OVR(SSE_SQRT_PD, sqrt)
-INTRINS_OVR(SSE_SQRT_PS, sqrt)
-INTRINS_OVR(SSE_SQRT_SD, sqrt)
-INTRINS_OVR(SSE_SQRT_SS, sqrt)
+INTRINS_OVR(SSE_SQRT_PD, sqrt, sse_r8_t)
+INTRINS_OVR(SSE_SQRT_PS, sqrt, sse_r4_t)
+INTRINS_OVR(SSE_SQRT_SD, sqrt, LLVMDoubleType ())
+INTRINS_OVR(SSE_SQRT_SS, sqrt, LLVMFloatType ())
 #endif
 INTRINS(SSE_RCP_PS, x86_sse_rcp_ps)
 INTRINS(SSE_RSQRT_PS, x86_sse_rsqrt_ps)
@@ -221,15 +225,15 @@ INTRINS(AESNI_AESENCLAST, x86_aesni_aesenclast)
 INTRINS(AESNI_AESIMC, x86_aesni_aesimc)
 #if LLVM_API_VERSION >= 800
        // these intrinsics were renamed in LLVM 8
-INTRINS_OVR(SSE_SADD_SATI8, sadd_sat)
-INTRINS_OVR(SSE_UADD_SATI8, uadd_sat)
-INTRINS_OVR(SSE_SADD_SATI16, sadd_sat)
-INTRINS_OVR(SSE_UADD_SATI16, uadd_sat)
+INTRINS_OVR(SSE_SADD_SATI8, sadd_sat, sse_i1_t)
+INTRINS_OVR(SSE_UADD_SATI8, uadd_sat, sse_i1_t)
+INTRINS_OVR(SSE_SADD_SATI16, sadd_sat, sse_i1_t)
+INTRINS_OVR(SSE_UADD_SATI16, uadd_sat, sse_i1_t)
 
-INTRINS_OVR(SSE_SSUB_SATI8, ssub_sat)
-INTRINS_OVR(SSE_USUB_SATI8, usub_sat)
-INTRINS_OVR(SSE_SSUB_SATI16, ssub_sat)
-INTRINS_OVR(SSE_USUB_SATI16, usub_sat)
+INTRINS_OVR(SSE_SSUB_SATI8, ssub_sat, sse_i2_t)
+INTRINS_OVR(SSE_USUB_SATI8, usub_sat, sse_i2_t)
+INTRINS_OVR(SSE_SSUB_SATI16, ssub_sat, sse_i2_t)
+INTRINS_OVR(SSE_USUB_SATI16, usub_sat, sse_i2_t)
 #else
 INTRINS(SSE_SADD_SATI8, x86_sse2_padds_b)
 INTRINS(SSE_UADD_SATI8, x86_sse2_paddus_b)
@@ -243,14 +247,14 @@ INTRINS(SSE_USUB_SATI16, x86_sse2_psubus_w)
 #endif
 #endif
 #if defined(TARGET_WASM) && LLVM_API_VERSION >= 800
-INTRINS_OVR(WASM_ANYTRUE_V16, wasm_anytrue)
-INTRINS_OVR(WASM_ANYTRUE_V8, wasm_anytrue)
-INTRINS_OVR(WASM_ANYTRUE_V4, wasm_anytrue)
-INTRINS_OVR(WASM_ANYTRUE_V2, wasm_anytrue)
+INTRINS_OVR(WASM_ANYTRUE_V16, wasm_anytrue,  sse_i1_t)
+INTRINS_OVR(WASM_ANYTRUE_V8, wasm_anytrue, sse_i2_t)
+INTRINS_OVR(WASM_ANYTRUE_V4, wasm_anytrue, sse_i4_t)
+INTRINS_OVR(WASM_ANYTRUE_V2, wasm_anytrue, sse_i8_t)
 #endif
 #if defined(TARGET_ARM64)
-INTRINS_OVR(BITREVERSE_I32, bitreverse)
-INTRINS_OVR(BITREVERSE_I64, bitreverse)
+INTRINS_OVR(BITREVERSE_I32, bitreverse, LLVMInt32Type ())
+INTRINS_OVR(BITREVERSE_I64, bitreverse, LLVMInt64Type ())
 INTRINS(AARCH64_CRC32B, aarch64_crc32b)
 INTRINS(AARCH64_CRC32H, aarch64_crc32h)
 INTRINS(AARCH64_CRC32W, aarch64_crc32w)
@@ -273,14 +277,16 @@ INTRINS(AARCH64_SHA256SU0, aarch64_crypto_sha256su0)
 INTRINS(AARCH64_SHA256SU1, aarch64_crypto_sha256su1)
 INTRINS(AARCH64_SHA256H, aarch64_crypto_sha256h)
 INTRINS(AARCH64_SHA256H2, aarch64_crypto_sha256h2)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_FLOAT, fabs)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_DOUBLE, fabs)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT8, aarch64_neon_abs)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT16, aarch64_neon_abs)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT32, aarch64_neon_abs)
-INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT64, aarch64_neon_abs)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_FLOAT, fabs, sse_r4_t)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_DOUBLE, fabs, sse_r8_t)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT8, aarch64_neon_abs, sse_i1_t)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT16, aarch64_neon_abs, sse_i2_t)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT32, aarch64_neon_abs, sse_i4_t)
+INTRINS_OVR(AARCH64_ADV_SIMD_ABS_INT64, aarch64_neon_abs, sse_i8_t)
 #endif
 
 #undef INTRINS
 #undef INTRINS_OVR
+#undef INTRINS_OVR_2_ARG
+#undef INTRINS_OVR_3_ARG
 
index 7d4d31b..b650b30 100644 (file)
@@ -633,7 +633,9 @@ get_intrins_id (IntrinsicId id)
        Intrinsic::ID intrins_id = Intrinsic::ID::not_intrinsic;
        switch (id) {
 #define INTRINS(id, llvm_id) case INTRINS_ ## id: intrins_id = Intrinsic::ID::llvm_id; break;
-#define INTRINS_OVR(id, llvm_id) case INTRINS_ ## id: intrins_id = Intrinsic::ID::llvm_id; break;
+#define INTRINS_OVR(id, llvm_id, ty) case INTRINS_ ## id: intrins_id = Intrinsic::ID::llvm_id; break;
+#define INTRINS_OVR_2_ARG(id, llvm_id, ty1, ty2) case INTRINS_ ## id: intrins_id = Intrinsic::ID::llvm_id; break;
+#define INTRINS_OVR_3_ARG(id, llvm_id, ty1, ty2, ty3) case INTRINS_ ## id: intrins_id = Intrinsic::ID::llvm_id; break;
 #include "llvm-intrinsics.h"
        default:
                break;
@@ -646,7 +648,9 @@ is_overloaded_intrins (IntrinsicId id)
 {
        switch (id) {
 #define INTRINS(id, llvm_id)
-#define INTRINS_OVR(id, llvm_id) case INTRINS_ ## id: return true;
+#define INTRINS_OVR(id, llvm_id, ty) case INTRINS_ ## id: return true;
+#define INTRINS_OVR_2_ARG(id, llvm_id, ty1, ty2) case INTRINS_ ## id: return true;
+#define INTRINS_OVR_3_ARG(id, llvm_id, ty1, ty2, ty3) case INTRINS_ ## id: return true;
 #include "llvm-intrinsics.h"
        default:
                break;
index b3288b2..b3de2ee 100644 (file)
@@ -24,11 +24,14 @@ G_BEGIN_DECLS
 
 typedef enum {
 #define INTRINS(id, llvm_id) INTRINS_ ## id,
-#define INTRINS_OVR(id, llvm_id) INTRINS_ ## id,
+#define INTRINS_OVR(id, llvm_id, ty) INTRINS_ ## id,
+#define INTRINS_OVR_2_ARG(id, llvm_id, ty1, ty2) INTRINS_ ## id,
+#define INTRINS_OVR_3_ARG(id, llvm_id, ty1, ty2, ty3) INTRINS_ ## id,
 #include "llvm-intrinsics.h"
        INTRINS_NUM
 } IntrinsicId;
 
+
 /*
  * Keep in sync with the enum in utils/mono-memory-model.h.
  */
index 81e9417..ee8adb6 100644 (file)
@@ -10470,154 +10470,12 @@ add_intrinsic (LLVMModuleRef module, int id)
 
        /* Register overloaded intrinsics */
        switch (id) {
-       case INTRINS_MEMSET:
-               intrins = add_intrins2 (module, id, LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type ());
-               break;
-       case INTRINS_MEMCPY:
-               intrins = add_intrins3 (module, id, LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type ());
-               break;
-       case INTRINS_MEMMOVE:
-               intrins = add_intrins3 (module, id, LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt64Type ());
-               break;
-       case INTRINS_SADD_OVF_I32:
-       case INTRINS_UADD_OVF_I32:
-       case INTRINS_SSUB_OVF_I32:
-       case INTRINS_USUB_OVF_I32:
-       case INTRINS_SMUL_OVF_I32:
-       case INTRINS_UMUL_OVF_I32:
-               intrins = add_intrins1 (module, id, LLVMInt32Type ());
-               break;
-       case INTRINS_SADD_OVF_I64:
-       case INTRINS_UADD_OVF_I64:
-       case INTRINS_SSUB_OVF_I64:
-       case INTRINS_USUB_OVF_I64:
-       case INTRINS_SMUL_OVF_I64:
-       case INTRINS_UMUL_OVF_I64:
-               intrins = add_intrins1 (module, id, LLVMInt64Type ());
-               break;
-       case INTRINS_FMA:
-       case INTRINS_EXP:
-       case INTRINS_LOG:
-       case INTRINS_LOG2:
-       case INTRINS_LOG10:
-       case INTRINS_TRUNC:
-       case INTRINS_SIN:
-       case INTRINS_COS:
-       case INTRINS_SQRT:
-       case INTRINS_FLOOR:
-       case INTRINS_CEIL:
-       case INTRINS_FABS:
-       case INTRINS_COPYSIGN:
-       case INTRINS_POW:
-               intrins = add_intrins1 (module, id, LLVMDoubleType ());
-               break;
-       case INTRINS_FMAF:
-       case INTRINS_EXPF:
-       case INTRINS_LOG2F:
-       case INTRINS_LOG10F:
-       case INTRINS_TRUNCF:
-       case INTRINS_SINF:
-       case INTRINS_COSF:
-       case INTRINS_SQRTF:
-       case INTRINS_FLOORF:
-       case INTRINS_CEILF:
-       case INTRINS_ABSF:
-       case INTRINS_COPYSIGNF:
-       case INTRINS_POWF:
-               intrins = add_intrins1 (module, id, LLVMFloatType ());
-               break;
-       case INTRINS_EXPECT_I8:
-               intrins = add_intrins1 (module, id, LLVMInt8Type ());
-               break;
-       case INTRINS_EXPECT_I1:
-               intrins = add_intrins1 (module, id, LLVMInt1Type ());
-               break;
-       case INTRINS_CTPOP_I32:
-       case INTRINS_CTLZ_I32:
-       case INTRINS_CTTZ_I32:
-       case INTRINS_BEXTR_I32:
-       case INTRINS_BZHI_I32:
-       case INTRINS_PEXT_I32:
-       case INTRINS_PDEP_I32:
-               intrins = add_intrins1 (module, id, LLVMInt32Type ());
-               break;
-       case INTRINS_CTPOP_I64:
-       case INTRINS_BEXTR_I64:
-       case INTRINS_BZHI_I64:
-       case INTRINS_PEXT_I64:
-       case INTRINS_PDEP_I64:
-       case INTRINS_CTLZ_I64:
-       case INTRINS_CTTZ_I64:
-               intrins = add_intrins1 (module, id, LLVMInt64Type ());
-               break;
-#if defined(TARGET_AMD64) || defined(TARGET_X86)
-       case INTRINS_SSE_SADD_SATI8:
-       case INTRINS_SSE_UADD_SATI8:
-       case INTRINS_SSE_SSUB_SATI8:
-       case INTRINS_SSE_USUB_SATI8:
-               intrins = add_intrins1 (module, id, sse_i1_t);
-               break;
-       case INTRINS_SSE_SADD_SATI16:
-       case INTRINS_SSE_UADD_SATI16:
-       case INTRINS_SSE_SSUB_SATI16:
-       case INTRINS_SSE_USUB_SATI16:
-               intrins = add_intrins1 (module, id, sse_i2_t);
-               break;
-#if LLVM_API_VERSION >= 700
-       case INTRINS_SSE_SQRT_PS:
-               intrins = add_intrins1 (module, id, sse_r4_t);
-               break;
-       case INTRINS_SSE_SQRT_PD:
-               intrins = add_intrins1 (module, id, sse_r8_t);
-               break;
-       case INTRINS_SSE_SQRT_SS:
-               intrins = add_intrins1 (module, id, LLVMFloatType ());
-               break;
-       case INTRINS_SSE_SQRT_SD:
-               intrins = add_intrins1 (module, id, LLVMDoubleType ());
-               break;
-#endif /* LLVM_API_VERSION >= 700 */
-#endif /* AMD64 || X86 */
-#if defined(TARGET_WASM) && LLVM_API_VERSION >= 800
-       case INTRINS_WASM_ANYTRUE_V16:
-               intrins = add_intrins1 (module, id, sse_i1_t);
-               break;
-       case INTRINS_WASM_ANYTRUE_V8:
-               intrins = add_intrins1 (module, id, sse_i2_t);
-               break;
-       case INTRINS_WASM_ANYTRUE_V4:
-               intrins = add_intrins1 (module, id, sse_i4_t);
-               break;
-       case INTRINS_WASM_ANYTRUE_V2:
-               intrins = add_intrins1 (module, id, sse_i8_t);
-               break;
-#endif
-#ifdef TARGET_ARM64    
-       case INTRINS_BITREVERSE_I32:    
-               intrins = add_intrins1 (module, id, LLVMInt32Type ());  
-               break;  
-       case INTRINS_BITREVERSE_I64:    
-               intrins = add_intrins1 (module, id, LLVMInt64Type ());  
-               break;  
-       case INTRINS_AARCH64_ADV_SIMD_ABS_FLOAT:
-               intrins = add_intrins1 (module, id, sse_r4_t);
-               break;
-       case INTRINS_AARCH64_ADV_SIMD_ABS_DOUBLE:
-               intrins = add_intrins1 (module, id, sse_r8_t);
-               break;
-       case INTRINS_AARCH64_ADV_SIMD_ABS_INT8:
-               intrins = add_intrins1 (module, id, sse_i1_t);
-               break;
-       case INTRINS_AARCH64_ADV_SIMD_ABS_INT16:
-               intrins = add_intrins1 (module, id, sse_i2_t);
-               break;
-       case INTRINS_AARCH64_ADV_SIMD_ABS_INT32:
-               intrins = add_intrins1 (module, id, sse_i4_t);
-               break;
-       case INTRINS_AARCH64_ADV_SIMD_ABS_INT64:
-               intrins = add_intrins1 (module, id, sse_i8_t);
-               break;
-#endif
+       #define INTRINS(intrin_name, llvm_id)
+       #define INTRINS_OVR(intrin_name, llvm_id, llvm_type) case INTRINS_ ## intrin_name: intrins = add_intrins1(module, id, llvm_type); break;
+       #define INTRINS_OVR_2_ARG(intrin_name, llvm_id, llvm_type1, llvm_type2) case INTRINS_ ## intrin_name: intrins = add_intrins2(module, id, llvm_type1, llvm_type2); break;
+       #define INTRINS_OVR_3_ARG(intrin_name, llvm_id, llvm_type1, llvm_type2, llvm_type3) case INTRINS_ ## intrin_name: intrins = add_intrins3(module, id, llvm_type1, llvm_type2, llvm_type3); break;
+       #include "llvm-intrinsics.h"
+
        default:
                g_assert_not_reached ();
                break;