From fa487e83a83c260d6a50f3df00a0eb012553a912 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 3 Jul 2013 10:10:02 +0000 Subject: [SystemZ] Fold more spills Add a mapping from register-based R instructions to the corresponding memory-based . Use it to cut down on the number of spill loads. Some instructions extend their operands from smaller fields, so this required a new TSFlags field to say how big the unextended operand is. This optimisation doesn't trigger for C(G)R and CL(G)R because in practice we always combine those instructions with a branch. Adding a test for every other case probably seems excessive, but it did catch a missed optimisation for DSGF (fixed in r185435). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185529 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SystemZ/SystemZInstrFormats.td | 165 +++++++++++++++++++++++------- 1 file changed, 126 insertions(+), 39 deletions(-) (limited to 'lib/Target/SystemZ/SystemZInstrFormats.td') diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index d720fee..fb530cc 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -28,6 +28,12 @@ class InstSystemZR instructions have a memory-based + // counterpart. OpKey uniquely identifies , while OpType is + // "reg" for R and "mem" for . + string OpKey = ""; + string OpType = "none"; + // True if this instruction is a simple D(X,B) load of a register // (with no sign or zero extension). bit SimpleBDXLoad = 0; @@ -46,11 +52,15 @@ class InstSystemZ 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; } //===----------------------------------------------------------------------===// @@ -76,6 +86,14 @@ def getDisp20Opcode : InstrMapping { let ValueCols = [["20"]]; } +def getMemOpcode : InstrMapping { + let FilterClass = "InstSystemZ"; + let RowFields = ["OpKey"]; + let ColFields = ["OpType"]; + let KeyCol = ["reg"]; + let ValueCols = [["mem"]]; +} + //===----------------------------------------------------------------------===// // Instruction formats //===----------------------------------------------------------------------===// @@ -468,7 +486,7 @@ class InstSS op, dag outs, dag ins, string asmstr, list pattern> class InherentRRE opcode, RegisterOperand cls, dag src> : InstRRE { let R2 = 0; } @@ -492,28 +510,38 @@ class StoreRILPC opcode, SDPatternOperator operator, } class StoreRX opcode, SDPatternOperator operator, - RegisterOperand cls, AddressingMode mode = bdxaddr12only> + RegisterOperand cls, bits<5> bytes, + AddressingMode mode = bdxaddr12only> : InstRX { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayStore = 1; + let AccessBytes = bytes; } class StoreRXY opcode, SDPatternOperator operator, - RegisterOperand cls, AddressingMode mode = bdxaddr20only> + RegisterOperand cls, bits<5> bytes, + AddressingMode mode = bdxaddr20only> : InstRXY { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayStore = 1; + let AccessBytes = bytes; } multiclass StoreRXPair rxOpcode, bits<16> rxyOpcode, - SDPatternOperator operator, RegisterOperand cls> { + SDPatternOperator operator, RegisterOperand cls, + bits<5> bytes> { let DispKey = mnemonic ## #cls in { let DispSize = "12" in - def "" : StoreRX; + def "" : StoreRX; let DispSize = "20" in - def Y : StoreRXY; + def Y : StoreRXY; } } @@ -560,19 +588,28 @@ multiclass StoreSIPair siOpcode, bits<16> siyOpcode, class UnaryRR opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRR; + mnemonic#"r\t$R1, $R2", + [(set cls1:$R1, (operator cls2:$R2))]> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class UnaryRRE opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRRE; + mnemonic#"r\t$R1, $R2", + [(set cls1:$R1, (operator cls2:$R2))]> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class UnaryRRF opcode, RegisterOperand cls1, RegisterOperand cls2> : InstRRF; + mnemonic#"r\t$R1, $R3, $R2", []> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class UnaryRI opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> @@ -599,44 +636,59 @@ class UnaryRILPC opcode, SDPatternOperator operator, } class UnaryRX opcode, SDPatternOperator operator, - RegisterOperand cls, AddressingMode mode = bdxaddr12only> + RegisterOperand cls, bits<5> bytes, + AddressingMode mode = bdxaddr12only> : InstRX { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } class UnaryRXE opcode, SDPatternOperator operator, - RegisterOperand cls> + RegisterOperand cls, bits<5> bytes> : InstRXE { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } class UnaryRXY opcode, SDPatternOperator operator, - RegisterOperand cls, AddressingMode mode = bdxaddr20only> + RegisterOperand cls, bits<5> bytes, + AddressingMode mode = bdxaddr20only> : InstRXY { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } multiclass UnaryRXPair rxOpcode, bits<16> rxyOpcode, - SDPatternOperator operator, RegisterOperand cls> { + SDPatternOperator operator, RegisterOperand cls, + bits<5> bytes> { let DispKey = mnemonic ## #cls in { let DispSize = "12" in - def "" : UnaryRX; + def "" : UnaryRX; let DispSize = "20" in - def Y : UnaryRXY; + def Y : UnaryRXY; } } class BinaryRR opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRR { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; } @@ -644,8 +696,10 @@ class BinaryRR opcode, SDPatternOperator operator, class BinaryRRE opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRRE { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; } @@ -653,8 +707,11 @@ class BinaryRRE opcode, SDPatternOperator operator, class BinaryRRF opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRRF; + mnemonic#"r\t$R1, $R3, $R2", + [(set cls1:$R1, (operator cls1:$R3, cls2:$R2))]> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class BinaryRI opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> @@ -675,46 +732,56 @@ class BinaryRIL opcode, SDPatternOperator operator, } class BinaryRX opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load, + RegisterOperand cls, SDPatternOperator load, bits<5> bytes, AddressingMode mode = bdxaddr12only> : InstRX { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let mayLoad = 1; + let AccessBytes = bytes; } class BinaryRXE opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load> + RegisterOperand cls, SDPatternOperator load, bits<5> bytes> : InstRXE { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let mayLoad = 1; + let AccessBytes = bytes; } class BinaryRXY opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load, + RegisterOperand cls, SDPatternOperator load, bits<5> bytes, AddressingMode mode = bdxaddr20only> : InstRXY { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let mayLoad = 1; + let AccessBytes = bytes; } multiclass BinaryRXPair rxOpcode, bits<16> rxyOpcode, SDPatternOperator operator, RegisterOperand cls, - SDPatternOperator load> { + SDPatternOperator load, bits<5> bytes> { let DispKey = mnemonic ## #cls in { let DispSize = "12" in - def "" : BinaryRX; + def "" : BinaryRX; let DispSize = "20" in - def Y : BinaryRXY; } } @@ -767,14 +834,20 @@ class ShiftRSY opcode, SDPatternOperator operator, class CompareRR opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRR; + mnemonic#"r\t$R1, $R2", + [(operator cls1:$R1, cls2:$R2)]> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class CompareRRE opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRRE; + mnemonic#"r\t$R1, $R2", + [(operator cls1:$R1, cls2:$R2)]> { + let OpKey = mnemonic ## cls1; + let OpType = "reg"; +} class CompareRI opcode, SDPatternOperator operator, RegisterOperand cls, Immediate imm> @@ -801,41 +874,50 @@ class CompareRILPC opcode, SDPatternOperator operator, } class CompareRX opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load, + RegisterOperand cls, SDPatternOperator load, bits<5> bytes, AddressingMode mode = bdxaddr12only> : InstRX { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } class CompareRXE opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load> + RegisterOperand cls, SDPatternOperator load, bits<5> bytes> : InstRXE { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } class CompareRXY opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load, + RegisterOperand cls, SDPatternOperator load, bits<5> bytes, AddressingMode mode = bdxaddr20only> : InstRXY { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let mayLoad = 1; + let AccessBytes = bytes; } multiclass CompareRXPair rxOpcode, bits<16> rxyOpcode, SDPatternOperator operator, RegisterOperand cls, - SDPatternOperator load> { + SDPatternOperator load, bits<5> bytes> { let DispKey = mnemonic ## #cls in { let DispSize = "12" in def "" : CompareRX; + load, bytes, bdxaddr12pair>; let DispSize = "20" in def Y : CompareRXY; + load, bytes, bdxaddr20pair>; } } @@ -880,22 +962,27 @@ multiclass CompareSIPair siOpcode, bits<16> siyOpcode, class TernaryRRD opcode, SDPatternOperator operator, RegisterOperand cls> : InstRRD { + let OpKey = mnemonic ## cls; + let OpType = "reg"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; } class TernaryRXF opcode, SDPatternOperator operator, - RegisterOperand cls, SDPatternOperator load> + RegisterOperand cls, SDPatternOperator load, bits<5> bytes> : InstRXF { + let OpKey = mnemonic ## cls; + let OpType = "mem"; let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let mayLoad = 1; + let AccessBytes = bytes; } class CmpSwapRS opcode, SDPatternOperator operator, -- cgit v1.1