@@ -142,16 +142,20 @@ func init() {
142
142
gp11sp = regInfo {inputs : []regMask {gpspg }, outputs : []regMask {gp }}
143
143
gp21 = regInfo {inputs : []regMask {gpg , gpg }, outputs : []regMask {gp }}
144
144
gpload = regInfo {inputs : []regMask {gpspsbg }, outputs : []regMask {gp }}
145
+ gp2load = regInfo {inputs : []regMask {gpspsbg , gpg }, outputs : []regMask {gp }}
145
146
gpstore = regInfo {inputs : []regMask {gpspsbg , gpg }}
146
147
gpstore0 = regInfo {inputs : []regMask {gpspsbg }}
148
+ gpstore2 = regInfo {inputs : []regMask {gpspsbg , gpg , gpg }}
147
149
gpxchg = regInfo {inputs : []regMask {gpspsbg , gpg }, outputs : []regMask {gp }}
148
150
gpcas = regInfo {inputs : []regMask {gpspsbg , gpg , gpg }, outputs : []regMask {gp }}
149
151
fp01 = regInfo {inputs : nil , outputs : []regMask {fp }}
150
152
fp11 = regInfo {inputs : []regMask {fp }, outputs : []regMask {fp }}
151
153
fp21 = regInfo {inputs : []regMask {fp , fp }, outputs : []regMask {fp }}
152
154
fp2flags = regInfo {inputs : []regMask {fp , fp }}
153
155
fpload = regInfo {inputs : []regMask {gpspsbg }, outputs : []regMask {fp }}
156
+ fp2load = regInfo {inputs : []regMask {gpspsbg , gpg }, outputs : []regMask {fp }}
154
157
fpstore = regInfo {inputs : []regMask {gpspsbg , fp }}
158
+ fpstore2 = regInfo {inputs : []regMask {gpspsbg , gpg , fp }}
155
159
fpgp = regInfo {inputs : []regMask {fp }, outputs : []regMask {gp }}
156
160
gpfp = regInfo {inputs : []regMask {gp }, outputs : []regMask {fp }}
157
161
readflags = regInfo {inputs : nil , outputs : []regMask {gp }}
@@ -248,18 +252,43 @@ func init() {
248
252
{name : "MOVFload" , argLength : 2 , reg : fpload , aux : "SymOff" , asm : "MOVF" , typ : "Float32" , faultOnNilArg0 : true , symEffect : "Read" }, // load from arg0 + auxInt + aux. arg1=mem.
249
253
{name : "MOVDload" , argLength : 2 , reg : fpload , aux : "SymOff" , asm : "MOVD" , typ : "Float64" , faultOnNilArg0 : true , symEffect : "Read" }, // load from arg0 + auxInt + aux. arg1=mem.
250
254
255
+ // register indexed load
256
+ {name : "MOVVloadidx" , argLength : 3 , reg : gp2load , asm : "MOVV" , typ : "UInt64" }, // load 64-bit dword from arg0 + arg1, arg2 = mem.
257
+ {name : "MOVWloadidx" , argLength : 3 , reg : gp2load , asm : "MOVW" , typ : "Int32" }, // load 32-bit word from arg0 + arg1, sign-extended to 64-bit, arg2=mem.
258
+ {name : "MOVWUloadidx" , argLength : 3 , reg : gp2load , asm : "MOVWU" , typ : "UInt32" }, // load 32-bit word from arg0 + arg1, zero-extended to 64-bit, arg2=mem.
259
+ {name : "MOVHloadidx" , argLength : 3 , reg : gp2load , asm : "MOVH" , typ : "Int16" }, // load 16-bit word from arg0 + arg1, sign-extended to 64-bit, arg2=mem.
260
+ {name : "MOVHUloadidx" , argLength : 3 , reg : gp2load , asm : "MOVHU" , typ : "UInt16" }, // load 16-bit word from arg0 + arg1, zero-extended to 64-bit, arg2=mem.
261
+ {name : "MOVBloadidx" , argLength : 3 , reg : gp2load , asm : "MOVB" , typ : "Int8" }, // load 8-bit word from arg0 + arg1, sign-extended to 64-bit, arg2=mem.
262
+ {name : "MOVBUloadidx" , argLength : 3 , reg : gp2load , asm : "MOVBU" , typ : "UInt8" }, // load 8-bit word from arg0 + arg1, zero-extended to 64-bit, arg2=mem.
263
+ {name : "MOVFloadidx" , argLength : 3 , reg : fp2load , asm : "MOVF" , typ : "Float32" }, // load 32-bit float from arg0 + arg1, arg2=mem.
264
+ {name : "MOVDloadidx" , argLength : 3 , reg : fp2load , asm : "MOVD" , typ : "Float64" }, // load 64-bit float from arg0 + arg1, arg2=mem.
265
+
251
266
{name : "MOVBstore" , argLength : 3 , reg : gpstore , aux : "SymOff" , asm : "MOVB" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 1 byte of arg1 to arg0 + auxInt + aux. arg2=mem.
252
267
{name : "MOVHstore" , argLength : 3 , reg : gpstore , aux : "SymOff" , asm : "MOVH" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 2 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
253
268
{name : "MOVWstore" , argLength : 3 , reg : gpstore , aux : "SymOff" , asm : "MOVW" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
254
269
{name : "MOVVstore" , argLength : 3 , reg : gpstore , aux : "SymOff" , asm : "MOVV" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 8 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
255
270
{name : "MOVFstore" , argLength : 3 , reg : fpstore , aux : "SymOff" , asm : "MOVF" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 4 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
256
271
{name : "MOVDstore" , argLength : 3 , reg : fpstore , aux : "SymOff" , asm : "MOVD" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 8 bytes of arg1 to arg0 + auxInt + aux. arg2=mem.
257
272
273
+ // register indexed store
274
+ {name : "MOVBstoreidx" , argLength : 4 , reg : gpstore2 , asm : "MOVB" , typ : "Mem" }, // store 1 byte of arg2 to arg0 + arg1, arg3 = mem.
275
+ {name : "MOVHstoreidx" , argLength : 4 , reg : gpstore2 , asm : "MOVH" , typ : "Mem" }, // store 2 bytes of arg2 to arg0 + arg1, arg3 = mem.
276
+ {name : "MOVWstoreidx" , argLength : 4 , reg : gpstore2 , asm : "MOVW" , typ : "Mem" }, // store 4 bytes of arg2 to arg0 + arg1, arg3 = mem.
277
+ {name : "MOVVstoreidx" , argLength : 4 , reg : gpstore2 , asm : "MOVV" , typ : "Mem" }, // store 8 bytes of arg2 to arg0 + arg1, arg3 = mem.
278
+ {name : "MOVFstoreidx" , argLength : 4 , reg : fpstore2 , asm : "MOVF" , typ : "Mem" }, // store 32-bit float of arg2 to arg0 + arg1, arg3=mem.
279
+ {name : "MOVDstoreidx" , argLength : 4 , reg : fpstore2 , asm : "MOVD" , typ : "Mem" }, // store 64-bit float of arg2 to arg0 + arg1, arg3=mem.
280
+
258
281
{name : "MOVBstorezero" , argLength : 2 , reg : gpstore0 , aux : "SymOff" , asm : "MOVB" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 1 byte of zero to arg0 + auxInt + aux. arg1=mem.
259
282
{name : "MOVHstorezero" , argLength : 2 , reg : gpstore0 , aux : "SymOff" , asm : "MOVH" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 2 bytes of zero to arg0 + auxInt + aux. arg1=mem.
260
283
{name : "MOVWstorezero" , argLength : 2 , reg : gpstore0 , aux : "SymOff" , asm : "MOVW" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 4 bytes of zero to arg0 + auxInt + aux. arg1=mem.
261
284
{name : "MOVVstorezero" , argLength : 2 , reg : gpstore0 , aux : "SymOff" , asm : "MOVV" , typ : "Mem" , faultOnNilArg0 : true , symEffect : "Write" }, // store 8 bytes of zero to arg0 + auxInt + aux. ar12=mem.
262
285
286
+ // register indexed store zero
287
+ {name : "MOVBstorezeroidx" , argLength : 3 , reg : gpstore , asm : "MOVB" , typ : "Mem" }, // store 1 byte of zero to arg0 + arg1, arg2 = mem.
288
+ {name : "MOVHstorezeroidx" , argLength : 3 , reg : gpstore , asm : "MOVH" , typ : "Mem" }, // store 2 bytes of zero to arg0 + arg1, arg2 = mem.
289
+ {name : "MOVWstorezeroidx" , argLength : 3 , reg : gpstore , asm : "MOVW" , typ : "Mem" }, // store 4 bytes of zero to arg0 + arg1, arg2 = mem.
290
+ {name : "MOVVstorezeroidx" , argLength : 3 , reg : gpstore , asm : "MOVV" , typ : "Mem" }, // store 8 bytes of zero to arg0 + arg1, arg2 = mem.
291
+
263
292
// moves (no conversion)
264
293
{name : "MOVWfpgp" , argLength : 1 , reg : fpgp , asm : "MOVW" }, // move float32 to int32 (no conversion).
265
294
{name : "MOVWgpfp" , argLength : 1 , reg : gpfp , asm : "MOVW" }, // move int32 to float32 (no conversion).
0 commit comments