diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-03-02 17:50:24 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-03-02 17:50:24 +0000 |
commit | fcbb7d10fe777e2afba891c6e19ef0013c3f6963 (patch) | |
tree | 46dbda19565a61a9d89c71ff012e72b0c348c7ce | |
parent | db8425eff02c69e9f8e59603e1b2808dbed56823 (diff) | |
download | bcm5719-llvm-fcbb7d10fe777e2afba891c6e19ef0013c3f6963.tar.gz bcm5719-llvm-fcbb7d10fe777e2afba891c6e19ef0013c3f6963.zip |
[Hexagon] Properly handle 'q' constraint in 128-byte vector mode
llvm-svn: 296772
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLowering.cpp | 32 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/inline-asm-vecpred128.ll | 15 |
2 files changed, 25 insertions, 22 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index c38de2b7d46..0a5e9aed4f1 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -3057,37 +3057,25 @@ HexagonTargetLowering::getRegForInlineAsmConstraint( return std::make_pair(0U, &Hexagon::DoubleRegsRegClass); } case 'q': // q0-q3 - switch (VT.SimpleTy) { + switch (VT.getSizeInBits()) { default: - llvm_unreachable("getRegForInlineAsmConstraint Unhandled data type"); - case MVT::v1024i1: - case MVT::v512i1: - case MVT::v32i16: - case MVT::v16i32: - case MVT::v64i8: - case MVT::v8i64: + llvm_unreachable("getRegForInlineAsmConstraint Unhandled vector size"); + case 512: return std::make_pair(0U, &Hexagon::VecPredRegsRegClass); + case 1024: + return std::make_pair(0U, &Hexagon::VecPredRegs128BRegClass); } case 'v': // V0-V31 - switch (VT.SimpleTy) { + switch (VT.getSizeInBits()) { default: - llvm_unreachable("getRegForInlineAsmConstraint Unhandled data type"); - case MVT::v16i32: - case MVT::v32i16: - case MVT::v64i8: - case MVT::v8i64: + llvm_unreachable("getRegForInlineAsmConstraint Unhandled vector size"); + case 512: return std::make_pair(0U, &Hexagon::VectorRegsRegClass); - case MVT::v32i32: - case MVT::v64i16: - case MVT::v16i64: - case MVT::v128i8: + case 1024: if (Subtarget.hasV60TOps() && UseHVX && UseHVXDbl) return std::make_pair(0U, &Hexagon::VectorRegs128BRegClass); return std::make_pair(0U, &Hexagon::VecDblRegsRegClass); - case MVT::v256i8: - case MVT::v128i16: - case MVT::v64i32: - case MVT::v32i64: + case 2048: return std::make_pair(0U, &Hexagon::VecDblRegs128BRegClass); } diff --git a/llvm/test/CodeGen/Hexagon/inline-asm-vecpred128.ll b/llvm/test/CodeGen/Hexagon/inline-asm-vecpred128.ll new file mode 100644 index 00000000000..234f5a0b792 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/inline-asm-vecpred128.ll @@ -0,0 +1,15 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; REQUIRES: asserts + +; Make sure we can handle the 'q' constraint in the 128-byte mode. + +target triple = "hexagon" + +; CHECK-LABEL: fred +; CHECK: if (q{{[0-3]}}) vmem +define void @fred() #0 { + tail call void asm sideeffect "if ($0) vmem($1) = $2;", "q,r,v,~{memory}"(<32 x i32> undef, <32 x i32>* undef, <32 x i32> undef) #0 + ret void +} + +attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-double" } |