@@ -47,6 +47,10 @@ 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+
5054// HasHardQuad - This is true when the target processor supports quad floating
5155// point instructions.
5256def HasHardQuad : Predicate<"Subtarget->hasHardQuad()">;
@@ -467,22 +471,6 @@ multiclass LoadA<string OpcStr, bits<6> Op3Val, bits<6> LoadAOp3Val,
467471 defm A : LoadASI<OpcStr, LoadAOp3Val, RC>;
468472}
469473
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-
486474// Store multiclass - Define both Reg+Reg/Reg+Imm patterns in one shot.
487475multiclass Store<string OpcStr, bits<6> Op3Val, SDPatternOperator OpNode,
488476 RegisterClass RC, ValueType Ty, InstrItinClass itin = IIC_st> {
@@ -740,6 +728,22 @@ let rd = 1, mayStore = 1, Uses = [FSR] in {
740728 "stx %fsr, [$addr]", []>, Requires<[HasV9]>;
741729}
742730
731+ // B.7. Atomic Load-Store Unsigned Byte Instructions
732+ // (Atomic test-and-set)
733+ // TODO look into the possibility to use this to implment `atomic_flag`.
734+ // If it's possible, then LDSTUB is the preferred way to do it.
735+ def LDSTUBrr : F3_1<3, 0b001101, (outs IntRegs:$rd), (ins (MEMrr $rs1, $rs2):$addr),
736+ "ldstub [$addr], $rd", []>;
737+ def LDSTUBri : F3_2<3, 0b001101, (outs IntRegs:$rd), (ins (MEMri $rs1, $simm13):$addr),
738+ "ldstub [$addr], $rd", []>;
739+ def LDSTUBArr : F3_1_asi<3, 0b011101, (outs IntRegs:$rd),
740+ (ins (MEMrr $rs1, $rs2):$addr, ASITag:$asi),
741+ "ldstuba [$addr] $asi, $rd", []>;
742+ let Predicates = [HasV9], Uses = [ASR3] in
743+ def LDSTUBAri : F3_2<3, 0b011101, (outs IntRegs:$rd),
744+ (ins (MEMri $rs1, $simm13):$addr),
745+ "ldstuba [$addr] %asi, $rd", []>;
746+
743747// Section B.8 - SWAP Register with Memory Instruction
744748// (Atomic swap)
745749let Constraints = "$val = $rd" in {
@@ -1968,4 +1972,5 @@ def : Pat<(build_vector (i32 IntRegs:$a1), (i32 IntRegs:$a2)),
19681972
19691973include "SparcInstr64Bit.td"
19701974include "SparcInstrVIS.td"
1975+ include "SparcInstrUAOSA.td"
19711976include "SparcInstrAliases.td"
0 commit comments