[llvm] [WIP][SPARC][IAS] Implement Solaris Natural Instruction extension (PR #170794)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 6 03:42:08 PST 2025
https://github.com/koachan updated https://github.com/llvm/llvm-project/pull/170794
>From 1ab69fcdcffee96deb9143d596c145358c9c9dba Mon Sep 17 00:00:00 2001
From: Koakuma <koachan at protonmail.com>
Date: Thu, 20 Nov 2025 21:29:02 +0700
Subject: [PATCH 1/2] [WIP][SPARC][IAS] Implement Solaris Natural Instruction
extension
We match GCC's coverage of the extension, that is, everything except `setn`
and `setnhi`.
See also: https://docs.oracle.com/cd/E53394_01/html/E54833/gmael.html
---
.../Sparc/MCTargetDesc/SparcMCTargetDesc.cpp | 5 +-
llvm/lib/Target/Sparc/Sparc.td | 12 +-
llvm/lib/Target/Sparc/SparcInstrAliases.td | 108 +++++++++++++++---
llvm/lib/Target/Sparc/SparcInstrInfo.td | 5 +-
llvm/lib/Target/Sparc/SparcSubtarget.cpp | 7 +-
.../MC/Sparc/sparc-natural-instructions.s | 42 +++++++
6 files changed, 153 insertions(+), 26 deletions(-)
create mode 100644 llvm/test/MC/Sparc/sparc-natural-instructions.s
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
index 9fa60ee5229ba..862ba3c64958d 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
@@ -85,10 +85,13 @@ createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
MCSubtargetInfo *STI =
createSparcMCSubtargetInfoImpl(TT, CPU, /*TuneCPU=*/CPU, FS);
+ FeatureBitset Features = STI->getFeatureBits();
if (TT.isSPARC64() && !STI->hasFeature(Sparc::Feature64Bit)) {
- FeatureBitset Features = STI->getFeatureBits();
STI->setFeatureBits(Features.set(Sparc::Feature64Bit));
+ } else if (!TT.isSPARC64() && !STI->hasFeature(Sparc::Feature32Bit)) {
+ STI->setFeatureBits(Features.set(Sparc::Feature32Bit));
}
+ assert(Features.test(Sparc::Feature32Bit) != Features.test(Sparc::Feature64Bit));
return STI;
}
diff --git a/llvm/lib/Target/Sparc/Sparc.td b/llvm/lib/Target/Sparc/Sparc.td
index ecf82fab5cc41..2ef8d7e57f398 100644
--- a/llvm/lib/Target/Sparc/Sparc.td
+++ b/llvm/lib/Target/Sparc/Sparc.td
@@ -23,20 +23,15 @@ include "llvm/TableGen/SearchableTable.td"
def FeatureSoftMulDiv
: SubtargetFeature<"soft-mul-div", "UseSoftMulDiv", "true",
"Use software emulation for integer multiply and divide">;
-
def FeatureNoFSMULD
: SubtargetFeature<"no-fsmuld", "HasNoFSMULD", "true",
"Disable the fsmuld instruction.">;
def FeatureNoFMULS
: SubtargetFeature<"no-fmuls", "HasNoFMULS", "true",
"Disable the fmuls instruction.">;
-
def FeatureV9
: SubtargetFeature<"v9", "IsV9", "true",
"Enable SPARC-V9 instructions">;
-def Feature64Bit : SubtargetFeature<"64bit", "Is64Bit", "true",
- "Enable 64-bit mode", [FeatureV9]>;
-
def FeatureV8Plus
: SubtargetFeature<"v8plus", "IsV8Plus", "true",
"Enable V8+ mode, allowing use of 64-bit V9 instructions in 32-bit code">;
@@ -77,17 +72,18 @@ def FeatureLeon
def FeaturePWRPSR
: SubtargetFeature<"leonpwrpsr", "HasPWRPSR", "true",
"Enable the PWRPSR instruction">;
-
def FeatureHardQuad
: SubtargetFeature<"hard-quad-float", "HasHardQuad", "true",
"Enable quad-word floating point instructions">;
-
def UsePopc : SubtargetFeature<"popc", "UsePopc", "true",
"Use the popc (population count) instruction">;
def FeatureSoftFloat : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
"Use software emulation for floating point">;
-
+def Feature32Bit : SubtargetFeature<"32bit", "Is32Bit", "true",
+ "Enable 32-bit mode">;
+def Feature64Bit : SubtargetFeature<"64bit", "Is64Bit", "true",
+ "Enable 64-bit mode", [FeatureV9]>;
//===----------------------------------------------------------------------===//
// SPARC Subtarget tuning features.
//
diff --git a/llvm/lib/Target/Sparc/SparcInstrAliases.td b/llvm/lib/Target/Sparc/SparcInstrAliases.td
index 459fd193db0ed..bc87ab2539e9c 100644
--- a/llvm/lib/Target/Sparc/SparcInstrAliases.td
+++ b/llvm/lib/Target/Sparc/SparcInstrAliases.td
@@ -101,114 +101,168 @@ multiclass int_cond_alias<string cond, int condVal> {
// b<cond> %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), " %icc, $imm"),
(BPICC brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), " %ncc, $imm"),
+ (BPICC brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond>,pt %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",pt %icc, $imm"),
(BPICC brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",pt %ncc, $imm"),
+ (BPICC brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond>,a %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a %icc, $imm"),
(BPICCA brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a %ncc, $imm"),
+ (BPICCA brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond>,a,pt %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pt %icc, $imm"),
(BPICCA brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pt %ncc, $imm"),
+ (BPICCA brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond>,pn %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",pn %icc, $imm"),
(BPICCNT brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",pn %ncc, $imm"),
+ (BPICCNT brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond>,a,pn %icc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pn %icc, $imm"),
(BPICCANT brtarget:$imm, condVal)>, Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pn %ncc, $imm"),
+ (BPICCANT brtarget:$imm, condVal)>, Requires<[HasV9, Is32Bit]>;
// b<cond> %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), " %xcc, $imm"),
(BPXCC brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), " %ncc, $imm"),
+ (BPXCC brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
// b<cond>,pt %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",pt %xcc, $imm"),
(BPXCC brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",pt %ncc, $imm"),
+ (BPXCC brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
// b<cond>,a %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a %xcc, $imm"),
(BPXCCA brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a %ncc, $imm"),
+ (BPXCCA brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
// b<cond>,a,pt %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pt %xcc, $imm"),
(BPXCCA brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pt %ncc, $imm"),
+ (BPXCCA brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
// b<cond>,pn %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",pn %xcc, $imm"),
(BPXCCNT brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",pn %ncc, $imm"),
+ (BPXCCNT brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
// b<cond>,a,pn %xcc, $imm
def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pn %xcc, $imm"),
(BPXCCANT brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
-
+ def : InstAlias<!strconcat(!strconcat("b", cond), ",a,pn %ncc, $imm"),
+ (BPXCCANT brtarget:$imm, condVal)>, Requires<[Is64Bit]>;
defm : intcond_mov_alias<cond, condVal, " %icc",
MOVICCrr, MOVICCri,
FMOVS_ICC, FMOVD_ICC>, Requires<[HasV9]>;
+ defm : intcond_mov_alias<cond, condVal, " %ncc",
+ MOVICCrr, MOVICCri,
+ FMOVS_ICC, FMOVD_ICC>, Requires<[Is32Bit, HasV9]>;
+
defm : intcond_mov_alias<cond, condVal, " %xcc",
MOVXCCrr, MOVXCCri,
FMOVS_XCC, FMOVD_XCC>, Requires<[Is64Bit]>;
+ defm : intcond_mov_alias<cond, condVal, " %ncc",
+ MOVXCCrr, MOVXCCri,
+ FMOVS_XCC, FMOVD_XCC>, Requires<[Is64Bit]>;
+
// fmovq<cond> (%icc|%xcc), $rs2, $rd
def : InstAlias<!strconcat(!strconcat("fmovq", cond), " %icc, $rs2, $rd"),
(FMOVQ_ICC QFPRegs:$rd, QFPRegs:$rs2, condVal)>,
Requires<[HasV9, HasHardQuad]>;
+ def : InstAlias<!strconcat(!strconcat("fmovq", cond), " %ncc, $rs2, $rd"),
+ (FMOVQ_ICC QFPRegs:$rd, QFPRegs:$rs2, condVal)>,
+ Requires<[HasV9, Is32Bit, HasHardQuad]>;
def : InstAlias<!strconcat(!strconcat("fmovq", cond), " %xcc, $rs2, $rd"),
(FMOVQ_XCC QFPRegs:$rd, QFPRegs:$rs2, condVal)>,
Requires<[Is64Bit, HasHardQuad]>;
+ def : InstAlias<!strconcat(!strconcat("fmovq", cond), " %ncc, $rs2, $rd"),
+ (FMOVQ_XCC QFPRegs:$rd, QFPRegs:$rs2, condVal)>,
+ Requires<[Is64Bit, HasHardQuad]>;
// t<cond> %icc, rs => t<cond> %icc, G0 + rs
def : InstAlias<!strconcat(!strconcat("t", cond), " %icc, $rs2"),
(TICCrr G0, IntRegs:$rs2, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs2"),
+ (TICCrr G0, IntRegs:$rs2, condVal)>,
+ Requires<[HasV9, Is32Bit]>;
+
// t<cond> %icc, rs1 + rs2
def : InstAlias<!strconcat(!strconcat("t", cond), " %icc, $rs1 + $rs2"),
(TICCrr IntRegs:$rs1, IntRegs:$rs2, condVal)>,
Requires<[HasV9]>;
-
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs1 + $rs2"),
+ (TICCrr IntRegs:$rs1, IntRegs:$rs2, condVal)>,
+ Requires<[HasV9, Is32Bit]>;
// t<cond> %xcc, rs => t<cond> %xcc, G0 + rs
def : InstAlias<!strconcat(!strconcat("t", cond), " %xcc, $rs2"),
(TXCCrr G0, IntRegs:$rs2, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs2"),
+ (TXCCrr G0, IntRegs:$rs2, condVal)>,
+ Requires<[HasV9, Is64Bit]>;
+
// t<cond> %xcc, rs1 + rs2
def : InstAlias<!strconcat(!strconcat("t", cond), " %xcc, $rs1 + $rs2"),
(TXCCrr IntRegs:$rs1, IntRegs:$rs2, condVal)>,
Requires<[HasV9]>;
-
-
- // t<cond> rs=> t<cond> %icc, G0 + rs2
- //def : InstAlias<!strconcat(!strconcat("t", cond), " $rs2"),
- // (TICCrr G0, IntRegs:$rs2, condVal)>,
- // Requires<[HasV9]>;
-
- // t<cond> rs1 + rs2 => t<cond> %icc, rs1 + rs2
- //def : InstAlias<!strconcat(!strconcat("t", cond), " $rs1 + $rs2"),
- // (TICCrr IntRegs:$rs1, IntRegs:$rs2, condVal)>,
- // Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs1 + $rs2"),
+ (TXCCrr IntRegs:$rs1, IntRegs:$rs2, condVal)>,
+ Requires<[HasV9, Is64Bit]>;
// t<cond> %icc, imm => t<cond> %icc, G0 + imm
def : InstAlias<!strconcat(!strconcat("t", cond), " %icc, $imm"),
(TICCri G0, i32imm:$imm, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $imm"),
+ (TICCri G0, i32imm:$imm, condVal)>,
+ Requires<[HasV9, Is32Bit]>;
+
// t<cond> %icc, rs1 + imm
def : InstAlias<!strconcat(!strconcat("t", cond), " %icc, $rs1 + $imm"),
(TICCri IntRegs:$rs1, i32imm:$imm, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs1 + $imm"),
+ (TICCri IntRegs:$rs1, i32imm:$imm, condVal)>,
+ Requires<[HasV9, Is32Bit]>;
+
// t<cond> %xcc, imm => t<cond> %xcc, G0 + imm
def : InstAlias<!strconcat(!strconcat("t", cond), " %xcc, $imm"),
(TXCCri G0, i32imm:$imm, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $imm"),
+ (TXCCri G0, i32imm:$imm, condVal)>,
+ Requires<[HasV9, Is64Bit]>;
+
// t<cond> %xcc, rs1 + imm
def : InstAlias<!strconcat(!strconcat("t", cond), " %xcc, $rs1 + $imm"),
(TXCCri IntRegs:$rs1, i32imm:$imm, condVal)>,
Requires<[HasV9]>;
+ def : InstAlias<!strconcat(!strconcat("t", cond), " %ncc, $rs1 + $imm"),
+ (TXCCri IntRegs:$rs1, i32imm:$imm, condVal)>,
+ Requires<[HasV9, Is64Bit]>;
// t<cond> imm => t<cond> G0 + imm
def : InstAlias<!strconcat(!strconcat("t", cond), " $imm"),
@@ -599,7 +653,8 @@ def : InstAlias<"clrh [$addr]", (STHrr MEMrr:$addr, G0), 0>;
def : InstAlias<"clrh [$addr]", (STHri MEMri:$addr, G0), 0>;
def : InstAlias<"clr [$addr]", (STrr MEMrr:$addr, G0), 0>;
def : InstAlias<"clr [$addr]", (STri MEMri:$addr, G0), 0>;
-
+def : InstAlias<"clrx [$addr]", (STXrr MEMrr:$addr, G0), 0>, Requires<[HasV9]>;
+def : InstAlias<"clrx [$addr]", (STXri MEMri:$addr, G0), 0>, Requires<[HasV9]>;
// mov reg_or_imm, rd -> or %g0, reg_or_imm, rd
def : InstAlias<"mov $rs2, $rd", (ORrr IntRegs:$rd, G0, IntRegs:$rs2)>;
@@ -701,6 +756,31 @@ def : MnemonicAlias<"addccc", "addxcc">, Requires<[HasV9]>;
def : MnemonicAlias<"subc", "subx">, Requires<[HasV9]>;
def : MnemonicAlias<"subccc", "subxcc">, Requires<[HasV9]>;
+// Solaris Natural Instructions extension
+// We match GCC's coverage of the extension; everything except setn & setnhi.
+// See also: https://docs.oracle.com/cd/E53394_01/html/E54833/gmael.html
+let Predicates = [Is32Bit] in {
+ def : MnemonicAlias<"ldn", "ld">;
+ def : MnemonicAlias<"stn", "st">;
+ def : MnemonicAlias<"ldna", "lda">;
+ def : MnemonicAlias<"stna", "sta">;
+ def : MnemonicAlias<"casn", "cas">;
+ def : MnemonicAlias<"slln", "sll">;
+ def : MnemonicAlias<"srln", "srl">;
+ def : MnemonicAlias<"sran", "sra">;
+ def : MnemonicAlias<"clrn", "clr">;
+}
+let Predicates = [Is64Bit] in {
+ def : MnemonicAlias<"ldn", "ldx">;
+ def : MnemonicAlias<"stn", "stx">;
+ def : MnemonicAlias<"ldna", "ldxa">;
+ def : MnemonicAlias<"stna", "stxa">;
+ def : MnemonicAlias<"casn", "casx">;
+ def : MnemonicAlias<"slln", "sllx">;
+ def : MnemonicAlias<"srln", "srlx">;
+ def : MnemonicAlias<"sran", "srax">;
+ def : MnemonicAlias<"clrn", "clrx">;
+}
def : InstAlias<"fcmps $rs1, $rs2", (V9FCMPS FCC0, FPRegs:$rs1, FPRegs:$rs2)>;
def : InstAlias<"fcmpd $rs1, $rs2", (V9FCMPD FCC0, DFPRegs:$rs1, DFPRegs:$rs2)>;
diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td
index 107817fcab6df..2a02a10da21ec 100644
--- a/llvm/lib/Target/Sparc/SparcInstrInfo.td
+++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td
@@ -21,11 +21,12 @@ include "SparcInstrFormats.td"
//===----------------------------------------------------------------------===//
// True when generating 32-bit code.
-def Is32Bit : Predicate<"!Subtarget->is64Bit()">;
+def Is32Bit : Predicate<"!Subtarget->is64Bit()">,
+ AssemblerPredicate<(all_of Feature32Bit)>;
// True when generating 64-bit code. This also implies HasV9.
def Is64Bit : Predicate<"Subtarget->is64Bit()">,
- AssemblerPredicate<(all_of FeatureV9)>;
+ AssemblerPredicate<(all_of FeatureV9, Feature64Bit)>;
def UseSoftMulDiv : Predicate<"Subtarget->useSoftMulDiv()">,
AssemblerPredicate<(all_of FeatureSoftMulDiv)>;
diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
index 1d72d0bdada03..51e59d1a85321 100644
--- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp
+++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
@@ -40,11 +40,16 @@ SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(
// Parse features string.
ParseSubtargetFeatures(CPUName, TuneCPU, FS);
+ FeatureBitset Features = getFeatureBits();
if (!Is64Bit && TT.isSPARC64()) {
- FeatureBitset Features = getFeatureBits();
setFeatureBits(Features.set(Sparc::Feature64Bit));
Is64Bit = true;
+ } else if (!Is32Bit && !TT.isSPARC64()) {
+ setFeatureBits(Features.set(Sparc::Feature32Bit));
+ Is32Bit = true;
}
+ assert(Features.test(Sparc::Feature32Bit) != Features.test(Sparc::Feature64Bit));
+ assert(Is32Bit != Is64Bit);
// Popc is a v9-only instruction.
if (!IsV9)
diff --git a/llvm/test/MC/Sparc/sparc-natural-instructions.s b/llvm/test/MC/Sparc/sparc-natural-instructions.s
new file mode 100644
index 0000000000000..4f223497b2556
--- /dev/null
+++ b/llvm/test/MC/Sparc/sparc-natural-instructions.s
@@ -0,0 +1,42 @@
+! RUN: llvm-mc %s -triple=sparc -mcpu=v9 -show-encoding | FileCheck %s --check-prefixes=SPARC32
+! RUN: llvm-mc %s -triple=sparcv9 -mcpu=v9 -show-encoding | FileCheck %s --check-prefixes=SPARC64
+
+!! Solaris Natural Instructions.
+
+! SPARC32: .word 305419896
+! SPARC64: .xword 305419896
+.nword 0x12345678
+
+! SPARC32: ld [%o0+8], %g1 ! encoding: [0xc2,0x02,0x20,0x08]
+! SPARC64: ldx [%o0+8], %g1 ! encoding: [0xc2,0x5a,0x20,0x08]
+ldn [%o0 + 8], %g1
+! SPARC32: st %g1, [%o0+8] ! encoding: [0xc2,0x22,0x20,0x08]
+! SPARC64: stx %g1, [%o0+8] ! encoding: [0xc2,0x72,0x20,0x08]
+stn %g1, [%o0 + 8]
+! SPARC32: lda [%o0] #ASI_AIUP, %g1 ! encoding: [0xc2,0x82,0x02,0x00]
+! SPARC64: ldxa [%o0] #ASI_AIUP, %g1 ! encoding: [0xc2,0xda,0x02,0x00]
+ldna [%o0] 0x10, %g1
+! SPARC32: sta %g1, [%o0] #ASI_AIUP ! encoding: [0xc2,0xa2,0x02,0x00]
+! SPARC64: stxa %g1, [%o0] #ASI_AIUP ! encoding: [0xc2,0xf2,0x02,0x00]
+stna %g1, [%o0] 0x10
+! SPARC32: cas [%o0], %g0, %g1 ! encoding: [0xc3,0xe2,0x10,0x00]
+! SPARC64: casx [%o0], %g0, %g1 ! encoding: [0xc3,0xf2,0x10,0x00]
+casn [%o0], %g0, %g1
+! SPARC32: sll %g0, %g1, %g2 ! encoding: [0x85,0x28,0x00,0x01]
+! SPARC64: sllx %g0, %g1, %g2 ! encoding: [0x85,0x28,0x10,0x01]
+slln %g0, %g1, %g2
+! SPARC32: srl %g0, %g1, %g2 ! encoding: [0x85,0x30,0x00,0x01]
+! SPARC64: srlx %g0, %g1, %g2 ! encoding: [0x85,0x30,0x10,0x01]
+srln %g0, %g1, %g2
+! SPARC32: sra %g0, %g1, %g2 ! encoding: [0x85,0x38,0x00,0x01]
+! SPARC64: srax %g0, %g1, %g2 ! encoding: [0x85,0x38,0x10,0x01]
+sran %g0, %g1, %g2
+! SPARC32: st %g0, [%o0+8] ! encoding: [0xc0,0x22,0x20,0x08]
+! SPARC64: stx %g0, [%o0+8] ! encoding: [0xc0,0x72,0x20,0x08]
+clrn [%o0 + 8]
+
+ba %ncc, .
+ta %ncc, 0x6d
+move %ncc, %g1, %g2
+fmovse %ncc, %f0, %f1
+fmovse %ncc, %f0, %f2
>From 755c610c0553b71a23d03f2681cd70b9f1cfef2a Mon Sep 17 00:00:00 2001
From: Koakuma <koachan at protonmail.com>
Date: Sat, 6 Dec 2025 18:41:19 +0700
Subject: [PATCH 2/2] Fix formatting
---
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp | 3 ++-
llvm/lib/Target/Sparc/SparcSubtarget.cpp | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
index 862ba3c64958d..3fac774f1fa60 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
@@ -91,7 +91,8 @@ createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
} else if (!TT.isSPARC64() && !STI->hasFeature(Sparc::Feature32Bit)) {
STI->setFeatureBits(Features.set(Sparc::Feature32Bit));
}
- assert(Features.test(Sparc::Feature32Bit) != Features.test(Sparc::Feature64Bit));
+ assert(Features.test(Sparc::Feature32Bit) !=
+ Features.test(Sparc::Feature64Bit));
return STI;
}
diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
index 51e59d1a85321..9d6473cc91684 100644
--- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp
+++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
@@ -48,7 +48,8 @@ SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(
setFeatureBits(Features.set(Sparc::Feature32Bit));
Is32Bit = true;
}
- assert(Features.test(Sparc::Feature32Bit) != Features.test(Sparc::Feature64Bit));
+ assert(Features.test(Sparc::Feature32Bit) !=
+ Features.test(Sparc::Feature64Bit));
assert(Is32Bit != Is64Bit);
// Popc is a v9-only instruction.
More information about the llvm-commits
mailing list