@@ -605,16 +605,16 @@ def invalid_node : SDNode<"<<invalid_node>>", SDTIntLeaf,[],"<<invalid_node>>">;
605605
606606
607607def Xi8 : X86TypeInfo<i8, "b", GR8, loadi8, i8mem,
608- Imm8, i8imm, imm_su , i8imm, invalid_node,
608+ Imm8, i8imm, relocImm8_su , i8imm, invalid_node,
609609 0, OpSizeFixed, 0>;
610610def Xi16 : X86TypeInfo<i16, "w", GR16, loadi16, i16mem,
611- Imm16, i16imm, imm_su , i16i8imm, i16immSExt8_su,
611+ Imm16, i16imm, relocImm16_su , i16i8imm, i16immSExt8_su,
612612 1, OpSize16, 0>;
613613def Xi32 : X86TypeInfo<i32, "l", GR32, loadi32, i32mem,
614- Imm32, i32imm, imm_su , i32i8imm, i32immSExt8_su,
614+ Imm32, i32imm, relocImm32_su , i32i8imm, i32immSExt8_su,
615615 1, OpSize32, 0>;
616616def Xi64 : X86TypeInfo<i64, "q", GR64, loadi64, i64mem,
617- Imm32S, i64i32imm, i64immSExt32_su , i64i8imm, i64immSExt8_su,
617+ Imm32S, i64i32imm, i64relocImmSExt32_su , i64i8imm, i64immSExt8_su,
618618 1, OpSizeFixed, 1>;
619619
620620/// ITy - This instruction base class takes the type info for the instruction.
@@ -1217,146 +1217,6 @@ def : Pat<(store (X86adc_flag GR64:$src, (loadi64 addr:$dst), EFLAGS),
12171217 addr:$dst),
12181218 (ADC64mr addr:$dst, GR64:$src)>;
12191219
1220- // Patterns for basic arithmetic ops with relocImm for the immediate field.
1221- multiclass ArithBinOp_RF_relocImm_Pats<SDNode OpNodeFlag, SDNode OpNode> {
1222- def : Pat<(OpNodeFlag GR8:$src1, relocImm8_su:$src2),
1223- (!cast<Instruction>(NAME#"8ri") GR8:$src1, relocImm8_su:$src2)>;
1224- def : Pat<(OpNodeFlag GR16:$src1, i16relocImmSExt8_su:$src2),
1225- (!cast<Instruction>(NAME#"16ri8") GR16:$src1, i16relocImmSExt8_su:$src2)>;
1226- def : Pat<(OpNodeFlag GR16:$src1, relocImm16_su:$src2),
1227- (!cast<Instruction>(NAME#"16ri") GR16:$src1, relocImm16_su:$src2)>;
1228- def : Pat<(OpNodeFlag GR32:$src1, i32relocImmSExt8_su:$src2),
1229- (!cast<Instruction>(NAME#"32ri8") GR32:$src1, i32relocImmSExt8_su:$src2)>;
1230- def : Pat<(OpNodeFlag GR32:$src1, relocImm32_su:$src2),
1231- (!cast<Instruction>(NAME#"32ri") GR32:$src1, relocImm32_su:$src2)>;
1232- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt8_su:$src2),
1233- (!cast<Instruction>(NAME#"64ri8") GR64:$src1, i64relocImmSExt8_su:$src2)>;
1234- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt32_su:$src2),
1235- (!cast<Instruction>(NAME#"64ri32") GR64:$src1, i64relocImmSExt32_su:$src2)>;
1236-
1237- def : Pat<(store (OpNode (load addr:$dst), relocImm8_su:$src), addr:$dst),
1238- (!cast<Instruction>(NAME#"8mi") addr:$dst, relocImm8_su:$src)>;
1239- def : Pat<(store (OpNode (load addr:$dst), i16relocImmSExt8_su:$src), addr:$dst),
1240- (!cast<Instruction>(NAME#"16mi8") addr:$dst, i16relocImmSExt8_su:$src)>;
1241- def : Pat<(store (OpNode (load addr:$dst), relocImm16_su:$src), addr:$dst),
1242- (!cast<Instruction>(NAME#"16mi") addr:$dst, relocImm16_su:$src)>;
1243- def : Pat<(store (OpNode (load addr:$dst), i32relocImmSExt8_su:$src), addr:$dst),
1244- (!cast<Instruction>(NAME#"32mi8") addr:$dst, i32relocImmSExt8_su:$src)>;
1245- def : Pat<(store (OpNode (load addr:$dst), relocImm32_su:$src), addr:$dst),
1246- (!cast<Instruction>(NAME#"32mi") addr:$dst, relocImm32_su:$src)>;
1247- def : Pat<(store (OpNode (load addr:$dst), i64relocImmSExt8_su:$src), addr:$dst),
1248- (!cast<Instruction>(NAME#"64mi8") addr:$dst, i64relocImmSExt8_su:$src)>;
1249- def : Pat<(store (OpNode (load addr:$dst), i64relocImmSExt32_su:$src), addr:$dst),
1250- (!cast<Instruction>(NAME#"64mi32") addr:$dst, i64relocImmSExt32_su:$src)>;
1251- }
1252-
1253- multiclass ArithBinOp_RFF_relocImm_Pats<SDNode OpNodeFlag> {
1254- def : Pat<(OpNodeFlag GR8:$src1, relocImm8_su:$src2, EFLAGS),
1255- (!cast<Instruction>(NAME#"8ri") GR8:$src1, relocImm8_su:$src2)>;
1256- def : Pat<(OpNodeFlag GR16:$src1, i16relocImmSExt8_su:$src2, EFLAGS),
1257- (!cast<Instruction>(NAME#"16ri8") GR16:$src1, i16relocImmSExt8_su:$src2)>;
1258- def : Pat<(OpNodeFlag GR16:$src1, relocImm16_su:$src2, EFLAGS),
1259- (!cast<Instruction>(NAME#"16ri") GR16:$src1, relocImm16_su:$src2)>;
1260- def : Pat<(OpNodeFlag GR32:$src1, i32relocImmSExt8_su:$src2, EFLAGS),
1261- (!cast<Instruction>(NAME#"32ri8") GR32:$src1, i32relocImmSExt8_su:$src2)>;
1262- def : Pat<(OpNodeFlag GR32:$src1, relocImm32_su:$src2, EFLAGS),
1263- (!cast<Instruction>(NAME#"32ri") GR32:$src1, relocImm32_su:$src2)>;
1264- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt8_su:$src2, EFLAGS),
1265- (!cast<Instruction>(NAME#"64ri8") GR64:$src1, i64relocImmSExt8_su:$src2)>;
1266- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt32_su:$src2, EFLAGS),
1267- (!cast<Instruction>(NAME#"64ri32") GR64:$src1, i64relocImmSExt32_su:$src2)>;
1268-
1269- def : Pat<(store (OpNodeFlag (load addr:$dst), relocImm8_su:$src, EFLAGS), addr:$dst),
1270- (!cast<Instruction>(NAME#"8mi") addr:$dst, relocImm8_su:$src)>;
1271- def : Pat<(store (OpNodeFlag (load addr:$dst), i16relocImmSExt8_su:$src, EFLAGS), addr:$dst),
1272- (!cast<Instruction>(NAME#"16mi8") addr:$dst, i16relocImmSExt8_su:$src)>;
1273- def : Pat<(store (OpNodeFlag (load addr:$dst), relocImm16_su:$src, EFLAGS), addr:$dst),
1274- (!cast<Instruction>(NAME#"16mi") addr:$dst, relocImm16_su:$src)>;
1275- def : Pat<(store (OpNodeFlag (load addr:$dst), i32relocImmSExt8_su:$src, EFLAGS), addr:$dst),
1276- (!cast<Instruction>(NAME#"32mi8") addr:$dst, i32relocImmSExt8_su:$src)>;
1277- def : Pat<(store (OpNodeFlag (load addr:$dst), relocImm32_su:$src, EFLAGS), addr:$dst),
1278- (!cast<Instruction>(NAME#"32mi") addr:$dst, relocImm32_su:$src)>;
1279- def : Pat<(store (OpNodeFlag (load addr:$dst), i64relocImmSExt8_su:$src, EFLAGS), addr:$dst),
1280- (!cast<Instruction>(NAME#"64mi8") addr:$dst, i64relocImmSExt8_su:$src)>;
1281- def : Pat<(store (OpNodeFlag (load addr:$dst), i64relocImmSExt32_su:$src, EFLAGS), addr:$dst),
1282- (!cast<Instruction>(NAME#"64mi32") addr:$dst, i64relocImmSExt32_su:$src)>;
1283- }
1284-
1285- multiclass ArithBinOp_F_relocImm_Pats<SDNode OpNodeFlag> {
1286- def : Pat<(OpNodeFlag GR8:$src1, relocImm8_su:$src2),
1287- (!cast<Instruction>(NAME#"8ri") GR8:$src1, relocImm8_su:$src2)>;
1288- def : Pat<(OpNodeFlag GR16:$src1, i16relocImmSExt8_su:$src2),
1289- (!cast<Instruction>(NAME#"16ri8") GR16:$src1, i16relocImmSExt8_su:$src2)>;
1290- def : Pat<(OpNodeFlag GR16:$src1, relocImm16_su:$src2),
1291- (!cast<Instruction>(NAME#"16ri") GR16:$src1, relocImm16_su:$src2)>;
1292- def : Pat<(OpNodeFlag GR32:$src1, i32relocImmSExt8_su:$src2),
1293- (!cast<Instruction>(NAME#"32ri8") GR32:$src1, i32relocImmSExt8_su:$src2)>;
1294- def : Pat<(OpNodeFlag GR32:$src1, relocImm32_su:$src2),
1295- (!cast<Instruction>(NAME#"32ri") GR32:$src1, relocImm32_su:$src2)>;
1296- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt8_su:$src2),
1297- (!cast<Instruction>(NAME#"64ri8") GR64:$src1, i64relocImmSExt8_su:$src2)>;
1298- def : Pat<(OpNodeFlag GR64:$src1, i64relocImmSExt32_su:$src2),
1299- (!cast<Instruction>(NAME#"64ri32") GR64:$src1, i64relocImmSExt32_su:$src2)>;
1300-
1301- def : Pat<(OpNodeFlag (loadi8 addr:$src1), relocImm8_su:$src2),
1302- (!cast<Instruction>(NAME#"8mi") addr:$src1, relocImm8_su:$src2)>;
1303- def : Pat<(OpNodeFlag (loadi16 addr:$src1), i16relocImmSExt8_su:$src2),
1304- (!cast<Instruction>(NAME#"16mi8") addr:$src1, i16relocImmSExt8_su:$src2)>;
1305- def : Pat<(OpNodeFlag (loadi16 addr:$src1), relocImm16_su:$src2),
1306- (!cast<Instruction>(NAME#"16mi") addr:$src1, relocImm16_su:$src2)>;
1307- def : Pat<(OpNodeFlag (loadi32 addr:$src1), i32relocImmSExt8_su:$src2),
1308- (!cast<Instruction>(NAME#"32mi8") addr:$src1, i32relocImmSExt8_su:$src2)>;
1309- def : Pat<(OpNodeFlag (loadi32 addr:$src1), relocImm32_su:$src2),
1310- (!cast<Instruction>(NAME#"32mi") addr:$src1, relocImm32_su:$src2)>;
1311- def : Pat<(OpNodeFlag (loadi64 addr:$src1), i64relocImmSExt8_su:$src2),
1312- (!cast<Instruction>(NAME#"64mi8") addr:$src1, i64relocImmSExt8_su:$src2)>;
1313- def : Pat<(OpNodeFlag (loadi64 addr:$src1), i64relocImmSExt32_su:$src2),
1314- (!cast<Instruction>(NAME#"64mi32") addr:$src1, i64relocImmSExt32_su:$src2)>;
1315- }
1316-
1317- defm AND : ArithBinOp_RF_relocImm_Pats<X86and_flag, and>;
1318- defm OR : ArithBinOp_RF_relocImm_Pats<X86or_flag, or>;
1319- defm XOR : ArithBinOp_RF_relocImm_Pats<X86xor_flag, xor>;
1320- defm ADD : ArithBinOp_RF_relocImm_Pats<X86add_flag, add>;
1321- defm SUB : ArithBinOp_RF_relocImm_Pats<X86sub_flag, sub>;
1322-
1323- defm ADC : ArithBinOp_RFF_relocImm_Pats<X86adc_flag>;
1324- defm SBB : ArithBinOp_RFF_relocImm_Pats<X86sbb_flag>;
1325-
1326- defm CMP : ArithBinOp_F_relocImm_Pats<X86cmp>;
1327-
1328- // ADC is commutable, but we can't indicate that to tablegen. So manually
1329- // reverse the operands.
1330- def : Pat<(X86adc_flag GR8:$src1, relocImm8_su:$src2, EFLAGS),
1331- (ADC8ri relocImm8_su:$src2, GR8:$src1)>;
1332- def : Pat<(X86adc_flag i16relocImmSExt8_su:$src2, GR16:$src1, EFLAGS),
1333- (ADC16ri8 GR16:$src1, i16relocImmSExt8_su:$src2)>;
1334- def : Pat<(X86adc_flag relocImm16_su:$src2, GR16:$src1, EFLAGS),
1335- (ADC16ri GR16:$src1, relocImm16_su:$src2)>;
1336- def : Pat<(X86adc_flag i32relocImmSExt8_su:$src2, GR32:$src1, EFLAGS),
1337- (ADC32ri8 GR32:$src1, i32relocImmSExt8_su:$src2)>;
1338- def : Pat<(X86adc_flag relocImm32_su:$src2, GR32:$src1, EFLAGS),
1339- (ADC32ri GR32:$src1, relocImm32_su:$src2)>;
1340- def : Pat<(X86adc_flag i64relocImmSExt8_su:$src2, GR64:$src1, EFLAGS),
1341- (ADC64ri8 GR64:$src1, i64relocImmSExt8_su:$src2)>;
1342- def : Pat<(X86adc_flag i64relocImmSExt32_su:$src2, GR64:$src1, EFLAGS),
1343- (ADC64ri32 GR64:$src1, i64relocImmSExt32_su:$src2)>;
1344-
1345- def : Pat<(store (X86adc_flag relocImm8_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1346- (ADC8mi addr:$dst, relocImm8_su:$src)>;
1347- def : Pat<(store (X86adc_flag i16relocImmSExt8_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1348- (ADC16mi8 addr:$dst, i16relocImmSExt8_su:$src)>;
1349- def : Pat<(store (X86adc_flag relocImm16_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1350- (ADC16mi addr:$dst, relocImm16_su:$src)>;
1351- def : Pat<(store (X86adc_flag i32relocImmSExt8_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1352- (ADC32mi8 addr:$dst, i32relocImmSExt8_su:$src)>;
1353- def : Pat<(store (X86adc_flag relocImm32_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1354- (ADC32mi addr:$dst, relocImm32_su:$src)>;
1355- def : Pat<(store (X86adc_flag i64relocImmSExt8_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1356- (ADC64mi8 addr:$dst, i64relocImmSExt8_su:$src)>;
1357- def : Pat<(store (X86adc_flag i64relocImmSExt32_su:$src, (load addr:$dst), EFLAGS), addr:$dst),
1358- (ADC64mi32 addr:$dst, i64relocImmSExt32_su:$src)>;
1359-
13601220//===----------------------------------------------------------------------===//
13611221// Semantically, test instructions are similar like AND, except they don't
13621222// generate a result. From an encoding perspective, they are very different:
@@ -1406,25 +1266,6 @@ let isCompare = 1 in {
14061266 "{$src, %rax|rax, $src}">;
14071267} // isCompare
14081268
1409- // Patterns to match a relocImm into the immediate field.
1410- def : Pat<(X86testpat GR8:$src1, relocImm8_su:$src2),
1411- (TEST8ri addr:$src1, relocImm8_su:$src2)>;
1412- def : Pat<(X86testpat GR16:$src1, relocImm16_su:$src2),
1413- (TEST16ri GR16:$src1, relocImm16_su:$src2)>;
1414- def : Pat<(X86testpat GR32:$src1, relocImm32_su:$src2),
1415- (TEST32ri GR32:$src1, relocImm32_su:$src2)>;
1416- def : Pat<(X86testpat GR64:$src1, i64relocImmSExt32_su:$src2),
1417- (TEST64ri32 GR64:$src1, i64relocImmSExt32_su:$src2)>;
1418-
1419- def : Pat<(X86testpat (loadi8 addr:$src1), relocImm8_su:$src2),
1420- (TEST8mi addr:$src1, relocImm8_su:$src2)>;
1421- def : Pat<(X86testpat (loadi16 addr:$src1), relocImm16_su:$src2),
1422- (TEST16mi addr:$src1, relocImm16_su:$src2)>;
1423- def : Pat<(X86testpat (loadi32 addr:$src1), relocImm32_su:$src2),
1424- (TEST32mi addr:$src1, relocImm32_su:$src2)>;
1425- def : Pat<(X86testpat (loadi64 addr:$src1), i64relocImmSExt32_su:$src2),
1426- (TEST64mi32 addr:$src1, i64relocImmSExt32_su:$src2)>;
1427-
14281269//===----------------------------------------------------------------------===//
14291270// ANDN Instruction
14301271//
0 commit comments