summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-12-01 04:35:05 +0000
committerBill Wendling <isanbard@gmail.com>2013-12-01 04:35:05 +0000
commite3b558de86b927e187f62cd2c6c17a966852255f (patch)
tree23d1f202877c03fc78925c176fddd5b95066946b
parent08efe365cc491ad289132cb9e286382eb0493753 (diff)
downloadclang-e3b558de86b927e187f62cd2c6c17a966852255f.tar.gz
clang-e3b558de86b927e187f62cd2c6c17a966852255f.tar.bz2
clang-e3b558de86b927e187f62cd2c6c17a966852255f.tar.xz
Merging r195943:
------------------------------------------------------------------------ r195943 | haoliu | 2013-11-28 18:31:42 -0800 (Thu, 28 Nov 2013) | 2 lines AArch64: Two intrinsics are expected to return float64 not float32 in arm_neon.h ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@196023 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/arm_neon.td5
-rw-r--r--utils/TableGen/NeonEmitter.cpp11
2 files changed, 11 insertions, 5 deletions
diff --git a/include/clang/Basic/arm_neon.td b/include/clang/Basic/arm_neon.td
index a658f8e1c1..300ca036fc 100644
--- a/include/clang/Basic/arm_neon.td
+++ b/include/clang/Basic/arm_neon.td
@@ -183,6 +183,7 @@ class NoTestOpInst<string n, string p, string t, Op o> : Inst<n, p, t, o> {}
// x: signed integer (int/float args)
// u: unsigned integer (int/float args)
// f: float (int args)
+// F: double (int args)
// d: default
// g: default, ignore 'Q' size modifier.
// j: default, force 'Q' size modifier.
@@ -679,7 +680,7 @@ def VCVT_HIGH_F32_F16 : SOpInst<"vcvt_high_f32", "wk", "h", OP_VCVT_EX_HI>;
def VCVT_F32_F64 : SInst<"vcvt_f32_f64", "fj", "d">;
def VCVT_HIGH_F32_F64 : SOpInst<"vcvt_high_f32", "qfj", "d", OP_VCVT_NA_HI>;
def VCVT_F64_F32 : SInst<"vcvt_f64", "wd", "f">;
-def VCVT_F64 : SInst<"vcvt_f64", "fd", "QlQUl">;
+def VCVT_F64 : SInst<"vcvt_f64", "Fd", "QlQUl">;
def VCVT_HIGH_F64_F32 : SOpInst<"vcvt_high_f64", "wj", "f", OP_VCVT_EX_HI>;
def VCVTX_F32_F64 : SInst<"vcvtx_f32", "fj", "d">;
def VCVTX_HIGH_F32_F64 : SOpInst<"vcvtx_high_f32", "qfj", "d", OP_VCVTX_HI>;
@@ -799,7 +800,7 @@ def QRSHRN_HIGH_N : SOpInst<"vqrshrn_high_n", "hmdi",
def VMOVL_HIGH : SOpInst<"vmovl_high", "nd", "HcHsHiHUcHUsHUi", OP_MOVL_HI>;
let isVCVT_N = 1 in {
-def CVTF_N_F64 : SInst<"vcvt_n_f64", "fdi", "QlQUl">;
+def CVTF_N_F64 : SInst<"vcvt_n_f64", "Fdi", "QlQUl">;
def FCVTZS_N_S64 : SInst<"vcvt_n_s64", "xdi", "Qd">;
def FCVTZS_N_U64 : SInst<"vcvt_n_u64", "udi", "Qd">;
}
diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp
index 467ff649da..912fb9d259 100644
--- a/utils/TableGen/NeonEmitter.cpp
+++ b/utils/TableGen/NeonEmitter.cpp
@@ -533,6 +533,10 @@ static char ModType(const char mod, char type, bool &quad, bool &poly,
type = 'f';
usgn = false;
break;
+ case 'F':
+ type = 'd';
+ usgn = false;
+ break;
case 'g':
quad = false;
break;
@@ -765,7 +769,7 @@ static std::string BuiltinTypeString(const char mod, StringRef typestr,
return "vv*"; // void result with void* first argument
if (mod == 'f' || (ck != ClassB && type == 'f'))
return quad ? "V4f" : "V2f";
- if (ck != ClassB && type == 'd')
+ if (mod == 'F' || (ck != ClassB && type == 'd'))
return quad ? "V2d" : "V1d";
if (ck != ClassB && type == 's')
return quad ? "V8s" : "V4s";
@@ -787,7 +791,7 @@ static std::string BuiltinTypeString(const char mod, StringRef typestr,
if (mod == 'f' || (ck != ClassB && type == 'f'))
return quad ? "V4f" : "V2f";
- if (ck != ClassB && type == 'd')
+ if (mod == 'F' || (ck != ClassB && type == 'd'))
return quad ? "V2d" : "V1d";
if (ck != ClassB && type == 's')
return quad ? "V8s" : "V4s";
@@ -1088,6 +1092,7 @@ static void NormalizeProtoForRegisterPatternCreation(const std::string &Name,
switch (Proto[i]) {
case 'u':
case 'f':
+ case 'F':
case 'd':
case 's':
case 'x':
@@ -2164,7 +2169,7 @@ static std::string GenOpString(const std::string &name, OpKind op,
static unsigned GetNeonEnum(const std::string &proto, StringRef typestr) {
unsigned mod = proto[0];
- if (mod == 'v' || mod == 'f')
+ if (mod == 'v' || mod == 'f' || mod == 'F')
mod = proto[1];
bool quad = false;