diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-07-25 08:57:02 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-07-25 08:57:02 +0000 |
commit | b284e1bf08d24deb20b7deab71fce6f3034cc89a (patch) | |
tree | b5f5a9f966a07559972c3d0a2ab4743d05b1ace2 /lib/Target/SystemZ/SystemZInstrFormats.td | |
parent | 13372886a6d387c8847143744f26790a250f4360 (diff) | |
download | external_llvm-b284e1bf08d24deb20b7deab71fce6f3034cc89a.zip external_llvm-b284e1bf08d24deb20b7deab71fce6f3034cc89a.tar.gz external_llvm-b284e1bf08d24deb20b7deab71fce6f3034cc89a.tar.bz2 |
[SystemZ] Add STOC and STOCG
These instructions are allowed to trap even if the condition is false,
so for now they are only used for "*ptr = (cond ? x : *ptr)"-style
constructs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187111 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ/SystemZInstrFormats.td')
-rw-r--r-- | lib/Target/SystemZ/SystemZInstrFormats.td | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/lib/Target/SystemZ/SystemZInstrFormats.td b/lib/Target/SystemZ/SystemZInstrFormats.td index 9257a6a..b92c350 100644 --- a/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/lib/Target/SystemZ/SystemZInstrFormats.td @@ -451,9 +451,11 @@ class InstSS<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> // Instruction definitions with semantics //===----------------------------------------------------------------------===// // -// These classes have the form <Category><Format>, where <Format> is one +// These classes have the form [Cond]<Category><Format>, where <Format> is one // of the formats defined above and where <Category> describes the inputs -// and outputs. <Category> can be one of: +// and outputs. "Cond" is used if the instruction is conditional, +// in which case the 4-bit condition-code mask is added as a final operand. +// <Category> can be one of: // // Inherent: // One register output operand and no input operands. @@ -618,6 +620,40 @@ 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), + mnemonic#"$R3\t$R1, $BD2", []>, + Requires<[FeatureLoadStoreOnCond]> { + let mayStore = 1; + let AccessBytes = bytes; +} + +// Like CondStoreRSY, but used for the raw assembly form. The condition-code +// mask is the third operand rather than being part of the mnemonic. +class AsmCondStoreRSY<string mnemonic, bits<16> opcode, + RegisterOperand cls, bits<5> bytes, + AddressingMode mode = bdaddr20only> + : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2, uimm8zx4:$R3), + mnemonic#"\t$R1, $BD2, $R3", []>, + Requires<[FeatureLoadStoreOnCond]> { + let mayStore = 1; + let AccessBytes = bytes; +} + +// Like CondStoreRSY, but with a fixed CC mask. +class FixedCondStoreRSY<string mnemonic, bits<16> opcode, + RegisterOperand cls, bits<4> ccmask, bits<5> bytes, + AddressingMode mode = bdaddr20only> + : InstRSY<opcode, (outs), (ins cls:$R1, mode:$BD2), + mnemonic#"\t$R1, $BD2", []>, + Requires<[FeatureLoadStoreOnCond]> { + let mayStore = 1; + let AccessBytes = bytes; + let R3 = ccmask; +} + class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator, RegisterOperand cls1, RegisterOperand cls2> : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2), @@ -1151,12 +1187,12 @@ class SelectWrapper<RegisterOperand cls> multiclass CondStores<RegisterOperand cls, SDPatternOperator store, SDPatternOperator load, AddressingMode mode> { let Defs = [CC], Uses = [CC], usesCustomInserter = 1 in { - def "" : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc), + def "" : Pseudo<(outs), (ins cls:$new, mode:$addr, uimm8zx4:$cc), [(store (z_select_ccmask cls:$new, (load mode:$addr), - imm:$cc), mode:$addr)]>; - def Inv : Pseudo<(outs), (ins mode:$addr, cls:$new, i8imm:$cc), + uimm8zx4:$cc), mode:$addr)]>; + def Inv : Pseudo<(outs), (ins cls:$new, mode:$addr, uimm8zx4:$cc), [(store (z_select_ccmask (load mode:$addr), cls:$new, - imm:$cc), mode:$addr)]>; + uimm8zx4:$cc), mode:$addr)]>; } } |