diff options
| author | Daniel Cederman <cederman@gaisler.com> | 2018-09-27 12:34:48 +0000 |
|---|---|---|
| committer | Daniel Cederman <cederman@gaisler.com> | 2018-09-27 12:34:48 +0000 |
| commit | c1968ba5d339bf34612d32a31f8cd993dd7e7ab2 (patch) | |
| tree | 13a100491a11528f304b77744b8b1f0e7a571b25 /llvm/lib | |
| parent | 7829a938c5e14d9c67e53265d42202f74c48cd77 (diff) | |
| download | bcm5719-llvm-c1968ba5d339bf34612d32a31f8cd993dd7e7ab2.tar.gz bcm5719-llvm-c1968ba5d339bf34612d32a31f8cd993dd7e7ab2.zip | |
[Sparc] Add support for the partial write PSR instruction
Summary:
Partial write %PSR (WRPSR) is a SPARC V8e option that allows WRPSR
instructions to only affect the %PSR.ET field. It is supported by
the GR740 and GR716.
Reviewers: jyknight, venkatra
Subscribers: fedor.sergeev, jrtc27, llvm-commits
Differential Revision: https://reviews.llvm.org/D48644
llvm-svn: 343202
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Sparc/Sparc.td | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcInstrAliases.td | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcInstrInfo.td | 16 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcSubtarget.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcSubtarget.h | 2 |
5 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/Sparc/Sparc.td b/llvm/lib/Target/Sparc/Sparc.td index 0c69605fd7b..0412215be8a 100644 --- a/llvm/lib/Target/Sparc/Sparc.td +++ b/llvm/lib/Target/Sparc/Sparc.td @@ -49,6 +49,9 @@ def FeatureVIS3 def FeatureLeon : SubtargetFeature<"leon", "IsLeon", "true", "Enable LEON extensions">; +def FeaturePWRPSR + : SubtargetFeature<"leonpwrpsr", "HasPWRPSR", "true", + "Enable the PWRPSR instruction">; def FeatureHardQuad : SubtargetFeature<"hard-quad-float", "HasHardQuad", "true", @@ -159,7 +162,8 @@ def : Processor<"leon4", LEON4Itineraries, // LEON 4 FT (GR740) // TO DO: Place-holder: Processor specific features will be added *very* soon here. def : Processor<"gr740", LEON4Itineraries, - [FeatureLeon, UMACSMACSupport, LeonCASA, LeonCycleCounter]>; + [FeatureLeon, UMACSMACSupport, LeonCASA, LeonCycleCounter, + FeaturePWRPSR]>; //===----------------------------------------------------------------------===// // Declare the target which we are implementing diff --git a/llvm/lib/Target/Sparc/SparcInstrAliases.td b/llvm/lib/Target/Sparc/SparcInstrAliases.td index 352090ed92c..fc6844c3985 100644 --- a/llvm/lib/Target/Sparc/SparcInstrAliases.td +++ b/llvm/lib/Target/Sparc/SparcInstrAliases.td @@ -470,6 +470,8 @@ def : InstAlias<"wr $simm13, %wim", (WRWIMri G0, i32imm:$simm13), 0>; def : InstAlias<"wr $rs2, %tbr", (WRTBRrr G0, IntRegs:$rs2), 0>; def : InstAlias<"wr $simm13, %tbr", (WRTBRri G0, i32imm:$simm13), 0>; +def : InstAlias<"pwr $rs2, %psr", (PWRPSRrr G0, IntRegs:$rs2), 0>; +def : InstAlias<"pwr $simm13, %psr", (PWRPSRri G0, i32imm:$simm13), 0>; // flush -> flush %g0 def : InstAlias<"flush", (FLUSH), 0>; diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td index f1abd3a836c..428ba2d3e15 100644 --- a/llvm/lib/Target/Sparc/SparcInstrInfo.td +++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td @@ -56,6 +56,11 @@ def HasHardQuad : Predicate<"Subtarget->hasHardQuad()">; // instruction def HasLeonCASA : Predicate<"Subtarget->hasLeonCasa()">; +// HasPWRPSR - This is true when the target processor supports partial +// writes to the PSR register that only affects the ET field. +def HasPWRPSR : Predicate<"Subtarget->hasPWRPSR()">, + AssemblerPredicate<"FeaturePWRPSR">; + // HasUMAC_SMAC - This is true when the target processor supports the // UMAC and SMAC instructions def HasUMAC_SMAC : Predicate<"Subtarget->hasUmacSmac()">; @@ -1587,6 +1592,17 @@ let Predicates = [HasUMAC_SMAC], Defs = [Y, ASR18], Uses = [Y, ASR18] in { [], IIC_smac_umac>; } +// The partial write WRPSR instruction has a non-zero destination +// register value to separate it from the standard instruction. +let Predicates = [HasPWRPSR], Defs = [PSR], rd=1 in { + def PWRPSRrr : F3_1<2, 0b110001, + (outs), (ins IntRegs:$rs1, IntRegs:$rs2), + "pwr $rs1, $rs2, %psr", []>; + def PWRPSRri : F3_2<2, 0b110001, + (outs), (ins IntRegs:$rs1, simm13Op:$simm13), + "pwr $rs1, $simm13, %psr", []>; +} + let Defs = [ICC] in { defm TADDCC : F3_12np<"taddcc", 0b100000>; defm TSUBCC : F3_12np<"tsubcc", 0b100001>; diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp index f3a2049ce38..5301fc30a00 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp +++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp @@ -44,6 +44,7 @@ SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(StringRef CPU, // Leon features HasLeonCasa = false; HasUmacSmac = false; + HasPWRPSR = false; InsertNOPLoad = false; FixAllFDIVSQRT = false; DetectRoundChange = false; diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.h b/llvm/lib/Target/Sparc/SparcSubtarget.h index 65627f4f70f..24ea41a266e 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.h +++ b/llvm/lib/Target/Sparc/SparcSubtarget.h @@ -47,6 +47,7 @@ class SparcSubtarget : public SparcGenSubtargetInfo { // LEON features bool HasUmacSmac; bool HasLeonCasa; + bool HasPWRPSR; bool InsertNOPLoad; bool FixAllFDIVSQRT; bool DetectRoundChange; @@ -93,6 +94,7 @@ public: // Leon options bool hasUmacSmac() const { return HasUmacSmac; } bool hasLeonCasa() const { return HasLeonCasa; } + bool hasPWRPSR() const { return HasPWRPSR; } bool insertNOPLoad() const { return InsertNOPLoad; } bool fixAllFDIVSQRT() const { return FixAllFDIVSQRT; } bool detectRoundChange() const { return DetectRoundChange; } |

