diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /lib/Target/SystemZ/SystemZInstrFormats.td | |
parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
download | src-eb11fae6d08f479c0799db45860a98af528fa6e7.tar.gz src-eb11fae6d08f479c0799db45860a98af528fa6e7.zip |
Vendor import of llvm trunk r338150:vendor/llvm/llvm-trunk-r338150
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=336809
svn path=/vendor/llvm/llvm-trunk-r338150/; revision=336814; tag=vendor/llvm/llvm-trunk-r338150
Diffstat (limited to 'lib/Target/SystemZ/SystemZInstrFormats.td')
-rw-r--r-- | lib/Target/SystemZ/SystemZInstrFormats.td | 207 |
1 files changed, 119 insertions, 88 deletions
diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index 06da66ad8764..e3f9a9645d13 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -2469,7 +2469,7 @@ class StoreVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, bits<5> bytes, bits<4> type = 0> : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2), mnemonic#"\t$V1, $XBD2", - [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2)))]> { + [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> { let M3 = type; let mayStore = 1; let AccessBytes = bytes; @@ -2844,7 +2844,7 @@ class UnaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, Immediate imm, bits<4> type = 0> : InstVRIa<opcode, (outs tr.op:$V1), (ins imm:$I2), mnemonic#"\t$V1, $I2", - [(set tr.op:$V1, (tr.vt (operator imm:$I2)))]> { + [(set (tr.vt tr.op:$V1), (operator imm:$I2))]> { let M3 = type; } @@ -2857,7 +2857,7 @@ class UnaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, bits<4> m5 = 0> : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2), mnemonic#"\t$V1, $V2", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2))))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]> { let M3 = type; let M4 = m4; let M5 = m5; @@ -2913,7 +2913,7 @@ class UnaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, bits<5> bytes, bits<4> type = 0> : InstVRX<opcode, (outs tr.op:$V1), (ins bdxaddr12only:$XBD2), mnemonic#"\t$V1, $XBD2", - [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2)))]> { + [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> { let M3 = type; let mayLoad = 1; let AccessBytes = bytes; @@ -3132,7 +3132,9 @@ class CondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1, RegisterOperand cls2> : InstRRFc<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), - mnemonic#"$M3\t$R1, $R2", []> { + mnemonic#"$M3\t$R1, $R2", + [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src, + cond4:$valid, cond4:$M3))]> { let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let CCMaskLast = 1; @@ -3385,7 +3387,7 @@ class BinaryVRIb<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, bits<4> type> : InstVRIb<opcode, (outs tr.op:$V1), (ins imm32zx8:$I2, imm32zx8:$I3), mnemonic#"\t$V1, $I2, $I3", - [(set tr.op:$V1, (tr.vt (operator imm32zx8:$I2, imm32zx8:$I3)))]> { + [(set (tr.vt tr.op:$V1), (operator imm32zx8:$I2, imm32zx8:$I3))]> { let M4 = type; } @@ -3398,8 +3400,8 @@ class BinaryVRIc<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr1, TypedReg tr2, bits<4> type> : InstVRIc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, imm32zx16:$I2), mnemonic#"\t$V1, $V3, $I2", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V3), - imm32zx16:$I2)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3), + imm32zx16:$I2))]> { let M4 = type; } @@ -3412,8 +3414,8 @@ class BinaryVRIe<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m5> : InstVRIe<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx12:$I3), mnemonic#"\t$V1, $V2, $I3", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - imm32zx12:$I3)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + imm32zx12:$I3))]> { let M4 = type; let M5 = m5; } @@ -3432,8 +3434,8 @@ class BinaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0> : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx4:$M5), mnemonic#"\t$V1, $V2, $M5", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - imm32zx12:$M5)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + imm32zx12:$M5))]> { let M3 = type; let M4 = m4; } @@ -3448,8 +3450,8 @@ class BinaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator, bits<4> modifier = 0> : InstVRRb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3), mnemonic#"\t$V1, $V2, $V3", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3))))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3)))]> { let M4 = type; let M5 = modifier; } @@ -3507,8 +3509,8 @@ class BinaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator, bits<4> m6 = 0> : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3), mnemonic#"\t$V1, $V2, $V3", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3))))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3)))]> { let M4 = type; let M5 = m5; let M6 = m6; @@ -3554,7 +3556,7 @@ class BinaryVRRf<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr> : InstVRRf<opcode, (outs tr.op:$V1), (ins GR64:$R2, GR64:$R3), mnemonic#"\t$V1, $R2, $R3", - [(set tr.op:$V1, (tr.vt (operator GR64:$R2, GR64:$R3)))]>; + [(set (tr.vt tr.op:$V1), (operator GR64:$R2, GR64:$R3))]>; class BinaryVRRi<string mnemonic, bits<16> opcode, RegisterOperand cls> : InstVRRi<opcode, (outs cls:$R1), (ins VR128:$V2, imm32zx4:$M3), @@ -3564,8 +3566,8 @@ class BinaryVRSa<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr1, TypedReg tr2, bits<4> type> : InstVRSa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, shift12only:$BD2), mnemonic#"\t$V1, $V3, $BD2", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V3), - shift12only:$BD2)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3), + shift12only:$BD2))]> { let M4 = type; } @@ -3610,8 +3612,8 @@ class BinaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, bits<5> bytes> : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3), mnemonic#"\t$V1, $XBD2, $M3", - [(set tr.op:$V1, (tr.vt (operator bdxaddr12only:$XBD2, - imm32zx4:$M3)))]> { + [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2, + imm32zx4:$M3))]> { let mayLoad = 1; let AccessBytes = bytes; } @@ -3688,7 +3690,7 @@ class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2), mnemonic#"\t$R1, $R2", - [(operator cls1:$R1, cls2:$R2)]> { + [(set CC, (operator cls1:$R1, cls2:$R2))]> { let OpKey = mnemonic#cls1; let OpType = "reg"; let isCompare = 1; @@ -3698,7 +3700,7 @@ class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2), mnemonic#"\t$R1, $R2", - [(operator cls1:$R1, cls2:$R2)]> { + [(set CC, (operator cls1:$R1, cls2:$R2))]> { let OpKey = mnemonic#cls1; let OpType = "reg"; let isCompare = 1; @@ -3708,7 +3710,7 @@ class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> : InstRIa<opcode, (outs), (ins cls:$R1, imm:$I2), mnemonic#"\t$R1, $I2", - [(operator cls:$R1, imm:$I2)]> { + [(set CC, (operator cls:$R1, imm:$I2))]> { let isCompare = 1; } @@ -3716,7 +3718,7 @@ class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> : InstRILa<opcode, (outs), (ins cls:$R1, imm:$I2), mnemonic#"\t$R1, $I2", - [(operator cls:$R1, imm:$I2)]> { + [(set CC, (operator cls:$R1, imm:$I2))]> { let isCompare = 1; } @@ -3724,7 +3726,7 @@ class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator, RegisterOperand cls, SDPatternOperator load> : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2), mnemonic#"\t$R1, $RI2", - [(operator cls:$R1, (load pcrel32:$RI2))]> { + [(set CC, (operator cls:$R1, (load pcrel32:$RI2)))]> { let isCompare = 1; let mayLoad = 1; // We want PC-relative addresses to be tried ahead of BD and BDX addresses. @@ -3738,7 +3740,7 @@ class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator, AddressingMode mode = bdxaddr12only> : InstRXa<opcode, (outs), (ins cls:$R1, mode:$XBD2), mnemonic#"\t$R1, $XBD2", - [(operator cls:$R1, (load mode:$XBD2))]> { + [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { let OpKey = mnemonic#"r"#cls; let OpType = "mem"; let isCompare = 1; @@ -3750,7 +3752,7 @@ class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, RegisterOperand cls, SDPatternOperator load, bits<5> bytes> : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2), mnemonic#"\t$R1, $XBD2", - [(operator cls:$R1, (load bdxaddr12only:$XBD2))]> { + [(set CC, (operator cls:$R1, (load bdxaddr12only:$XBD2)))]> { let OpKey = mnemonic#"r"#cls; let OpType = "mem"; let isCompare = 1; @@ -3764,7 +3766,7 @@ class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator, AddressingMode mode = bdxaddr20only> : InstRXYa<opcode, (outs), (ins cls:$R1, mode:$XBD2), mnemonic#"\t$R1, $XBD2", - [(operator cls:$R1, (load mode:$XBD2))]> { + [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { let OpKey = mnemonic#"r"#cls; let OpType = "mem"; let isCompare = 1; @@ -3824,7 +3826,7 @@ class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator, AddressingMode mode = bdaddr12only> : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2), mnemonic#"\t$BD1, $I2", - [(operator (load mode:$BD1), imm:$I2)]> { + [(set CC, (operator (load mode:$BD1), imm:$I2))]> { let isCompare = 1; let mayLoad = 1; } @@ -3833,7 +3835,7 @@ class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator, SDPatternOperator load, Immediate imm> : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), mnemonic#"\t$BD1, $I2", - [(operator (load bdaddr12only:$BD1), imm:$I2)]> { + [(set CC, (operator (load bdaddr12only:$BD1), imm:$I2))]> { let isCompare = 1; let mayLoad = 1; } @@ -3843,7 +3845,7 @@ class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator, AddressingMode mode = bdaddr20only> : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2), mnemonic#"\t$BD1, $I2", - [(operator (load mode:$BD1), imm:$I2)]> { + [(set CC, (operator (load mode:$BD1), imm:$I2))]> { let isCompare = 1; let mayLoad = 1; } @@ -3864,7 +3866,7 @@ class CompareVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr, bits<4> type> : InstVRRa<opcode, (outs), (ins tr.op:$V1, tr.op:$V2), mnemonic#"\t$V1, $V2", - [(operator (tr.vt tr.op:$V1), (tr.vt tr.op:$V2))]> { + [(set CC, (operator (tr.vt tr.op:$V1), (tr.vt tr.op:$V2)))]> { let isCompare = 1; let M3 = type; let M4 = 0; @@ -3893,14 +3895,26 @@ class CompareVRRh<string mnemonic, bits<16> opcode> let isCompare = 1; } +class TestInherentS<string mnemonic, bits<16> opcode, + SDPatternOperator operator> + : InstS<opcode, (outs), (ins), mnemonic, [(set CC, (operator))]> { + let BD2 = 0; +} + class TestRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, RegisterOperand cls> : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2), mnemonic#"\t$R1, $XBD2", - [(operator cls:$R1, bdxaddr12only:$XBD2)]> { + [(set CC, (operator cls:$R1, bdxaddr12only:$XBD2))]> { let M3 = 0; } +class TestBinarySIL<string mnemonic, bits<16> opcode, + SDPatternOperator operator, Immediate imm> + : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), + mnemonic#"\t$BD1, $I2", + [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>; + class TestRSL<string mnemonic, bits<16> opcode> : InstRSLa<opcode, (outs), (ins bdladdr12onlylen4:$BDL1), mnemonic#"\t$BDL1", []> { @@ -4097,8 +4111,8 @@ class TernaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator, TypedReg tr1, TypedReg tr2, Immediate imm, Immediate index> : InstVRIa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, imm:$I2, index:$M3), mnemonic#"\t$V1, $I2, $M3", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src), - imm:$I2, index:$M3)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), + imm:$I2, index:$M3))]> { let Constraints = "$V1 = $V1src"; let DisableEncoding = "$V1src"; } @@ -4108,9 +4122,9 @@ class TernaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRId<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4), mnemonic#"\t$V1, $V2, $V3, $I4", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - imm32zx8:$I4)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + imm32zx8:$I4))]> { let M5 = type; } @@ -4124,9 +4138,9 @@ class TernaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx4:$M4, imm32zx4:$M5), mnemonic#"\t$V1, $V2, $M4, $M5", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - imm32zx4:$M4, - imm32zx4:$M5)))], + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + imm32zx4:$M4, + imm32zx4:$M5))], m4or> { let M3 = type; } @@ -4142,9 +4156,9 @@ class TernaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRRb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, m5mask:$M5), mnemonic#"\t$V1, $V2, $V3, $M5", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - m5mask:$M5)))], + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + m5mask:$M5))], m5or> { let M4 = type; } @@ -4184,9 +4198,9 @@ class TernaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M4), mnemonic#"\t$V1, $V2, $V3, $M4", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - imm32zx4:$M4)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + imm32zx4:$M4))]> { let M5 = 0; let M6 = 0; } @@ -4197,9 +4211,9 @@ class TernaryVRRcFloat<string mnemonic, bits<16> opcode, : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M6), mnemonic#"\t$V1, $V2, $V3, $M6", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - imm32zx4:$M6)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + imm32zx4:$M6))]> { let M4 = type; let M5 = m5; } @@ -4215,9 +4229,9 @@ class TernaryVRRd<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRRd<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4), mnemonic#"\t$V1, $V2, $V3, $V4", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - (tr1.vt tr1.op:$V4))))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + (tr1.vt tr1.op:$V4)))]> { let M5 = type; let M6 = 0; } @@ -4234,9 +4248,9 @@ class TernaryVRRe<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRRe<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4), mnemonic#"\t$V1, $V2, $V3, $V4", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - (tr1.vt tr1.op:$V4))))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + (tr1.vt tr1.op:$V4)))]> { let M5 = m5; let M6 = type; } @@ -4251,9 +4265,9 @@ class TernaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRSb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, cls:$R3, shift12only:$BD2), mnemonic#"\t$V1, $R3, $BD2", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src), - cls:$R3, - shift12only:$BD2)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), + cls:$R3, + shift12only:$BD2))]> { let Constraints = "$V1 = $V1src"; let DisableEncoding = "$V1src"; let M4 = type; @@ -4283,9 +4297,9 @@ class TernaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, : InstVRX<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, bdxaddr12only:$XBD2, index:$M3), mnemonic#"\t$V1, $XBD2, $M3", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src), - bdxaddr12only:$XBD2, - index:$M3)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), + bdxaddr12only:$XBD2, + index:$M3))]> { let Constraints = "$V1 = $V1src"; let DisableEncoding = "$V1src"; let mayLoad = 1; @@ -4297,10 +4311,10 @@ class QuaternaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operato : InstVRId<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4), mnemonic#"\t$V1, $V2, $V3, $I4", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V1src), - (tr2.vt tr2.op:$V2), - (tr2.vt tr2.op:$V3), - imm32zx8:$I4)))]> { + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), + (tr2.vt tr2.op:$V2), + (tr2.vt tr2.op:$V3), + imm32zx8:$I4))]> { let Constraints = "$V1 = $V1src"; let DisableEncoding = "$V1src"; let M5 = type; @@ -4334,10 +4348,10 @@ class QuaternaryVRRd<string mnemonic, bits<16> opcode, : InstVRRd<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr3.op:$V3, tr4.op:$V4, m6mask:$M6), mnemonic#"\t$V1, $V2, $V3, $V4, $M6", - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2), - (tr3.vt tr3.op:$V3), - (tr4.vt tr4.op:$V4), - m6mask:$M6)))], + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), + (tr3.vt tr3.op:$V3), + (tr4.vt tr4.op:$V4), + m6mask:$M6))], m6or> { let M5 = type; } @@ -4527,11 +4541,6 @@ class Pseudo<dag outs, dag ins, list<dag> pattern> let isCodeGenOnly = 1; } -// Like SideEffectBinarySIL, but expanded later. -class SideEffectBinarySILPseudo<SDPatternOperator operator, Immediate imm> - : Pseudo<(outs), (ins bdaddr12only:$BD1, imm:$I2), - [(operator bdaddr12only:$BD1, imm:$I2)]>; - // Like UnaryRI, but expanded after RA depending on the choice of register. class UnaryRIPseudo<SDPatternOperator operator, RegisterOperand cls, Immediate imm> @@ -4591,7 +4600,8 @@ multiclass BinaryRIAndKPseudo<string key, SDPatternOperator operator, // Like CompareRI, but expanded after RA depending on the choice of register. class CompareRIPseudo<SDPatternOperator operator, RegisterOperand cls, Immediate imm> - : Pseudo<(outs), (ins cls:$R1, imm:$I2), [(operator cls:$R1, imm:$I2)]> { + : Pseudo<(outs), (ins cls:$R1, imm:$I2), + [(set CC, (operator cls:$R1, imm:$I2))]> { let isCompare = 1; } @@ -4600,18 +4610,25 @@ class CompareRXYPseudo<SDPatternOperator operator, RegisterOperand cls, SDPatternOperator load, bits<5> bytes, AddressingMode mode = bdxaddr20only> : Pseudo<(outs), (ins cls:$R1, mode:$XBD2), - [(operator cls:$R1, (load mode:$XBD2))]> { + [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { let mayLoad = 1; let Has20BitOffset = 1; let HasIndex = 1; let AccessBytes = bytes; } +// Like TestBinarySIL, but expanded later. +class TestBinarySILPseudo<SDPatternOperator operator, Immediate imm> + : Pseudo<(outs), (ins bdaddr12only:$BD1, imm:$I2), + [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>; + // Like CondBinaryRRF, but expanded after RA depending on the choice of // register. class CondBinaryRRFPseudo<RegisterOperand cls1, RegisterOperand cls2> : Pseudo<(outs cls1:$R1), - (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), []> { + (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), + [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src, + cond4:$valid, cond4:$M3))]> { let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let CCMaskLast = 1; @@ -4685,17 +4702,14 @@ class SelectWrapper<ValueType vt, RegisterOperand cls> [(set (vt cls:$dst), (z_select_ccmask cls:$src1, cls:$src2, imm32zx4:$valid, imm32zx4:$cc))]> { let usesCustomInserter = 1; - // Although the instructions used by these nodes do not in themselves - // change CC, the insertion requires new blocks, and CC cannot be live - // across them. - let Defs = [CC]; + let hasNoSchedulingInfo = 1; let Uses = [CC]; } // Stores $new to $addr if $cc is true ("" case) or false (Inv case). multiclass CondStores<RegisterOperand cls, SDPatternOperator store, SDPatternOperator load, AddressingMode mode> { - let Defs = [CC], Uses = [CC], usesCustomInserter = 1, + let Uses = [CC], usesCustomInserter = 1, hasNoSchedulingInfo = 1, mayLoad = 1, mayStore = 1 in { def "" : Pseudo<(outs), (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc), @@ -4765,7 +4779,7 @@ class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm> multiclass MemorySS<string mnemonic, bits<8> opcode, SDPatternOperator sequence, SDPatternOperator loop> { def "" : SideEffectBinarySSa<mnemonic, opcode>; - let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in { + let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Defs = [CC] in { def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, imm64:$length), [(sequence bdaddr12only:$dest, bdaddr12only:$src, @@ -4777,6 +4791,22 @@ multiclass MemorySS<string mnemonic, bits<8> opcode, } } +// The same, but setting a CC result as comparion operator. +multiclass CompareMemorySS<string mnemonic, bits<8> opcode, + SDPatternOperator sequence, SDPatternOperator loop> { + def "" : SideEffectBinarySSa<mnemonic, opcode>; + let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in { + def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, + imm64:$length), + [(set CC, (sequence bdaddr12only:$dest, bdaddr12only:$src, + imm64:$length))]>; + def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, + imm64:$length, GR64:$count256), + [(set CC, (loop bdaddr12only:$dest, bdaddr12only:$src, + imm64:$length, GR64:$count256))]>; + } +} + // Define an instruction that operates on two strings, both terminated // by the character in R0. The instruction processes a CPU-determinated // number of bytes at a time and sets CC to 3 if the instruction needs @@ -4809,13 +4839,13 @@ class UnaryAliasVRS<RegisterOperand cls1, RegisterOperand cls2> // An alias of a UnaryVRR*, but with different register sizes. class UnaryAliasVRR<SDPatternOperator operator, TypedReg tr1, TypedReg tr2> : Alias<6, (outs tr1.op:$V1), (ins tr2.op:$V2), - [(set tr1.op:$V1, (tr1.vt (operator (tr2.vt tr2.op:$V2))))]>; + [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]>; // An alias of a UnaryVRX, but with different register sizes. class UnaryAliasVRX<SDPatternOperator operator, TypedReg tr, AddressingMode mode = bdxaddr12only> : Alias<6, (outs tr.op:$V1), (ins mode:$XBD2), - [(set tr.op:$V1, (tr.vt (operator mode:$XBD2)))]>; + [(set (tr.vt tr.op:$V1), (operator mode:$XBD2))]>; // An alias of a StoreVRX, but with different register sizes. class StoreAliasVRX<SDPatternOperator operator, TypedReg tr, @@ -4846,7 +4876,8 @@ class BinaryAliasVRRf<RegisterOperand cls> // An alias of a CompareRI, but with different register sizes. class CompareAliasRI<SDPatternOperator operator, RegisterOperand cls, Immediate imm> - : Alias<4, (outs), (ins cls:$R1, imm:$I2), [(operator cls:$R1, imm:$I2)]> { + : Alias<4, (outs), (ins cls:$R1, imm:$I2), + [(set CC, (operator cls:$R1, imm:$I2))]> { let isCompare = 1; } |