diff --git a/llvm/lib/Target/Hexagon/Disassembler/HexagonDisassembler.cpp b/llvm/lib/Target/Hexagon/Disassembler/HexagonDisassembler.cpp --- a/llvm/lib/Target/Hexagon/Disassembler/HexagonDisassembler.cpp +++ b/llvm/lib/Target/Hexagon/Disassembler/HexagonDisassembler.cpp @@ -512,6 +512,8 @@ const bool Rev = HexagonMCInstrInfo::IsReverseVecRegPair(Producer); const unsigned ProdPairIndex = Rev ? Producer - Hexagon::WR0 : Producer - Hexagon::W0; + if (Rev) + SubregBit = !SubregBit; Producer = (ProdPairIndex << 1) + SubregBit + Hexagon::V0; } else if (SubregBit) // Hexagon PRM 10.11 New-value operands diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp @@ -1028,8 +1028,10 @@ unsigned Producer2) { // If we're a single vector consumer of a double producer, set subreg bit // based on if we're accessing the lower or upper register component - if (IsVecRegPair(Producer) && IsVecRegSingle(Consumer)) - return (Consumer - Hexagon::V0) & 0x1; + if (IsVecRegPair(Producer) && IsVecRegSingle(Consumer)) { + unsigned Rev = IsReverseVecRegPair(Producer); + return ((Consumer - Hexagon::V0) & 0x1) ^ Rev; + } if (Producer2 != Hexagon::NoRegister) return Consumer == Producer; return 0; diff --git a/llvm/test/MC/Hexagon/hvx-nv-pair-reverse.s b/llvm/test/MC/Hexagon/hvx-nv-pair-reverse.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/Hexagon/hvx-nv-pair-reverse.s @@ -0,0 +1,18 @@ +# RUN: llvm-mc -arch=hexagon -mv69 -mhvx -filetype=obj %s | \ +# RUN: llvm-objdump --arch=hexagon --mcpu=hexagonv69 --mattr=+hvx -d - | \ +# RUN: FileCheck %s +# CHECK: 00000000 <.text>: + +{ + V4:5.w = vadd(V1:0.w, V3:2.w) + vmem(r0+#0) = v4.new +} +# CHECK-NEXT: 1c6240c5 { v4:5.w = vadd(v1:0.w,v3:2.w) +# CHECK-NEXT: 2820c023 vmem(r0+#0x0) = v4.new } + +{ + V4:5.w = vadd(V1:0.w, V3:2.w) + vmem(r0+#0) = v5.new +} +# CHECK-NEXT: 1c6240c5 { v4:5.w = vadd(v1:0.w,v3:2.w) +# CHECK-NEXT: 2820c022 vmem(r0+#0x0) = v5.new }