diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-08-01 10:39:40 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-08-01 10:39:40 +0000 |
commit | 8f0ad5ae8f2699f6ab13a229941a0b192273cae8 (patch) | |
tree | 9d0bb8af50d25824ea6549b972bee2930b765bba /lib/Target/SystemZ/SystemZInstrFormats.td | |
parent | 3237f88882eed8a67fa679f7071a5441c4306ac3 (diff) | |
download | external_llvm-8f0ad5ae8f2699f6ab13a229941a0b192273cae8.zip external_llvm-8f0ad5ae8f2699f6ab13a229941a0b192273cae8.tar.gz external_llvm-8f0ad5ae8f2699f6ab13a229941a0b192273cae8.tar.bz2 |
[SystemZ] Reuse CC results for integer comparisons with zero
This also fixes a bug in the predication of LR to LOCR: I'd forgotten
that with these in-place instruction builds, the implicit operands need
to be added manually. I think this was latent until now, but is tested
by int-cmp-45.c. It also adds a CC valid mask to STOC, again tested by
int-cmp-45.c.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187573 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ/SystemZInstrFormats.td')
-rw-r--r-- | lib/Target/SystemZ/SystemZInstrFormats.td | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index 915891d..9883714 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -61,12 +61,41 @@ class InstSystemZ<int size, dag outs, dag ins, string asmstr, // The access size of all memory operands in bytes, or 0 if not known. bits<5> AccessBytes = 0; - let TSFlags{0} = SimpleBDXLoad; - let TSFlags{1} = SimpleBDXStore; - let TSFlags{2} = Has20BitOffset; - let TSFlags{3} = HasIndex; - let TSFlags{4} = Is128Bit; - let TSFlags{9-5} = AccessBytes; + // If the instruction sets CC to a useful value, this gives the mask + // of all possible CC results. The mask has the same form as + // SystemZ::CCMASK_*. + bits<4> CCValues = 0; + + // True if the instruction sets CC to 0 when the result is 0. + bit CCHasZero = 0; + + // True if the instruction sets CC to 1 when the result is less than 0 + // and to 2 when the result is greater than 0. + bit CCHasOrder = 0; + + // True if the instruction is conditional and if the CC mask operand + // comes first (as for BRC, etc.). + bit CCMaskFirst = 0; + + // Similar, but true if the CC mask operand comes last (as for LOC, etc.). + bit CCMaskLast = 0; + + // True if the instruction is the "logical" rather than "arithmetic" form, + // in cases where a distinction exists. + bit IsLogical = 0; + + let TSFlags{0} = SimpleBDXLoad; + let TSFlags{1} = SimpleBDXStore; + let TSFlags{2} = Has20BitOffset; + let TSFlags{3} = HasIndex; + let TSFlags{4} = Is128Bit; + let TSFlags{9-5} = AccessBytes; + let TSFlags{13-10} = CCValues; + let TSFlags{14} = CCHasZero; + let TSFlags{15} = CCHasOrder; + let TSFlags{16} = CCMaskFirst; + let TSFlags{17} = CCMaskLast; + let TSFlags{18} = IsLogical; } //===----------------------------------------------------------------------===// @@ -623,11 +652,12 @@ multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode, class CondStoreRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, bits<5> bytes, AddressingMode mode = bdaddr20only> - : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$R3), + : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$R3), mnemonic#"$R3\t$R1, $BD2", []>, Requires<[FeatureLoadStoreOnCond]> { let mayStore = 1; let AccessBytes = bytes; + let CCMaskLast = 1; } // Like CondStoreRSY, but used for the raw assembly form. The condition-code @@ -686,7 +716,9 @@ class CondUnaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1, RegisterOperand cls2> : InstRRF<opcode, (outs cls1:$R1), (ins cls2:$R2, cond4:$valid, cond4:$R3), mnemonic#"r$R3\t$R1, $R2", []>, - Requires<[FeatureLoadStoreOnCond]>; + Requires<[FeatureLoadStoreOnCond]> { + let CCMaskLast = 1; +} // Like CondUnaryRRF, but used for the raw assembly form. The condition-code // mask is the third operand rather than being part of the mnemonic. @@ -748,6 +780,7 @@ class CondUnaryRSY<string mnemonic, bits<16> opcode, let DisableEncoding = "$R1src"; let mayLoad = 1; let AccessBytes = bytes; + let CCMaskLast = 1; } // Like CondUnaryRSY, but used for the raw assembly form. The condition-code |