| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ssacompile |
| |
| import ( |
| "cmd/compile/internal/ssa" |
| "cmd/compile/internal/ssa/ssaop" |
| ) |
| |
| // addressingModes combines address calculations into memory operations |
| // that can perform complicated addressing modes. |
| func addressingModes(f *ssa.Func) { |
| isInImmediateRange := ssa.Is32Bit |
| switch f.Config.Arch { |
| default: |
| // Most architectures can't do this. |
| return |
| case "amd64", "386": |
| case "s390x": |
| isInImmediateRange = ssa.Is20Bit |
| } |
| |
| var tmp []*ssa.Value |
| for _, b := range f.Blocks { |
| for _, v := range b.Values { |
| if !combineFirst[v.Op] { |
| continue |
| } |
| // All matched operations have the pointer in arg[0]. |
| // All results have the pointer in arg[0] and the index in arg[1]. |
| // *Except* for operations which update a register, |
| // which are marked with resultInArg0. Those have |
| // the pointer in arg[1], and the corresponding result op |
| // has the pointer in arg[1] and the index in arg[2]. |
| ptrIndex := 0 |
| if ssaop.OpcodeTable[v.Op].ResultInArg0 { |
| ptrIndex = 1 |
| } |
| p := v.Args[ptrIndex] |
| c, ok := combine[[2]ssaop.Op{v.Op, p.Op}] |
| if !ok { |
| continue |
| } |
| // See if we can combine the Aux/AuxInt values. |
| switch [2]ssaop.AuxType{ssaop.OpcodeTable[v.Op].AuxType, ssaop.OpcodeTable[p.Op].AuxType} { |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeInt32}: |
| // TODO: introduce auxSymOff32 |
| if !isInImmediateRange(v.AuxInt + p.AuxInt) { |
| continue |
| } |
| v.AuxInt += p.AuxInt |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeSymOff}: |
| if v.Aux != nil && p.Aux != nil { |
| continue |
| } |
| if !isInImmediateRange(v.AuxInt + p.AuxInt) { |
| continue |
| } |
| if p.Aux != nil { |
| v.Aux = p.Aux |
| } |
| v.AuxInt += p.AuxInt |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeInt32}: |
| vo := ssa.ValAndOff(v.AuxInt) |
| if !vo.CanAdd64(p.AuxInt) { |
| continue |
| } |
| v.AuxInt = int64(vo.AddOffset64(p.AuxInt)) |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeSymOff}: |
| vo := ssa.ValAndOff(v.AuxInt) |
| if v.Aux != nil && p.Aux != nil { |
| continue |
| } |
| if !vo.CanAdd64(p.AuxInt) { |
| continue |
| } |
| if p.Aux != nil { |
| v.Aux = p.Aux |
| } |
| v.AuxInt = int64(vo.AddOffset64(p.AuxInt)) |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeNone}: |
| // nothing to do |
| case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeNone}: |
| // nothing to do |
| default: |
| f.Fatalf("unknown aux combining for %s and %s\n", v.Op, p.Op) |
| } |
| // Combine the operations. |
| tmp = append(tmp[:0], v.Args[:ptrIndex]...) |
| tmp = append(tmp, p.Args...) |
| tmp = append(tmp, v.Args[ptrIndex+1:]...) |
| v.ResetArgs() |
| v.Op = c |
| v.AddArgs(tmp...) |
| if needSplit[c] { |
| // It turns out that some of the combined instructions have faster two-instruction equivalents, |
| // but not the two instructions that led to them being combined here. For example |
| // (CMPBconstload c (ADDQ x y)) -> (CMPBconstloadidx1 c x y) -> (CMPB c (MOVBloadidx1 x y)) |
| // The final pair of instructions turns out to be notably faster, at least in some benchmarks. |
| f.Config.SplitLoad(v) |
| } |
| } |
| } |
| } |
| |
| // combineFirst contains ops which appear in combine as the |
| // first part of the key. |
| var combineFirst = map[ssaop.Op]bool{} |
| |
| func init() { |
| for k := range combine { |
| combineFirst[k[0]] = true |
| } |
| } |
| |
| // needSplit contains instructions that should be postprocessed by splitLoad |
| // into a more-efficient two-instruction form. |
| var needSplit = map[ssaop.Op]bool{ |
| ssaop.OpAMD64CMPBloadidx1: true, |
| ssaop.OpAMD64CMPWloadidx1: true, |
| ssaop.OpAMD64CMPLloadidx1: true, |
| ssaop.OpAMD64CMPQloadidx1: true, |
| ssaop.OpAMD64CMPWloadidx2: true, |
| ssaop.OpAMD64CMPLloadidx4: true, |
| ssaop.OpAMD64CMPQloadidx8: true, |
| |
| ssaop.OpAMD64CMPBconstloadidx1: true, |
| ssaop.OpAMD64CMPWconstloadidx1: true, |
| ssaop.OpAMD64CMPLconstloadidx1: true, |
| ssaop.OpAMD64CMPQconstloadidx1: true, |
| ssaop.OpAMD64CMPWconstloadidx2: true, |
| ssaop.OpAMD64CMPLconstloadidx4: true, |
| ssaop.OpAMD64CMPQconstloadidx8: true, |
| } |
| |
| // For each entry k, v in this map, if we have a value x with: |
| // |
| // x.Op == k[0] |
| // x.Args[0].Op == k[1] |
| // |
| // then we can set x.Op to v and set x.Args like this: |
| // |
| // x.Args[0].Args + x.Args[1:] |
| // |
| // Additionally, the Aux/AuxInt from x.Args[0] is merged into x. |
| var combine = map[[2]ssaop.Op]ssaop.Op{ |
| // amd64 |
| [2]ssaop.Op{ssaop.OpAMD64MOVBload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVWloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSDloadidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVWstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVLstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVQstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSSstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSDstoreidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVWstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVLstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVQstoreconstidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVWloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVWloadidx2, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVSSloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSDloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVSDloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVWstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVWstoreidx2, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVLstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVLstoreidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVLstoreidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVQstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVQstoreidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSSstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVSSstoreidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSDstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVSDstoreidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVWstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVWstoreconstidx2, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVLstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVLstoreconstidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVQstoreconstidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVQstoreconstidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64SETEQstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETEQstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETNEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETNEstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETLstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETLstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETLEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETLEstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETGstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETGstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETGEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETGEstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETBstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETBstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETBEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETBEstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETAstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETAstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SETAEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETAEstoreidx1, |
| |
| // These instructions are re-split differently for performance, see needSplit above. |
| // TODO if 386 versions are created, also update needSplit and _gen/386splitload.rules |
| [2]ssaop.Op{ssaop.OpAMD64CMPBload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPBloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPWloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPQloadidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64CMPBload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPBloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPWloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64CMPWloadidx2, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64CMPLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64CMPQloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64CMPBconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPBconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPWconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPLconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPQconstloadidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64CMPBconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPBconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPWconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64CMPWconstloadidx2, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPLconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64CMPLconstloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPQconstloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64CMPQconstloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQloadidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ORLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQmodifyidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBLmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBLmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBQmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ORLmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORLmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORQmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQmodifyidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ORBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORBconstmodifyidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ORLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORLconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ORQconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQconstmodifyidx8, |
| [2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64ADDWconstmodifyidx2, |
| [2]ssaop.Op{ssaop.OpAMD64ADDBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64ANDWconstmodifyidx2, |
| [2]ssaop.Op{ssaop.OpAMD64ANDBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64ORWconstmodifyidx2, |
| [2]ssaop.Op{ssaop.OpAMD64ORBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ORBconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORWconstmodifyidx1, |
| [2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64XORWconstmodifyidx2, |
| [2]ssaop.Op{ssaop.OpAMD64XORBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORBconstmodifyidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64ADDSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDSSloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64ADDSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDSDloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64ADDSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDSDloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SUBSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBSSloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SUBSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBSDloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SUBSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBSDloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MULSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MULSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MULSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MULSSloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MULSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MULSDloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MULSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MULSDloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64DIVSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64DIVSSloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64DIVSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64DIVSSloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64DIVSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64DIVSDloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64DIVSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64DIVSDloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SARXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SARXQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHLXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHLXQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHRXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHRXQloadidx1, |
| |
| [2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SARXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SARXLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SARXLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SARXQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SARXQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHLXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SHLXLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHLXLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHLXQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHLXQloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHRXLloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SHRXLloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHRXLloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHRXQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHRXQloadidx8, |
| |
| // amd64/v3 |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBELloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBEQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBELloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVBELloadidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBELloadidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEQloadidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBEQloadidx8, |
| |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBEWstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBELstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBEQstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEWstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVBEWstoreidx2, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBELstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVBELstoreidx4, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBELstoreidx8, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEQstoreidx1, |
| [2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBEQstoreidx8, |
| |
| // 386 |
| [2]ssaop.Op{ssaop.Op386MOVBload, ssaop.Op386ADDL}: ssaop.Op386MOVBloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386ADDL}: ssaop.Op386MOVWloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386ADDL}: ssaop.Op386MOVLloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386ADDL}: ssaop.Op386MOVSSloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386ADDL}: ssaop.Op386MOVSDloadidx1, |
| |
| [2]ssaop.Op{ssaop.Op386MOVBstore, ssaop.Op386ADDL}: ssaop.Op386MOVBstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386ADDL}: ssaop.Op386MOVWstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386ADDL}: ssaop.Op386MOVLstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386ADDL}: ssaop.Op386MOVSSstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386ADDL}: ssaop.Op386MOVSDstoreidx1, |
| |
| [2]ssaop.Op{ssaop.Op386MOVBstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVBstoreconstidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVWstoreconstidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVLstoreconstidx1, |
| |
| [2]ssaop.Op{ssaop.Op386MOVBload, ssaop.Op386LEAL1}: ssaop.Op386MOVBloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386LEAL1}: ssaop.Op386MOVWloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386LEAL2}: ssaop.Op386MOVWloadidx2, |
| [2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386LEAL1}: ssaop.Op386MOVLloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386LEAL4}: ssaop.Op386MOVLloadidx4, |
| [2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386LEAL1}: ssaop.Op386MOVSSloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386LEAL4}: ssaop.Op386MOVSSloadidx4, |
| [2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386LEAL1}: ssaop.Op386MOVSDloadidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386LEAL8}: ssaop.Op386MOVSDloadidx8, |
| |
| [2]ssaop.Op{ssaop.Op386MOVBstore, ssaop.Op386LEAL1}: ssaop.Op386MOVBstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386LEAL1}: ssaop.Op386MOVWstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386LEAL2}: ssaop.Op386MOVWstoreidx2, |
| [2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386LEAL1}: ssaop.Op386MOVLstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386LEAL4}: ssaop.Op386MOVLstoreidx4, |
| [2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386LEAL1}: ssaop.Op386MOVSSstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386LEAL4}: ssaop.Op386MOVSSstoreidx4, |
| [2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386LEAL1}: ssaop.Op386MOVSDstoreidx1, |
| [2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386LEAL8}: ssaop.Op386MOVSDstoreidx8, |
| |
| [2]ssaop.Op{ssaop.Op386MOVBstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVBstoreconstidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVWstoreconstidx1, |
| [2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386LEAL2}: ssaop.Op386MOVWstoreconstidx2, |
| [2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVLstoreconstidx1, |
| [2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386LEAL4}: ssaop.Op386MOVLstoreconstidx4, |
| |
| [2]ssaop.Op{ssaop.Op386ADDLload, ssaop.Op386LEAL4}: ssaop.Op386ADDLloadidx4, |
| [2]ssaop.Op{ssaop.Op386SUBLload, ssaop.Op386LEAL4}: ssaop.Op386SUBLloadidx4, |
| [2]ssaop.Op{ssaop.Op386MULLload, ssaop.Op386LEAL4}: ssaop.Op386MULLloadidx4, |
| [2]ssaop.Op{ssaop.Op386ANDLload, ssaop.Op386LEAL4}: ssaop.Op386ANDLloadidx4, |
| [2]ssaop.Op{ssaop.Op386ORLload, ssaop.Op386LEAL4}: ssaop.Op386ORLloadidx4, |
| [2]ssaop.Op{ssaop.Op386XORLload, ssaop.Op386LEAL4}: ssaop.Op386XORLloadidx4, |
| |
| [2]ssaop.Op{ssaop.Op386ADDLmodify, ssaop.Op386LEAL4}: ssaop.Op386ADDLmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386SUBLmodify, ssaop.Op386LEAL4}: ssaop.Op386SUBLmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386ANDLmodify, ssaop.Op386LEAL4}: ssaop.Op386ANDLmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386ORLmodify, ssaop.Op386LEAL4}: ssaop.Op386ORLmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386XORLmodify, ssaop.Op386LEAL4}: ssaop.Op386XORLmodifyidx4, |
| |
| [2]ssaop.Op{ssaop.Op386ADDLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386ADDLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386ANDLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386ANDLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386ORLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386ORLconstmodifyidx4, |
| [2]ssaop.Op{ssaop.Op386XORLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386XORLconstmodifyidx4, |
| |
| // s390x |
| [2]ssaop.Op{ssaop.OpS390XMOVDload, ssaop.OpS390XADD}: ssaop.OpS390XMOVDloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBload, ssaop.OpS390XADD}: ssaop.OpS390XMOVBloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVWZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWZloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHZloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVBZloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVDBRloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWBRloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHBRloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XFMOVDload, ssaop.OpS390XADD}: ssaop.OpS390XFMOVDloadidx, |
| [2]ssaop.Op{ssaop.OpS390XFMOVSload, ssaop.OpS390XADD}: ssaop.OpS390XFMOVSloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVDstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVWstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVHstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVBstoreidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVDBRstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVWBRstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVHBRstoreidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XFMOVDstore, ssaop.OpS390XADD}: ssaop.OpS390XFMOVDstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XFMOVSstore, ssaop.OpS390XADD}: ssaop.OpS390XFMOVSstoreidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVWZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWZloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHZloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBZloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDBRloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWBRloadidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHBRloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XFMOVDload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVDloadidx, |
| [2]ssaop.Op{ssaop.OpS390XFMOVSload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVSloadidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVBstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBstoreidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XMOVDBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDBRstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVWBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWBRstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XMOVHBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHBRstoreidx, |
| |
| [2]ssaop.Op{ssaop.OpS390XFMOVDstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVDstoreidx, |
| [2]ssaop.Op{ssaop.OpS390XFMOVSstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVSstoreidx, |
| } |