mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[X86] Convert tbm_bextri_u32/tbm_bextri_u64 intrinsics TargetConstant argument to a regular Constant during lowering.
We reuse an ISD opcode here that can be reached from BMI that doesn't require it to be an immediate. Our isel patterns to match the TBM immediate form require a Constant and not a TargetConstant. We were accidentally getting the Constant due to a quirk of combineBEXTR calling SimplifyDemandedBits. The call to SimplifyDemandedBits ended up constant folding the TargetConstant to a regular Constant. But we should probably instead be asserting if SimplifyDemandedBits on a TargetConstant so we shouldn't rely on this behavior. llvm-svn: 372373
This commit is contained in:
parent
6eeb888361
commit
f67db4bbf1
@ -23398,6 +23398,16 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
return DAG.getNode(IntrData->Opc0, dl, Op.getValueType(),
|
||||
Op.getOperand(1), Op.getOperand(2), RoundingMode);
|
||||
}
|
||||
case BEXTRI: {
|
||||
assert(IntrData->Opc0 == X86ISD::BEXTR && "Unexpected opcode");
|
||||
|
||||
// The control is a TargetConstant, but we need to convert it to a
|
||||
// ConstantSDNode.
|
||||
uint64_t Imm = Op.getConstantOperandVal(2);
|
||||
SDValue Control = DAG.getConstant(Imm, dl, Op.getValueType());
|
||||
return DAG.getNode(IntrData->Opc0, dl, Op.getValueType(),
|
||||
Op.getOperand(1), Control);
|
||||
}
|
||||
// ADC/ADCX/SBB
|
||||
case ADX: {
|
||||
SDVTList CFVTs = DAG.getVTList(Op->getValueType(0), MVT::i32);
|
||||
|
@ -23,7 +23,7 @@ enum IntrinsicType : uint16_t {
|
||||
GATHER, SCATTER, PREFETCH, RDSEED, RDRAND, RDPMC, RDTSC, XTEST, XGETBV, ADX, FPCLASSS,
|
||||
INTR_TYPE_1OP, INTR_TYPE_2OP, INTR_TYPE_3OP, INTR_TYPE_4OP,
|
||||
INTR_TYPE_3OP_IMM8,
|
||||
CMP_MASK_CC,CMP_MASK_SCALAR_CC, VSHIFT, COMI, COMI_RM, BLENDV,
|
||||
CMP_MASK_CC,CMP_MASK_SCALAR_CC, VSHIFT, COMI, COMI_RM, BLENDV, BEXTRI,
|
||||
CVTPD2PS_MASK,
|
||||
INTR_TYPE_1OP_SAE, INTR_TYPE_2OP_SAE,
|
||||
INTR_TYPE_1OP_MASK_SAE, INTR_TYPE_2OP_MASK_SAE, INTR_TYPE_3OP_MASK_SAE,
|
||||
@ -1101,8 +1101,8 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
|
||||
X86_INTRINSIC_DATA(ssse3_pshuf_b_128, INTR_TYPE_2OP, X86ISD::PSHUFB, 0),
|
||||
X86_INTRINSIC_DATA(subborrow_32, ADX, X86ISD::SBB, X86ISD::SUB),
|
||||
X86_INTRINSIC_DATA(subborrow_64, ADX, X86ISD::SBB, X86ISD::SUB),
|
||||
X86_INTRINSIC_DATA(tbm_bextri_u32, INTR_TYPE_2OP, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(tbm_bextri_u64, INTR_TYPE_2OP, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(tbm_bextri_u32, BEXTRI, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(tbm_bextri_u64, BEXTRI, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(vcvtph2ps_128, INTR_TYPE_1OP, X86ISD::CVTPH2PS, 0),
|
||||
X86_INTRINSIC_DATA(vcvtph2ps_256, INTR_TYPE_1OP, X86ISD::CVTPH2PS, 0),
|
||||
X86_INTRINSIC_DATA(vcvtps2ph_128, INTR_TYPE_2OP, X86ISD::CVTPS2PH, 0),
|
||||
|
Loading…
Reference in New Issue
Block a user