diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Target/SystemZ/SystemZInstrFormats.td | 18 | ||||
| -rw-r--r-- | lib/Target/SystemZ/SystemZInstrInfo.td | 6 |
2 files changed, 21 insertions, 3 deletions
diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index b030182..24f86bc 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -729,6 +729,24 @@ class BinaryRRF<string mnemonic, bits<16> opcode, SDPatternOperator operator, let OpType = "reg"; } +class BinaryRRFK<string mnemonic, bits<16> opcode, SDPatternOperator operator, + RegisterOperand cls1, RegisterOperand cls2> + : InstRRF<opcode, (outs cls1:$R1), (ins cls1:$R2, cls2:$R3), + mnemonic#"rk\t$R1, $R2, $R3", + [(set cls1:$R1, (operator cls1:$R2, cls2:$R3))]>; + +multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2, + SDPatternOperator operator, RegisterOperand cls1, + RegisterOperand cls2> { + let NumOpsKey = mnemonic in { + let NumOpsValue = "3" in + def K : BinaryRRFK<mnemonic, opcode2, null_frag, cls1, cls2>, + Requires<[FeatureDistinctOps]>; + let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in + def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>; + } +} + class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> : InstRI<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2), diff --git a/lib/Target/SystemZ/SystemZInstrInfo.td b/lib/Target/SystemZ/SystemZInstrInfo.td index 4670156..94b8a3e 100644 --- a/lib/Target/SystemZ/SystemZInstrInfo.td +++ b/lib/Target/SystemZ/SystemZInstrInfo.td @@ -648,7 +648,7 @@ let Defs = [CC], Uses = [CC] in { let Defs = [CC] in { // ANDs of a register. let isCommutable = 1 in { - def NR : BinaryRR <"n", 0x14, and, GR32, GR32>; + defm NR : BinaryRRAndK<"n", 0x14, 0xB9F4, and, GR32, GR32>; def NGR : BinaryRRE<"ng", 0xB980, and, GR64, GR64>; } @@ -685,7 +685,7 @@ defm : RMWIByte<and, bdaddr20pair, NIY>; let Defs = [CC] in { // ORs of a register. let isCommutable = 1 in { - def OR : BinaryRR <"o", 0x16, or, GR32, GR32>; + defm OR : BinaryRRAndK<"o", 0x16, 0xB9F6, or, GR32, GR32>; def OGR : BinaryRRE<"og", 0xB981, or, GR64, GR64>; } @@ -722,7 +722,7 @@ defm : RMWIByte<or, bdaddr20pair, OIY>; let Defs = [CC] in { // XORs of a register. let isCommutable = 1 in { - def XR : BinaryRR <"x", 0x17, xor, GR32, GR32>; + defm XR : BinaryRRAndK<"x", 0x17, 0xB9F7, xor, GR32, GR32>; def XGR : BinaryRRE<"xg", 0xB982, xor, GR64, GR64>; } |
