@@ -152,6 +152,7 @@ func init() {
152
152
gpstoreconstidx = regInfo {inputs : []regMask {gpspsbg , gpsp , 0 }}
153
153
gpstorexchg = regInfo {inputs : []regMask {gp , gpspsbg , 0 }, outputs : []regMask {gp }}
154
154
cmpxchg = regInfo {inputs : []regMask {gp , ax , gp , 0 }, outputs : []regMask {gp , 0 }, clobbers : ax }
155
+ atomicLogic = regInfo {inputs : []regMask {gp &^ ax , gp &^ ax , 0 }, outputs : []regMask {ax , 0 }}
155
156
156
157
fp01 = regInfo {inputs : nil , outputs : fponly }
157
158
fp21 = regInfo {inputs : []regMask {fp , fp }, outputs : fponly }
@@ -1040,11 +1041,22 @@ func init() {
1040
1041
{name : "CMPXCHGLlock" , argLength : 4 , reg : cmpxchg , asm : "CMPXCHGL" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" },
1041
1042
{name : "CMPXCHGQlock" , argLength : 4 , reg : cmpxchg , asm : "CMPXCHGQ" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" },
1042
1043
1043
- // Atomic memory updates.
1044
+ // Atomic memory updates using logical operations.
1045
+ // Old style that just returns the memory state.
1044
1046
{name : "ANDBlock" , argLength : 3 , reg : gpstore , asm : "ANDB" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) &= arg1
1045
1047
{name : "ANDLlock" , argLength : 3 , reg : gpstore , asm : "ANDL" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) &= arg1
1048
+ {name : "ANDQlock" , argLength : 3 , reg : gpstore , asm : "ANDQ" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) &= arg1
1046
1049
{name : "ORBlock" , argLength : 3 , reg : gpstore , asm : "ORB" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) |= arg1
1047
1050
{name : "ORLlock" , argLength : 3 , reg : gpstore , asm : "ORL" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) |= arg1
1051
+ {name : "ORQlock" , argLength : 3 , reg : gpstore , asm : "ORQ" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" }, // *(arg0+auxint+aux) |= arg1
1052
+
1053
+ // Atomic memory updates using logical operations.
1054
+ // *(arg0+auxint+aux) op= arg1. arg2=mem.
1055
+ // New style that returns a tuple of <old contents of *(arg0+auxint+aux), memory>.
1056
+ {name : "LoweredAtomicAnd64" , argLength : 3 , reg : atomicLogic , resultNotInArgs : true , asm : "ANDQ" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" , unsafePoint : true , needIntTemp : true },
1057
+ {name : "LoweredAtomicAnd32" , argLength : 3 , reg : atomicLogic , resultNotInArgs : true , asm : "ANDL" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" , unsafePoint : true , needIntTemp : true },
1058
+ {name : "LoweredAtomicOr64" , argLength : 3 , reg : atomicLogic , resultNotInArgs : true , asm : "ORQ" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" , unsafePoint : true , needIntTemp : true },
1059
+ {name : "LoweredAtomicOr32" , argLength : 3 , reg : atomicLogic , resultNotInArgs : true , asm : "ORL" , aux : "SymOff" , clobberFlags : true , faultOnNilArg0 : true , hasSideEffects : true , symEffect : "RdWr" , unsafePoint : true , needIntTemp : true },
1048
1060
1049
1061
// Prefetch instructions
1050
1062
// Do prefetch arg0 address. arg0=addr, arg1=memory. Instruction variant selects locality hint
0 commit comments