forked from OSchip/llvm-project
[ARM] Match fminnum/fmaxnum for vector vminnm/vmaxnm instead of an intrinsic
Lower the intrinsic to a FMINNUM/FMAXNUM node and select that instead. This is important because soon SDAG will be able to select FMINNUM/FMAXNUM itself, so we need an integrated lowering path between SDAG and intrinsics. NFCI. llvm-svn: 244592
This commit is contained in:
parent
ea3a687a33
commit
ee868b2a3e
|
@ -934,6 +934,11 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
|
|||
setOperationAction(ISD::FRINT, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FMINNUM, MVT::v2f32, Legal);
|
||||
setOperationAction(ISD::FMAXNUM, MVT::v2f32, Legal);
|
||||
setOperationAction(ISD::FMINNUM, MVT::v4f32, Legal);
|
||||
setOperationAction(ISD::FMAXNUM, MVT::v4f32, Legal);
|
||||
|
||||
if (!Subtarget->isFPOnlySP()) {
|
||||
setOperationAction(ISD::FFLOOR, MVT::f64, Legal);
|
||||
setOperationAction(ISD::FCEIL, MVT::f64, Legal);
|
||||
|
@ -2791,6 +2796,13 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
|
|||
return DAG.getNode(NewOpc, SDLoc(Op), Op.getValueType(),
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
}
|
||||
case Intrinsic::arm_neon_vminnm:
|
||||
case Intrinsic::arm_neon_vmaxnm: {
|
||||
unsigned NewOpc = (IntNo == Intrinsic::arm_neon_vminnm)
|
||||
? ISD::FMINNUM : ISD::FMAXNUM;
|
||||
return DAG.getNode(NewOpc, SDLoc(Op), Op.getValueType(),
|
||||
Op.getOperand(1), Op.getOperand(2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5041,11 +5041,11 @@ def VMAXfq : N3VQInt<0, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VBINQ,
|
|||
let PostEncoderMethod = "NEONThumb2V8PostEncoder", DecoderNamespace = "v8NEON" in {
|
||||
def VMAXNMND : N3VDIntnp<0b00110, 0b00, 0b1111, 0, 1,
|
||||
N3RegFrm, NoItinerary, "vmaxnm", "f32",
|
||||
v2f32, v2f32, int_arm_neon_vmaxnm, 1>,
|
||||
v2f32, v2f32, fmaxnum, 1>,
|
||||
Requires<[HasV8, HasNEON]>;
|
||||
def VMAXNMNQ : N3VQIntnp<0b00110, 0b00, 0b1111, 1, 1,
|
||||
N3RegFrm, NoItinerary, "vmaxnm", "f32",
|
||||
v4f32, v4f32, int_arm_neon_vmaxnm, 1>,
|
||||
v4f32, v4f32, fmaxnum, 1>,
|
||||
Requires<[HasV8, HasNEON]>;
|
||||
}
|
||||
|
||||
|
@ -5067,11 +5067,11 @@ def VMINfq : N3VQInt<0, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VBINQ,
|
|||
let PostEncoderMethod = "NEONThumb2V8PostEncoder", DecoderNamespace = "v8NEON" in {
|
||||
def VMINNMND : N3VDIntnp<0b00110, 0b10, 0b1111, 0, 1,
|
||||
N3RegFrm, NoItinerary, "vminnm", "f32",
|
||||
v2f32, v2f32, int_arm_neon_vminnm, 1>,
|
||||
v2f32, v2f32, fminnum, 1>,
|
||||
Requires<[HasV8, HasNEON]>;
|
||||
def VMINNMNQ : N3VQIntnp<0b00110, 0b10, 0b1111, 1, 1,
|
||||
N3RegFrm, NoItinerary, "vminnm", "f32",
|
||||
v4f32, v4f32, int_arm_neon_vminnm, 1>,
|
||||
v4f32, v4f32, fminnum, 1>,
|
||||
Requires<[HasV8, HasNEON]>;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue