diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -487,8 +487,12 @@ }]>; def DSubReg_i32_reg : SDNodeXFormgetTargetConstant(ARM::dsub_0 + N->getZExtValue()/2, SDLoc(N), - MVT::i32); + if (CurDAG->getDataLayout().isBigEndian()) + return CurDAG->getTargetConstant(ARM::dsub_1 - N->getZExtValue()/2, SDLoc(N), + MVT::i32); + else + return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/2, SDLoc(N), + MVT::i32); }]>; def DSubReg_f64_reg : SDNodeXForm %a) { +entry: +;CHECK-LABEL: ele0: +;CHECK-NEXT: .fnstart +;CHECK-NEXT: @ %bb.0: +;CHECK-NEXT: vrev64.32 q8, q0 +;CHECK-NEXT: vmov.32 r0, d16[1] +;CHECK-NEXT: bx lr + + %vget_lane = extractelement <4 x i32> %a, i64 3 + ret i32 %vget_lane +} + +define i32 @ele1(<4 x i32> %a) { +entry: +;CHECK-LABEL: ele1: +;CHECK-NEXT: .fnstart +;CHECK-NEXT: @ %bb.0: +;CHECK-NEXT: vrev64.32 q8, q0 +;CHECK-NEXT: vmov.32 r0, d16[0] +;CHECK-NEXT: bx lr + %vget_lane = extractelement <4 x i32> %a, i64 2 + ret i32 %vget_lane +} + +define i32 @ele2(<4 x i32> %a) { +entry: +;CHECK-LABEL: ele2: +;CHECK-NEXT: .fnstart +;CHECK-NEXT: @ %bb.0: +;CHECK-NEXT: vrev64.32 q8, q0 +;CHECK-NEXT: vmov.32 r0, d17[1] +;CHECK-NEXT: bx lr + %vget_lane = extractelement <4 x i32> %a, i64 1 + ret i32 %vget_lane +} + +define i32 @ele3(<4 x i32> %a) { +entry: +;CHECK-LABEL: ele3: +;CHECK-NEXT: .fnstart +;CHECK-NEXT: @ %bb.0: +;CHECK-NEXT: vrev64.32 q8, q0 +;CHECK-NEXT: vmov.32 r0, d17[0] +;CHECK-NEXT: bx lr + %vget_lane = extractelement <4 x i32> %a, i64 0 + ret i32 %vget_lane +}