mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
[ARM] Use [SU]ABSDIFF nodes instead of intrinsics for VABD/VABA
No functional change, but it preps codegen for the future when SABSDIFF will start getting generated in anger. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242546 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
126ab2389e
commit
f5bdd93ff8
@ -142,6 +142,11 @@ void ARMTargetLowering::addTypeForNEON(MVT VT, MVT PromotedLdStVT,
|
||||
setOperationAction(ISD::SREM, VT, Expand);
|
||||
setOperationAction(ISD::UREM, VT, Expand);
|
||||
setOperationAction(ISD::FREM, VT, Expand);
|
||||
|
||||
if (VT.isInteger()) {
|
||||
setOperationAction(ISD::SABSDIFF, VT, Legal);
|
||||
setOperationAction(ISD::UABSDIFF, VT, Legal);
|
||||
}
|
||||
}
|
||||
|
||||
void ARMTargetLowering::addDRTypeForNEON(MVT VT) {
|
||||
@ -9717,6 +9722,15 @@ static SDValue PerformIntrinsicCombine(SDNode *N, SelectionDAG &DAG) {
|
||||
// Don't do anything for most intrinsics.
|
||||
break;
|
||||
|
||||
case Intrinsic::arm_neon_vabds:
|
||||
if (!N->getValueType(0).isInteger())
|
||||
return SDValue();
|
||||
return DAG.getNode(ISD::SABSDIFF, SDLoc(N), N->getValueType(0),
|
||||
N->getOperand(1), N->getOperand(2));
|
||||
case Intrinsic::arm_neon_vabdu:
|
||||
return DAG.getNode(ISD::UABSDIFF, SDLoc(N), N->getValueType(0),
|
||||
N->getOperand(1), N->getOperand(2));
|
||||
|
||||
// Vector shifts: check for immediate versions and lower them.
|
||||
// Note: This is done during DAG combining instead of DAG legalizing because
|
||||
// the build_vectors for 64-bit vector element shift counts are generally
|
||||
|
@ -4999,10 +4999,10 @@ def VBITq : N3VX<1, 0, 0b10, 0b0001, 1, 1,
|
||||
// VABD : Vector Absolute Difference
|
||||
defm VABDs : N3VInt_QHS<0, 0, 0b0111, 0, N3RegFrm,
|
||||
IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
|
||||
"vabd", "s", int_arm_neon_vabds, 1>;
|
||||
"vabd", "s", sabsdiff, 1>;
|
||||
defm VABDu : N3VInt_QHS<1, 0, 0b0111, 0, N3RegFrm,
|
||||
IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
|
||||
"vabd", "u", int_arm_neon_vabdu, 1>;
|
||||
"vabd", "u", uabsdiff, 1>;
|
||||
def VABDfd : N3VDInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBIND,
|
||||
"vabd", "f32", v2f32, v2f32, int_arm_neon_vabds, 1>;
|
||||
def VABDfq : N3VQInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBINQ,
|
||||
@ -5010,21 +5010,21 @@ def VABDfq : N3VQInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBINQ,
|
||||
|
||||
// VABDL : Vector Absolute Difference Long (Q = | D - D |)
|
||||
defm VABDLs : N3VLIntExt_QHS<0,1,0b0111,0, IIC_VSUBi4Q,
|
||||
"vabdl", "s", int_arm_neon_vabds, zext, 1>;
|
||||
"vabdl", "s", sabsdiff, zext, 1>;
|
||||
defm VABDLu : N3VLIntExt_QHS<1,1,0b0111,0, IIC_VSUBi4Q,
|
||||
"vabdl", "u", int_arm_neon_vabdu, zext, 1>;
|
||||
"vabdl", "u", uabsdiff, zext, 1>;
|
||||
|
||||
// VABA : Vector Absolute Difference and Accumulate
|
||||
defm VABAs : N3VIntOp_QHS<0,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
|
||||
"vaba", "s", int_arm_neon_vabds, add>;
|
||||
"vaba", "s", sabsdiff, add>;
|
||||
defm VABAu : N3VIntOp_QHS<1,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
|
||||
"vaba", "u", int_arm_neon_vabdu, add>;
|
||||
"vaba", "u", uabsdiff, add>;
|
||||
|
||||
// VABAL : Vector Absolute Difference and Accumulate Long (Q += | D - D |)
|
||||
defm VABALs : N3VLIntExtOp_QHS<0,1,0b0101,0, IIC_VABAD,
|
||||
"vabal", "s", int_arm_neon_vabds, zext, add>;
|
||||
"vabal", "s", sabsdiff, zext, add>;
|
||||
defm VABALu : N3VLIntExtOp_QHS<1,1,0b0101,0, IIC_VABAD,
|
||||
"vabal", "u", int_arm_neon_vabdu, zext, add>;
|
||||
"vabal", "u", uabsdiff, zext, add>;
|
||||
|
||||
// Vector Maximum and Minimum.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user