From f770b44c6e1a8f5db5e00b32df5745cb8a3f1e9d Mon Sep 17 00:00:00 2001 From: Hao Liu Date: Fri, 29 Nov 2013 02:31:42 +0000 Subject: [PATCH] AArch64: Two intrinsics are expected to return float64 not float32 in arm_neon.h git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195943 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/arm_neon.td | 5 +++-- utils/TableGen/NeonEmitter.cpp | 11 ++++++++--- 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 : Inst {} // 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 10b428d934..4aa431ed5e 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': @@ -2163,7 +2168,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; -- 2.40.0