diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-12-08 00:02:12 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-12-08 00:02:12 +0000 |
commit | c5c84b8d634299f02b50ee0e36b58d53d5dd43b2 (patch) | |
tree | 428d1bbf17931ba1bc2a6f4f4ca32f2a8a8216d9 | |
parent | 8b7e12f54e3191f1492de2dd917c795393ab384a (diff) | |
download | clang-c5c84b8d634299f02b50ee0e36b58d53d5dd43b2.tar.gz clang-c5c84b8d634299f02b50ee0e36b58d53d5dd43b2.tar.bz2 clang-c5c84b8d634299f02b50ee0e36b58d53d5dd43b2.tar.xz |
Merging r196209:
------------------------------------------------------------------------
r196209 | haoliu | 2013-12-02 21:58:49 -0800 (Mon, 02 Dec 2013) | 3 lines
AArch64: add missing ACLE intrinsics mapping to general arithmetic operation from VFP instructions.
E.g. float64x1_t vadd_f64(float64x1_t a, float64x1_t b) -> FADD Dd, Dn, Dm.
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@196678 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/arm_neon.td | 36 | ||||
-rw-r--r-- | test/CodeGen/aarch64-neon-intrinsics.c | 90 |
2 files changed, 109 insertions, 17 deletions
diff --git a/include/clang/Basic/arm_neon.td b/include/clang/Basic/arm_neon.td index 8e7f6f5231..8349ba0cdd 100644 --- a/include/clang/Basic/arm_neon.td +++ b/include/clang/Basic/arm_neon.td @@ -603,20 +603,22 @@ def LD4_DUP : WInst<"vld4_dup", "4c", //////////////////////////////////////////////////////////////////////////////// // Addition -// With additional Qd type. -def ADD : IOpInst<"vadd", "ddd", "csilfUcUsUiUlQcQsQiQlQfQUcQUsQUiQUlQd", OP_ADD>; +// With additional d, Qd type. +def ADD : IOpInst<"vadd", "ddd", "csilfdUcUsUiUlQcQsQiQlQfQUcQUsQUiQUlQd", + OP_ADD>; //////////////////////////////////////////////////////////////////////////////// // Subtraction // With additional Qd type. -def SUB : IOpInst<"vsub", "ddd", "csilfUcUsUiUlQcQsQiQlQfQUcQUsQUiQUlQd", OP_SUB>; +def SUB : IOpInst<"vsub", "ddd", "csildfUcUsUiUlQcQsQiQlQfQUcQUsQUiQUlQd", + OP_SUB>; //////////////////////////////////////////////////////////////////////////////// // Multiplication // With additional Qd type. -def MUL : IOpInst<"vmul", "ddd", "csifUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MUL>; -def MLA : IOpInst<"vmla", "dddd", "csifUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MLA>; -def MLS : IOpInst<"vmls", "dddd", "csifUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MLS>; +def MUL : IOpInst<"vmul", "ddd", "csifdUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MUL>; +def MLA : IOpInst<"vmla", "dddd", "csifdUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MLA>; +def MLS : IOpInst<"vmls", "dddd", "csifdUcUsUiQcQsQiQfQUcQUsQUiQd", OP_MLS>; //////////////////////////////////////////////////////////////////////////////// // Multiplication Extended @@ -624,13 +626,13 @@ def MULX : SInst<"vmulx", "ddd", "fdQfQd">; //////////////////////////////////////////////////////////////////////////////// // Division -def FDIV : IOpInst<"vdiv", "ddd", "fQfQd", OP_DIV>; +def FDIV : IOpInst<"vdiv", "ddd", "fdQfQd", OP_DIV>; //////////////////////////////////////////////////////////////////////////////// // Vector fused multiply-add operations -// With additional Qd type. -def FMLA : SInst<"vfma", "dddd", "fQfQd">; -def FMLS : SInst<"vfms", "dddd", "fQfQd">; +// With additional d, Qd type. +def FMLA : SInst<"vfma", "dddd", "fdQfQd">; +def FMLS : SInst<"vfms", "dddd", "fdQfQd">; //////////////////////////////////////////////////////////////////////////////// // MUL, FMA, FMS definitions with scalar argument @@ -647,14 +649,14 @@ def BSL : SInst<"vbsl", "dudd", //////////////////////////////////////////////////////////////////////////////// // Absolute Difference // With additional Qd type. -def ABD : SInst<"vabd", "ddd", "csiUcUsUifQcQsQiQUcQUsQUiQfQd">; +def ABD : SInst<"vabd", "ddd", "csiUcUsUifdQcQsQiQUcQUsQUiQfQd">; //////////////////////////////////////////////////////////////////////////////// // saturating absolute/negate // With additional Qd/Ql type. -def ABS : SInst<"vabs", "dd", "csilfQcQsQiQfQlQd">; +def ABS : SInst<"vabs", "dd", "csilfdQcQsQiQfQlQd">; def QABS : SInst<"vqabs", "dd", "csilQcQsQiQl">; -def NEG : SOpInst<"vneg", "dd", "csilfQcQsQiQfQdQl", OP_NEG>; +def NEG : SOpInst<"vneg", "dd", "csilfdQcQsQiQfQdQl", OP_NEG>; def QNEG : SInst<"vqneg", "dd", "csilQcQsQiQl">; //////////////////////////////////////////////////////////////////////////////// @@ -756,13 +758,13 @@ def CMLT : SInst<"vcltz", "ud", "csifdQcQsQiQlQfQd">; //////////////////////////////////////////////////////////////////////////////// // Max/Min Integer // With additional Qd type. -def MAX : SInst<"vmax", "ddd", "csiUcUsUifQcQsQiQUcQUsQUiQfQd">; -def MIN : SInst<"vmin", "ddd", "csiUcUsUifQcQsQiQUcQUsQUiQfQd">; +def MAX : SInst<"vmax", "ddd", "csiUcUsUifdQcQsQiQUcQUsQUiQfQd">; +def MIN : SInst<"vmin", "ddd", "csiUcUsUifdQcQsQiQUcQUsQUiQfQd">; //////////////////////////////////////////////////////////////////////////////// // MaxNum/MinNum Floating Point -def FMAXNM : SInst<"vmaxnm", "ddd", "fQfQd">; -def FMINNM : SInst<"vminnm", "ddd", "fQfQd">; +def FMAXNM : SInst<"vmaxnm", "ddd", "fdQfQd">; +def FMINNM : SInst<"vminnm", "ddd", "fdQfQd">; //////////////////////////////////////////////////////////////////////////////// // Pairwise Max/Min diff --git a/test/CodeGen/aarch64-neon-intrinsics.c b/test/CodeGen/aarch64-neon-intrinsics.c index f0733c9626..e670d3395b 100644 --- a/test/CodeGen/aarch64-neon-intrinsics.c +++ b/test/CodeGen/aarch64-neon-intrinsics.c @@ -11369,3 +11369,93 @@ uint64_t test_vaddvq_u64(uint64x2_t a) { return vaddvq_u64(a); // CHECK: addp {{d[0-9]+}}, {{v[0-9]+}}.2d } + +float64x1_t test_vadd_f64(float64x1_t a, float64x1_t b) { + // CHECK-LABEL: test_vadd_f64 + return vadd_f64(a, b); + // CHECK: fadd d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmul_f64(float64x1_t a, float64x1_t b) { + // CHECK-LABEL: test_vmul_f64 + return vmul_f64(a, b); + // CHECK: fmul d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vdiv_f64(float64x1_t a, float64x1_t b) { + // CHECK-LABEL: test_vdiv_f64 + return vdiv_f64(a, b); + // CHECK: fdiv d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmla_f64(float64x1_t a, float64x1_t b, float64x1_t c) { + // CHECK-LABEL: test_vmla_f64 + return vmla_f64(a, b, c); + // CHECK: fmadd d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmls_f64(float64x1_t a, float64x1_t b, float64x1_t c) { + // CHECK-LABEL: test_vmls_f64 + return vmls_f64(a, b, c); + // CHECK: fmsub d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vfma_f64(float64x1_t a, float64x1_t b, float64x1_t c) { + // CHECK-LABEL: test_vfma_f64 + return vfma_f64(a, b, c); + // CHECK: fmadd d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vfms_f64(float64x1_t a, float64x1_t b, float64x1_t c) { + // CHECK-LABEL: test_vfms_f64 + return vfms_f64(a, b, c); + // CHECK: fmsub d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vsub_f64(float64x1_t a, float64x1_t b) { + // CHECK-LABEL: test_vsub_f64 + return vsub_f64(a, b); + // CHECK: fsub d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vabd_f64(float64x1_t a, float64x1_t b) { + // CHECK-LABEL: test_vabd_f64 + return vabd_f64(a, b); + // CHECK: fabd d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmax_f64(float64x1_t a, float64x1_t b) { +// CHECK-LABEL: test_vmax_f64 + return vmax_f64(a, b); +// CHECK: fmax d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmin_f64(float64x1_t a, float64x1_t b) { +// CHECK-LABEL: test_vmin_f64 + return vmin_f64(a, b); +// CHECK: fmin d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vmaxnm_f64(float64x1_t a, float64x1_t b) { +// CHECK-LABEL: test_vmaxnm_f64 + return vmaxnm_f64(a, b); +// CHECK: fmaxnm d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vminnm_f64(float64x1_t a, float64x1_t b) { +// CHECK-LABEL: test_vminnm_f64 + return vminnm_f64(a, b); +// CHECK: fminnm d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vabs_f64(float64x1_t a) { + // CHECK-LABEL: test_vabs_f64 + return vabs_f64(a); + // CHECK: fabs d{{[0-9]+}}, d{{[0-9]+}} +} + +float64x1_t test_vneg_f64(float64x1_t a) { + // CHECK-LABEL: test_vneg_f64 + return vneg_f64(a); + // CHECK: fneg d{{[0-9]+}}, d{{[0-9]+}} +} |