@@ -47,6 +47,14 @@ def HasVIS2 : Predicate<"Subtarget->isVIS2()">,
4747def HasVIS3 : Predicate<"Subtarget->isVIS3()">,
4848 AssemblerPredicate<(all_of FeatureVIS3)>;
4949
50+ // HasUA2005 - This is true when the target processor has UA 2005 extensions.
51+ def HasUA2005 : Predicate<"Subtarget->isUA2005()">,
52+ AssemblerPredicate<(all_of FeatureUA2005)>;
53+
54+ // HasUA2007 - This is true when the target processor has UA 2007 extensions.
55+ def HasUA2007 : Predicate<"Subtarget->isUA2007()">,
56+ AssemblerPredicate<(all_of FeatureUA2007)>;
57+
5058// HasHardQuad - This is true when the target processor supports quad floating
5159// point instructions.
5260def HasHardQuad : Predicate<"Subtarget->hasHardQuad()">;
@@ -467,22 +475,6 @@ multiclass LoadA<string OpcStr, bits<6> Op3Val, bits<6> LoadAOp3Val,
467475 defm A : LoadASI<OpcStr, LoadAOp3Val, RC>;
468476}
469477
470-
471- // The LDSTUB instruction is supported for asm only.
472- // It is unlikely that general-purpose code could make use of it.
473- // CAS is preferred for sparc v9.
474- def LDSTUBrr : F3_1<3, 0b001101, (outs IntRegs:$rd), (ins (MEMrr $rs1, $rs2):$addr),
475- "ldstub [$addr], $rd", []>;
476- def LDSTUBri : F3_2<3, 0b001101, (outs IntRegs:$rd), (ins (MEMri $rs1, $simm13):$addr),
477- "ldstub [$addr], $rd", []>;
478- def LDSTUBArr : F3_1_asi<3, 0b011101, (outs IntRegs:$rd),
479- (ins (MEMrr $rs1, $rs2):$addr, ASITag:$asi),
480- "ldstuba [$addr] $asi, $rd", []>;
481- let Predicates = [HasV9], Uses = [ASR3] in
482- def LDSTUBAri : F3_2<3, 0b011101, (outs IntRegs:$rd),
483- (ins (MEMri $rs1, $simm13):$addr),
484- "ldstuba [$addr] %asi, $rd", []>;
485-
486478// Store multiclass - Define both Reg+Reg/Reg+Imm patterns in one shot.
487479multiclass Store<string OpcStr, bits<6> Op3Val, SDPatternOperator OpNode,
488480 RegisterClass RC, ValueType Ty, InstrItinClass itin = IIC_st> {
@@ -740,6 +732,22 @@ let rd = 1, mayStore = 1, Uses = [FSR] in {
740732 "stx %fsr, [$addr]", []>, Requires<[HasV9]>;
741733}
742734
735+ // B.7. Atomic Load-Store Unsigned Byte Instructions
736+ // (Atomic test-and-set)
737+ // TODO look into the possibility to use this to implment `atomic_flag`.
738+ // If it's possible, then LDSTUB is the preferred way to do it.
739+ def LDSTUBrr : F3_1<3, 0b001101, (outs IntRegs:$rd), (ins (MEMrr $rs1, $rs2):$addr),
740+ "ldstub [$addr], $rd", []>;
741+ def LDSTUBri : F3_2<3, 0b001101, (outs IntRegs:$rd), (ins (MEMri $rs1, $simm13):$addr),
742+ "ldstub [$addr], $rd", []>;
743+ def LDSTUBArr : F3_1_asi<3, 0b011101, (outs IntRegs:$rd),
744+ (ins (MEMrr $rs1, $rs2):$addr, ASITag:$asi),
745+ "ldstuba [$addr] $asi, $rd", []>;
746+ let Predicates = [HasV9], Uses = [ASR3] in
747+ def LDSTUBAri : F3_2<3, 0b011101, (outs IntRegs:$rd),
748+ (ins (MEMri $rs1, $simm13):$addr),
749+ "ldstuba [$addr] %asi, $rd", []>;
750+
743751// Section B.8 - SWAP Register with Memory Instruction
744752// (Atomic swap)
745753let Constraints = "$val = $rd" in {
@@ -1968,4 +1976,5 @@ def : Pat<(build_vector (i32 IntRegs:$a1), (i32 IntRegs:$a2)),
19681976
19691977include "SparcInstr64Bit.td"
19701978include "SparcInstrVIS.td"
1979+ include "SparcInstrUAOSA.td"
19711980include "SparcInstrAliases.td"
0 commit comments