mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Let the immediate leaf pattern take transforms and switch the signed
immediate patterns in arm to using the pattern. Handles rdar://9299434 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130386 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4c19b17a17
commit
8f232d307a
@ -543,8 +543,8 @@ class PatLeaf<dag frag, code pred = [{}], SDNodeXForm xform = NOOP_SDNodeXForm>
|
||||
// If FastIsel should ignore all instructions that have an operand of this type,
|
||||
// the FastIselShouldIgnore flag can be set. This is an optimization to reduce
|
||||
// the code size of the generated fast instruction selector.
|
||||
class ImmLeaf<ValueType vt, code pred>
|
||||
: PatFrag<(ops), (vt imm)> {
|
||||
class ImmLeaf<ValueType vt, code pred, SDNodeXForm xform = NOOP_SDNodeXForm>
|
||||
: PatFrag<(ops), (vt imm), [{}], xform> {
|
||||
let ImmediateCode = pred;
|
||||
bit FastIselShouldIgnore = 0;
|
||||
}
|
||||
|
@ -203,13 +203,13 @@ def so_imm_not_XFORM : SDNodeXForm<imm, [{
|
||||
}]>;
|
||||
|
||||
/// imm1_15 predicate - True if the 32-bit immediate is in the range [1,15].
|
||||
def imm1_15 : PatLeaf<(i32 imm), [{
|
||||
return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 16;
|
||||
def imm1_15 : ImmLeaf<i32, [{
|
||||
return (int32_t)Imm >= 1 && (int32_t)Imm < 16;
|
||||
}]>;
|
||||
|
||||
/// imm16_31 predicate - True if the 32-bit immediate is in the range [16,31].
|
||||
def imm16_31 : PatLeaf<(i32 imm), [{
|
||||
return (int32_t)N->getZExtValue() >= 16 && (int32_t)N->getZExtValue() < 32;
|
||||
def imm16_31 : ImmLeaf<i32, [{
|
||||
return (int32_t)Imm >= 16 && (int32_t)Imm < 32;
|
||||
}]>;
|
||||
|
||||
def so_imm_neg :
|
||||
@ -239,8 +239,8 @@ def lo16AllZero : PatLeaf<(i32 imm), [{
|
||||
|
||||
/// imm0_65535 predicate - True if the 32-bit immediate is in the range
|
||||
/// [0.65535].
|
||||
def imm0_65535 : PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)N->getZExtValue() < 65536;
|
||||
def imm0_65535 : ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 65536;
|
||||
}]>;
|
||||
|
||||
class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
|
||||
@ -375,8 +375,8 @@ def neon_vcvt_imm32 : Operand<i32> {
|
||||
}
|
||||
|
||||
// rot_imm: An integer that encodes a rotate amount. Must be 8, 16, or 24.
|
||||
def rot_imm : Operand<i32>, PatLeaf<(i32 imm), [{
|
||||
int32_t v = (int32_t)N->getZExtValue();
|
||||
def rot_imm : Operand<i32>, ImmLeaf<i32, [{
|
||||
int32_t v = (int32_t)Imm;
|
||||
return v == 8 || v == 16 || v == 24; }]> {
|
||||
let EncoderMethod = "getRotImmOpValue";
|
||||
}
|
||||
@ -433,13 +433,13 @@ def arm_i32imm : PatLeaf<(imm), [{
|
||||
}]>;
|
||||
|
||||
/// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].
|
||||
def imm0_31 : Operand<i32>, PatLeaf<(imm), [{
|
||||
return (int32_t)N->getZExtValue() < 32;
|
||||
def imm0_31 : Operand<i32>, ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 32;
|
||||
}]>;
|
||||
|
||||
/// imm0_31_m1 - Matches and prints like imm0_31, but encodes as 'value - 1'.
|
||||
def imm0_31_m1 : Operand<i32>, PatLeaf<(imm), [{
|
||||
return (int32_t)N->getZExtValue() < 32;
|
||||
def imm0_31_m1 : Operand<i32>, ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 32;
|
||||
}]> {
|
||||
let EncoderMethod = "getImmMinusOneOpValue";
|
||||
}
|
||||
@ -462,13 +462,13 @@ def bf_inv_mask_imm : Operand<i32>,
|
||||
}
|
||||
|
||||
/// lsb_pos_imm - position of the lsb bit, used by BFI4p and t2BFI4p
|
||||
def lsb_pos_imm : Operand<i32>, PatLeaf<(imm), [{
|
||||
return isInt<5>(N->getSExtValue());
|
||||
def lsb_pos_imm : Operand<i32>, ImmLeaf<i32, [{
|
||||
return isInt<5>(Imm);
|
||||
}]>;
|
||||
|
||||
/// width_imm - number of bits to be copied, used by BFI4p and t2BFI4p
|
||||
def width_imm : Operand<i32>, PatLeaf<(imm), [{
|
||||
return N->getSExtValue() > 0 && N->getSExtValue() <= 32;
|
||||
def width_imm : Operand<i32>, ImmLeaf<i32, [{
|
||||
return Imm > 0 && Imm <= 32;
|
||||
}] > {
|
||||
let EncoderMethod = "getMsbOpValue";
|
||||
}
|
||||
@ -3021,8 +3021,8 @@ def lsl_shift_imm : SDNodeXForm<imm, [{
|
||||
return CurDAG->getTargetConstant(Sh, MVT::i32);
|
||||
}]>;
|
||||
|
||||
def lsl_amt : PatLeaf<(i32 imm), [{
|
||||
return (N->getZExtValue() < 32);
|
||||
def lsl_amt : ImmLeaf<i32, [{
|
||||
return Imm > 0 && Imm < 32;
|
||||
}], lsl_shift_imm>;
|
||||
|
||||
def PKHBT : APKHI<0b01101000, 0, (outs GPR:$Rd),
|
||||
@ -3044,8 +3044,8 @@ def asr_shift_imm : SDNodeXForm<imm, [{
|
||||
return CurDAG->getTargetConstant(Sh, MVT::i32);
|
||||
}]>;
|
||||
|
||||
def asr_amt : PatLeaf<(i32 imm), [{
|
||||
return (N->getZExtValue() <= 32);
|
||||
def asr_amt : ImmLeaf<i32, [{
|
||||
return Imm > 0 && Imm <= 32;
|
||||
}], asr_shift_imm>;
|
||||
|
||||
// Note: Shifts of 1-15 bits will be transformed to srl instead of sra and
|
||||
|
@ -27,22 +27,22 @@ def imm_comp_XFORM : SDNodeXForm<imm, [{
|
||||
}]>;
|
||||
|
||||
/// imm0_7 predicate - True if the 32-bit immediate is in the range [0,7].
|
||||
def imm0_7 : PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)N->getZExtValue() < 8;
|
||||
def imm0_7 : ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 8;
|
||||
}]>;
|
||||
def imm0_7_neg : PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)-N->getZExtValue() < 8;
|
||||
}], imm_neg_XFORM>;
|
||||
|
||||
def imm0_255 : PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)N->getZExtValue() < 256;
|
||||
def imm0_255 : ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 256;
|
||||
}]>;
|
||||
def imm0_255_comp : PatLeaf<(i32 imm), [{
|
||||
return ~((uint32_t)N->getZExtValue()) < 256;
|
||||
}]>;
|
||||
|
||||
def imm8_255 : PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)N->getZExtValue() >= 8 && (uint32_t)N->getZExtValue() < 256;
|
||||
def imm8_255 : ImmLeaf<i32, [{
|
||||
return Imm >= 8 && Imm < 256;
|
||||
}]>;
|
||||
def imm8_255_neg : PatLeaf<(i32 imm), [{
|
||||
unsigned Val = -N->getZExtValue();
|
||||
|
@ -62,14 +62,14 @@ def t2_so_imm_neg : Operand<i32>,
|
||||
}], t2_so_imm_neg_XFORM>;
|
||||
|
||||
/// imm1_31 predicate - True if the 32-bit immediate is in the range [1,31].
|
||||
def imm1_31 : PatLeaf<(i32 imm), [{
|
||||
return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 32;
|
||||
def imm1_31 : ImmLeaf<i32, [{
|
||||
return (int32_t)Imm >= 1 && (int32_t)Imm < 32;
|
||||
}]>;
|
||||
|
||||
/// imm0_4095 predicate - True if the 32-bit immediate is in the range [0.4095].
|
||||
def imm0_4095 : Operand<i32>,
|
||||
PatLeaf<(i32 imm), [{
|
||||
return (uint32_t)N->getZExtValue() < 4096;
|
||||
ImmLeaf<i32, [{
|
||||
return Imm >= 0 && Imm < 4096;
|
||||
}]>;
|
||||
|
||||
def imm0_4095_neg : PatLeaf<(i32 imm), [{
|
||||
|
Loading…
Reference in New Issue
Block a user