diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-12-08 00:04:11 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-12-08 00:04:11 +0000 |
commit | 696e2d735c38eb73f1628d9b6166565fec4b9f1b (patch) | |
tree | a98a57f181e07d26a8b5610850a4616c129eb0d1 /utils | |
parent | 42dbfb96fce69ba7cf38a1c9c59ffa503ef70e18 (diff) | |
download | clang-696e2d735c38eb73f1628d9b6166565fec4b9f1b.tar.gz |
Merging r196535:
------------------------------------------------------------------------
r196535 | apazos | 2013-12-05 13:13:24 -0800 (Thu, 05 Dec 2013) | 1 line
Implemented vget/vset_lane_f16 intrinsics
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@196686 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/NeonEmitter.cpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index 420c5bc05b..b0939c9d00 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -154,7 +154,9 @@ enum OpKind { OpScalarQDMulHiLane, OpScalarQDMulHiLaneQ, OpScalarQRDMulHiLane, - OpScalarQRDMulHiLaneQ + OpScalarQRDMulHiLaneQ, + OpScalarGetLane, + OpScalarSetLane }; enum ClassKind { @@ -335,7 +337,8 @@ public: OpMap["OP_SCALAR_QDMULH_LNQ"] = OpScalarQDMulHiLaneQ; OpMap["OP_SCALAR_QRDMULH_LN"] = OpScalarQRDMulHiLane; OpMap["OP_SCALAR_QRDMULH_LNQ"] = OpScalarQRDMulHiLaneQ; - + OpMap["OP_SCALAR_GET_LN"] = OpScalarGetLane; + OpMap["OP_SCALAR_SET_LN"] = OpScalarSetLane; Record *SI = R.getClass("SInst"); Record *II = R.getClass("IInst"); @@ -2209,6 +2212,34 @@ static std::string GenOpString(const std::string &name, OpKind op, "vgetq_lane_" + typeCode + "(__b, __c));"; break; } + case OpScalarGetLane:{ + std::string typeCode = ""; + InstructionTypeCode(typestr, ClassS, quad, typeCode); + if (quad) { + s += "int16x8_t __a1 = vreinterpretq_s16_f16(__a);\\\n"; + s += " vgetq_lane_s16(__a1, __b);"; + } else { + s += "int16x4_t __a1 = vreinterpret_s16_f16(__a);\\\n"; + s += " vget_lane_s16(__a1, __b);"; + } + break; + } + case OpScalarSetLane:{ + std::string typeCode = ""; + InstructionTypeCode(typestr, ClassS, quad, typeCode); + s += "int16_t __a1 = (int16_t)__a;\\\n"; + if (quad) { + s += " int16x8_t __b1 = vreinterpretq_s16_f16(b);\\\n"; + s += " int16x8_t __b2 = vsetq_lane_s16(__a1, __b1, __c);\\\n"; + s += " vreinterpretq_f16_s16(__b2);"; + } else { + s += " int16x4_t __b1 = vreinterpret_s16_f16(b);\\\n"; + s += " int16x4_t __b2 = vset_lane_s16(__a1, __b1, __c);\\\n"; + s += " vreinterpret_f16_s16(__b2);"; + } + break; + } + default: PrintFatalError("unknown OpKind!"); } |