@@ -467,22 +467,6 @@ multiclass LoadA<string OpcStr, bits<6> Op3Val, bits<6> LoadAOp3Val,
467467 defm A : LoadASI<OpcStr, LoadAOp3Val, RC>;
468468}
469469
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-
486470// Store multiclass - Define both Reg+Reg/Reg+Imm patterns in one shot.
487471multiclass Store<string OpcStr, bits<6> Op3Val, SDPatternOperator OpNode,
488472 RegisterClass RC, ValueType Ty, InstrItinClass itin = IIC_st> {
@@ -740,6 +724,22 @@ let rd = 1, mayStore = 1, Uses = [FSR] in {
740724 "stx %fsr, [$addr]", []>, Requires<[HasV9]>;
741725}
742726
727+ // B.7. Atomic Load-Store Unsigned Byte Instructions
728+ // (Atomic test-and-set)
729+ // TODO look into the possibility to use this to implment `atomic_flag`.
730+ // If it's possible, then LDSTUB is the preferred way to do it.
731+ def LDSTUBrr : F3_1<3, 0b001101, (outs IntRegs:$rd), (ins (MEMrr $rs1, $rs2):$addr),
732+ "ldstub [$addr], $rd", []>;
733+ def LDSTUBri : F3_2<3, 0b001101, (outs IntRegs:$rd), (ins (MEMri $rs1, $simm13):$addr),
734+ "ldstub [$addr], $rd", []>;
735+ def LDSTUBArr : F3_1_asi<3, 0b011101, (outs IntRegs:$rd),
736+ (ins (MEMrr $rs1, $rs2):$addr, ASITag:$asi),
737+ "ldstuba [$addr] $asi, $rd", []>;
738+ let Predicates = [HasV9], Uses = [ASR3] in
739+ def LDSTUBAri : F3_2<3, 0b011101, (outs IntRegs:$rd),
740+ (ins (MEMri $rs1, $simm13):$addr),
741+ "ldstuba [$addr] %asi, $rd", []>;
742+
743743// Section B.8 - SWAP Register with Memory Instruction
744744// (Atomic swap)
745745let Constraints = "$val = $rd" in {
0 commit comments