mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
Improve lowering of sext to i128 on SPU.
The old algorithm inserted a 'rotqmbyi' instruction which was both redundant and wrong - it made shufb select bytes from the wrong end of the input quad. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116701 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4cf34c6c04
commit
940e7965f1
@ -2642,11 +2642,16 @@ static SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG)
|
|||||||
DAG.getNode(SPUISD::PREFSLOT2VEC, dl, mvt, Op0, Op0),
|
DAG.getNode(SPUISD::PREFSLOT2VEC, dl, mvt, Op0, Op0),
|
||||||
DAG.getConstant(31, MVT::i32));
|
DAG.getConstant(31, MVT::i32));
|
||||||
|
|
||||||
|
// reinterpret as a i128 (SHUFB requires it). This gets lowered away.
|
||||||
|
SDValue extended = SDValue(DAG.getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
|
||||||
|
dl, Op0VT, Op0,
|
||||||
|
DAG.getTargetConstant(
|
||||||
|
SPU::GPRCRegClass.getID(),
|
||||||
|
MVT::i32)), 0);
|
||||||
// Shuffle bytes - Copy the sign bits into the upper 64 bits
|
// Shuffle bytes - Copy the sign bits into the upper 64 bits
|
||||||
// and the input value into the lower 64 bits.
|
// and the input value into the lower 64 bits.
|
||||||
SDValue extShuffle = DAG.getNode(SPUISD::SHUFB, dl, mvt,
|
SDValue extShuffle = DAG.getNode(SPUISD::SHUFB, dl, mvt,
|
||||||
DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i128, Op0), sraVal, shufMask);
|
extended, sraVal, shufMask);
|
||||||
|
|
||||||
return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i128, extShuffle);
|
return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i128, extShuffle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ entry:
|
|||||||
; CHECK: long 269488144
|
; CHECK: long 269488144
|
||||||
; CHECK: long 66051
|
; CHECK: long 66051
|
||||||
; CHECK: long 67438087
|
; CHECK: long 67438087
|
||||||
|
; CHECK-NOT: rotqmbyi
|
||||||
; CHECK: rotmai
|
; CHECK: rotmai
|
||||||
; CHECK: lqa
|
; CHECK: lqa
|
||||||
; CHECK: shufb
|
; CHECK: shufb
|
||||||
@ -25,6 +26,7 @@ entry:
|
|||||||
; CHECK: long 269488144
|
; CHECK: long 269488144
|
||||||
; CHECK: long 269488144
|
; CHECK: long 269488144
|
||||||
; CHECK: long 66051
|
; CHECK: long 66051
|
||||||
|
; CHECK-NOT: rotqmbyi
|
||||||
; CHECK: rotmai
|
; CHECK: rotmai
|
||||||
; CHECK: lqa
|
; CHECK: lqa
|
||||||
; CHECK: shufb
|
; CHECK: shufb
|
||||||
@ -39,6 +41,7 @@ entry:
|
|||||||
; CHECK: long 269488144
|
; CHECK: long 269488144
|
||||||
; CHECK: long 269488144
|
; CHECK: long 269488144
|
||||||
; CHECK: long 66051
|
; CHECK: long 66051
|
||||||
|
; CHECK-NOT: rotqmbyi
|
||||||
; CHECK: rotmai
|
; CHECK: rotmai
|
||||||
; CHECK: lqa
|
; CHECK: lqa
|
||||||
; CHECK: shufb
|
; CHECK: shufb
|
||||||
|
Loading…
Reference in New Issue
Block a user