diff options
| author | Tim Northover <tnorthover@apple.com> | 2014-04-30 13:14:14 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2014-04-30 13:14:14 +0000 |
| commit | d53a671354a3bb4cd218513978e53193c7b6773e (patch) | |
| tree | 4b3c0d0cd0f54a27fec779264a8f3021c086f4ac /llvm/lib/Target/ARM64/ARM64InstrFormats.td | |
| parent | 20ad359b77767cf588f7025271bad5ca8a0bd82e (diff) | |
| download | bcm5719-llvm-d53a671354a3bb4cd218513978e53193c7b6773e.tar.gz bcm5719-llvm-d53a671354a3bb4cd218513978e53193c7b6773e.zip | |
AArch64/ARM64: expunge CPSR from the sources
AArch64 does not have a CPSR register in the same way that AArch32 does. Most
of its compiler-relevant roles have been taken over by the more specific NZCV
register (representing just the flags set by normal instructions).
Its system control functions still remain, but are now under the
pseudo-register referred to as "PSTATE". They're accessed via various MRS & MSR
instructions described in the reference manual.
llvm-svn: 207645
Diffstat (limited to 'llvm/lib/Target/ARM64/ARM64InstrFormats.td')
| -rw-r--r-- | llvm/lib/Target/ARM64/ARM64InstrFormats.td | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64InstrFormats.td b/llvm/lib/Target/ARM64/ARM64InstrFormats.td index 0d5c2a95656..173f0ef4d3b 100644 --- a/llvm/lib/Target/ARM64/ARM64InstrFormats.td +++ b/llvm/lib/Target/ARM64/ARM64InstrFormats.td @@ -752,7 +752,7 @@ class MRSI : RtSystemI<1, (outs GPR64:$Rt), (ins mrs_sysreg_op:$systemreg), let Inst{19-5} = systemreg; } -// FIXME: Some of these def CPSR, others don't. Best way to model that? +// FIXME: Some of these def NZCV, others don't. Best way to model that? // Explicitly modeling each of the system register as a register class // would do it, but feels like overkill at this point. class MSRI : RtSystemI<0, (outs), (ins msr_sysreg_op:$systemreg, GPR64:$Rt), @@ -762,28 +762,29 @@ class MSRI : RtSystemI<0, (outs), (ins msr_sysreg_op:$systemreg, GPR64:$Rt), let Inst{19-5} = systemreg; } -def SystemCPSRFieldOperand : AsmOperandClass { - let Name = "SystemCPSRField"; +def SystemPStateFieldOperand : AsmOperandClass { + let Name = "SystemPStateField"; let ParserMethod = "tryParseSysReg"; } -def cpsrfield_op : Operand<i32> { - let ParserMatchClass = SystemCPSRFieldOperand; - let PrintMethod = "printSystemCPSRField"; +def pstatefield_op : Operand<i32> { + let ParserMatchClass = SystemPStateFieldOperand; + let PrintMethod = "printSystemPStateField"; } -let Defs = [CPSR] in -class MSRcpsrI : SimpleSystemI<0, (ins cpsrfield_op:$cpsr_field, imm0_15:$imm), - "msr", "\t$cpsr_field, $imm">, - Sched<[WriteSys]> { - bits<6> cpsrfield; +let Defs = [NZCV] in +class MSRpstateI + : SimpleSystemI<0, (ins pstatefield_op:$pstate_field, imm0_15:$imm), + "msr", "\t$pstate_field, $imm">, + Sched<[WriteSys]> { + bits<6> pstatefield; bits<4> imm; let Inst{20-19} = 0b00; - let Inst{18-16} = cpsrfield{5-3}; + let Inst{18-16} = pstatefield{5-3}; let Inst{15-12} = 0b0100; let Inst{11-8} = imm; - let Inst{7-5} = cpsrfield{2-0}; + let Inst{7-5} = pstatefield{2-0}; - let DecoderMethod = "DecodeSystemCPSRInstruction"; + let DecoderMethod = "DecodeSystemPStateInstruction"; } // SYS and SYSL generic system instructions. @@ -882,11 +883,11 @@ def am_brcond : Operand<OtherVT> { class BranchCond : I<(outs), (ins dotCcode:$cond, am_brcond:$target), "b", "$cond\t$target", "", - [(ARM64brcond bb:$target, imm:$cond, CPSR)]>, + [(ARM64brcond bb:$target, imm:$cond, NZCV)]>, Sched<[WriteBr]> { let isBranch = 1; let isTerminator = 1; - let Uses = [CPSR]; + let Uses = [NZCV]; bits<4> cond; bits<19> target; @@ -1041,7 +1042,7 @@ class BaseBaseAddSubCarry<bit isSub, RegisterClass regtype, string asm, : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm), asm, "\t$Rd, $Rn, $Rm", "", pattern>, Sched<[WriteI]> { - let Uses = [CPSR]; + let Uses = [NZCV]; bits<5> Rd; bits<5> Rn; bits<5> Rm; @@ -1056,14 +1057,14 @@ class BaseBaseAddSubCarry<bit isSub, RegisterClass regtype, string asm, class BaseAddSubCarry<bit isSub, RegisterClass regtype, string asm, SDNode OpNode> : BaseBaseAddSubCarry<isSub, regtype, asm, - [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, CPSR))]>; + [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, NZCV))]>; class BaseAddSubCarrySetFlags<bit isSub, RegisterClass regtype, string asm, SDNode OpNode> : BaseBaseAddSubCarry<isSub, regtype, asm, - [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, CPSR)), - (implicit CPSR)]> { - let Defs = [CPSR]; + [(set regtype:$Rd, (OpNode regtype:$Rn, regtype:$Rm, NZCV)), + (implicit NZCV)]> { + let Defs = [NZCV]; } multiclass AddSubCarry<bit isSub, string asm, string asm_setflags, @@ -1522,7 +1523,7 @@ multiclass AddSub<bit isSub, string mnemonic, } multiclass AddSubS<bit isSub, string mnemonic, SDNode OpNode> { - let isCompare = 1, Defs = [CPSR] in { + let isCompare = 1, Defs = [NZCV] in { // Add/Subtract immediate def Wri : BaseAddSubImm<isSub, 1, GPR32, GPR32sp, addsub_shifted_imm32, mnemonic, OpNode> { @@ -1565,7 +1566,7 @@ multiclass AddSubS<bit isSub, string mnemonic, SDNode OpNode> { let Inst{14-13} = 0b11; let Inst{31} = 1; } - } // Defs = [CPSR] + } // Defs = [NZCV] // Register/register aliases with no shift when SP is not used. def : AddSubRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrs"), @@ -1770,7 +1771,7 @@ multiclass LogicalImm<bits<2> opc, string mnemonic, SDNode OpNode> { } multiclass LogicalImmS<bits<2> opc, string mnemonic, SDNode OpNode> { - let isCompare = 1, Defs = [CPSR] in { + let isCompare = 1, Defs = [NZCV] in { def Wri : BaseLogicalImm<opc, GPR32, GPR32, logical_imm32, mnemonic, [(set GPR32:$Rd, (OpNode GPR32:$Rn, logical_imm32:$imm))]> { let Inst{31} = 0; @@ -1780,7 +1781,7 @@ multiclass LogicalImmS<bits<2> opc, string mnemonic, SDNode OpNode> { [(set GPR64:$Rd, (OpNode GPR64:$Rn, logical_imm64:$imm))]> { let Inst{31} = 1; } - } // end Defs = [CPSR] + } // end Defs = [NZCV] } class BaseLogicalRegPseudo<RegisterClass regtype, SDPatternOperator OpNode> @@ -1811,10 +1812,10 @@ multiclass LogicalReg<bits<2> opc, bit N, string mnemonic, !cast<Instruction>(NAME#"Xrs"), GPR64>; } -// Split from LogicalReg to allow setting CPSR Defs +// Split from LogicalReg to allow setting NZCV Defs multiclass LogicalRegS<bits<2> opc, bit N, string mnemonic, SDPatternOperator OpNode = null_frag> { - let Defs = [CPSR], mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { + let Defs = [NZCV], mayLoad = 0, mayStore = 0, hasSideEffects = 0 in { def Wrr : BaseLogicalRegPseudo<GPR32, OpNode>; def Xrr : BaseLogicalRegPseudo<GPR64, OpNode>; @@ -1826,7 +1827,7 @@ multiclass LogicalRegS<bits<2> opc, bit N, string mnemonic, [(set GPR64:$Rd, (OpNode GPR64:$Rn, logical_shifted_reg64:$Rm))]> { let Inst{31} = 1; } - } // Defs = [CPSR] + } // Defs = [NZCV] def : LogicalRegAlias<mnemonic, !cast<Instruction>(NAME#"Wrs"), GPR32>; @@ -1849,8 +1850,8 @@ class BaseCondSetFlagsImm<bit op, RegisterClass regtype, string asm> : I<(outs), (ins regtype:$Rn, imm0_31:$imm, imm0_15:$nzcv, ccode:$cond), asm, "\t$Rn, $imm, $nzcv, $cond", "", []>, Sched<[WriteI]> { - let Uses = [CPSR]; - let Defs = [CPSR]; + let Uses = [NZCV]; + let Defs = [NZCV]; bits<5> Rn; bits<5> imm; @@ -1881,8 +1882,8 @@ class BaseCondSetFlagsReg<bit op, RegisterClass regtype, string asm> : I<(outs), (ins regtype:$Rn, regtype:$Rm, imm0_15:$nzcv, ccode:$cond), asm, "\t$Rn, $Rm, $nzcv, $cond", "", []>, Sched<[WriteI]> { - let Uses = [CPSR]; - let Defs = [CPSR]; + let Uses = [NZCV]; + let Defs = [NZCV]; bits<5> Rn; bits<5> Rm; @@ -1916,9 +1917,9 @@ class BaseCondSelect<bit op, bits<2> op2, RegisterClass regtype, string asm> : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond), asm, "\t$Rd, $Rn, $Rm, $cond", "", [(set regtype:$Rd, - (ARM64csel regtype:$Rn, regtype:$Rm, (i32 imm:$cond), CPSR))]>, + (ARM64csel regtype:$Rn, regtype:$Rm, (i32 imm:$cond), NZCV))]>, Sched<[WriteI]> { - let Uses = [CPSR]; + let Uses = [NZCV]; bits<5> Rd; bits<5> Rn; @@ -1949,9 +1950,9 @@ class BaseCondSelectOp<bit op, bits<2> op2, RegisterClass regtype, string asm, asm, "\t$Rd, $Rn, $Rm, $cond", "", [(set regtype:$Rd, (ARM64csel regtype:$Rn, (frag regtype:$Rm), - (i32 imm:$cond), CPSR))]>, + (i32 imm:$cond), NZCV))]>, Sched<[WriteI]> { - let Uses = [CPSR]; + let Uses = [NZCV]; bits<5> Rd; bits<5> Rn; @@ -1980,11 +1981,11 @@ multiclass CondSelectOp<bit op, bits<2> op2, string asm, PatFrag frag> { let Inst{31} = 1; } - def : Pat<(ARM64csel (frag GPR32:$Rm), GPR32:$Rn, (i32 imm:$cond), CPSR), + def : Pat<(ARM64csel (frag GPR32:$Rm), GPR32:$Rn, (i32 imm:$cond), NZCV), (!cast<Instruction>(NAME # Wr) GPR32:$Rn, GPR32:$Rm, (inv_cond_XFORM imm:$cond))>; - def : Pat<(ARM64csel (frag GPR64:$Rm), GPR64:$Rn, (i32 imm:$cond), CPSR), + def : Pat<(ARM64csel (frag GPR64:$Rm), GPR64:$Rn, (i32 imm:$cond), NZCV), (!cast<Instruction>(NAME # Xr) GPR64:$Rn, GPR64:$Rm, (inv_cond_XFORM imm:$cond))>; } @@ -3610,27 +3611,27 @@ class BaseTwoOperandFPComparison<bit signalAllNans, RegisterClass regtype, multiclass FPComparison<bit signalAllNans, string asm, SDPatternOperator OpNode = null_frag> { - let Defs = [CPSR] in { + let Defs = [NZCV] in { def Srr : BaseTwoOperandFPComparison<signalAllNans, FPR32, asm, - [(OpNode FPR32:$Rn, (f32 FPR32:$Rm)), (implicit CPSR)]> { + [(OpNode FPR32:$Rn, (f32 FPR32:$Rm)), (implicit NZCV)]> { let Inst{22} = 0; } def Sri : BaseOneOperandFPComparison<signalAllNans, FPR32, asm, - [(OpNode (f32 FPR32:$Rn), fpimm0), (implicit CPSR)]> { + [(OpNode (f32 FPR32:$Rn), fpimm0), (implicit NZCV)]> { let Inst{22} = 0; } def Drr : BaseTwoOperandFPComparison<signalAllNans, FPR64, asm, - [(OpNode FPR64:$Rn, (f64 FPR64:$Rm)), (implicit CPSR)]> { + [(OpNode FPR64:$Rn, (f64 FPR64:$Rm)), (implicit NZCV)]> { let Inst{22} = 1; } def Dri : BaseOneOperandFPComparison<signalAllNans, FPR64, asm, - [(OpNode (f64 FPR64:$Rn), fpimm0), (implicit CPSR)]> { + [(OpNode (f64 FPR64:$Rn), fpimm0), (implicit NZCV)]> { let Inst{22} = 1; } - } // Defs = [CPSR] + } // Defs = [NZCV] } //--- @@ -3659,7 +3660,7 @@ class BaseFPCondComparison<bit signalAllNans, } multiclass FPCondComparison<bit signalAllNans, string asm> { - let Defs = [CPSR], Uses = [CPSR] in { + let Defs = [NZCV], Uses = [NZCV] in { def Srr : BaseFPCondComparison<signalAllNans, FPR32, asm> { let Inst{22} = 0; } @@ -3667,7 +3668,7 @@ multiclass FPCondComparison<bit signalAllNans, string asm> { def Drr : BaseFPCondComparison<signalAllNans, FPR64, asm> { let Inst{22} = 1; } - } // Defs = [CPSR], Uses = [CPSR] + } // Defs = [NZCV], Uses = [NZCV] } //--- @@ -3679,7 +3680,7 @@ class BaseFPCondSelect<RegisterClass regtype, ValueType vt, string asm> asm, "\t$Rd, $Rn, $Rm, $cond", "", [(set regtype:$Rd, (ARM64csel (vt regtype:$Rn), regtype:$Rm, - (i32 imm:$cond), CPSR))]>, + (i32 imm:$cond), NZCV))]>, Sched<[WriteF]> { bits<5> Rd; bits<5> Rn; @@ -3696,7 +3697,7 @@ class BaseFPCondSelect<RegisterClass regtype, ValueType vt, string asm> } multiclass FPCondSelect<string asm> { - let Uses = [CPSR] in { + let Uses = [NZCV] in { def Srrr : BaseFPCondSelect<FPR32, f32, asm> { let Inst{22} = 0; } @@ -3704,7 +3705,7 @@ multiclass FPCondSelect<string asm> { def Drrr : BaseFPCondSelect<FPR64, f64, asm> { let Inst{22} = 1; } - } // Uses = [CPSR] + } // Uses = [NZCV] } //--- |

