Source file src/cmd/compile/internal/ssacompile/addressingmodes.go

     1  // Copyright 2020 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package ssacompile
     6  
     7  import (
     8  	"cmd/compile/internal/ssa"
     9  	"cmd/compile/internal/ssa/ssaop"
    10  )
    11  
    12  // addressingModes combines address calculations into memory operations
    13  // that can perform complicated addressing modes.
    14  func addressingModes(f *ssa.Func) {
    15  	isInImmediateRange := ssa.Is32Bit
    16  	switch f.Config.Arch {
    17  	default:
    18  		// Most architectures can't do this.
    19  		return
    20  	case "amd64", "386":
    21  	case "s390x":
    22  		isInImmediateRange = ssa.Is20Bit
    23  	}
    24  
    25  	var tmp []*ssa.Value
    26  	for _, b := range f.Blocks {
    27  		for _, v := range b.Values {
    28  			if !combineFirst[v.Op] {
    29  				continue
    30  			}
    31  			// All matched operations have the pointer in arg[0].
    32  			// All results have the pointer in arg[0] and the index in arg[1].
    33  			// *Except* for operations which update a register,
    34  			// which are marked with resultInArg0. Those have
    35  			// the pointer in arg[1], and the corresponding result op
    36  			// has the pointer in arg[1] and the index in arg[2].
    37  			ptrIndex := 0
    38  			if ssaop.OpcodeTable[v.Op].ResultInArg0 {
    39  				ptrIndex = 1
    40  			}
    41  			p := v.Args[ptrIndex]
    42  			c, ok := combine[[2]ssaop.Op{v.Op, p.Op}]
    43  			if !ok {
    44  				continue
    45  			}
    46  			// See if we can combine the Aux/AuxInt values.
    47  			switch [2]ssaop.AuxType{ssaop.OpcodeTable[v.Op].AuxType, ssaop.OpcodeTable[p.Op].AuxType} {
    48  			case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeInt32}:
    49  				// TODO: introduce auxSymOff32
    50  				if !isInImmediateRange(v.AuxInt + p.AuxInt) {
    51  					continue
    52  				}
    53  				v.AuxInt += p.AuxInt
    54  			case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeSymOff}:
    55  				if v.Aux != nil && p.Aux != nil {
    56  					continue
    57  				}
    58  				if !isInImmediateRange(v.AuxInt + p.AuxInt) {
    59  					continue
    60  				}
    61  				if p.Aux != nil {
    62  					v.Aux = p.Aux
    63  				}
    64  				v.AuxInt += p.AuxInt
    65  			case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeInt32}:
    66  				vo := ssa.ValAndOff(v.AuxInt)
    67  				if !vo.CanAdd64(p.AuxInt) {
    68  					continue
    69  				}
    70  				v.AuxInt = int64(vo.AddOffset64(p.AuxInt))
    71  			case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeSymOff}:
    72  				vo := ssa.ValAndOff(v.AuxInt)
    73  				if v.Aux != nil && p.Aux != nil {
    74  					continue
    75  				}
    76  				if !vo.CanAdd64(p.AuxInt) {
    77  					continue
    78  				}
    79  				if p.Aux != nil {
    80  					v.Aux = p.Aux
    81  				}
    82  				v.AuxInt = int64(vo.AddOffset64(p.AuxInt))
    83  			case [2]ssaop.AuxType{ssaop.AuxTypeSymOff, ssaop.AuxTypeNone}:
    84  				// nothing to do
    85  			case [2]ssaop.AuxType{ssaop.AuxTypeSymValAndOff, ssaop.AuxTypeNone}:
    86  				// nothing to do
    87  			default:
    88  				f.Fatalf("unknown aux combining for %s and %s\n", v.Op, p.Op)
    89  			}
    90  			// Combine the operations.
    91  			tmp = append(tmp[:0], v.Args[:ptrIndex]...)
    92  			tmp = append(tmp, p.Args...)
    93  			tmp = append(tmp, v.Args[ptrIndex+1:]...)
    94  			v.ResetArgs()
    95  			v.Op = c
    96  			v.AddArgs(tmp...)
    97  			if needSplit[c] {
    98  				// It turns out that some of the combined instructions have faster two-instruction equivalents,
    99  				// but not the two instructions that led to them being combined here.  For example
   100  				// (CMPBconstload c (ADDQ x y)) -> (CMPBconstloadidx1 c x y) -> (CMPB c (MOVBloadidx1 x y))
   101  				// The final pair of instructions turns out to be notably faster, at least in some benchmarks.
   102  				f.Config.SplitLoad(v)
   103  			}
   104  		}
   105  	}
   106  }
   107  
   108  // combineFirst contains ops which appear in combine as the
   109  // first part of the key.
   110  var combineFirst = map[ssaop.Op]bool{}
   111  
   112  func init() {
   113  	for k := range combine {
   114  		combineFirst[k[0]] = true
   115  	}
   116  }
   117  
   118  // needSplit contains instructions that should be postprocessed by splitLoad
   119  // into a more-efficient two-instruction form.
   120  var needSplit = map[ssaop.Op]bool{
   121  	ssaop.OpAMD64CMPBloadidx1: true,
   122  	ssaop.OpAMD64CMPWloadidx1: true,
   123  	ssaop.OpAMD64CMPLloadidx1: true,
   124  	ssaop.OpAMD64CMPQloadidx1: true,
   125  	ssaop.OpAMD64CMPWloadidx2: true,
   126  	ssaop.OpAMD64CMPLloadidx4: true,
   127  	ssaop.OpAMD64CMPQloadidx8: true,
   128  
   129  	ssaop.OpAMD64CMPBconstloadidx1: true,
   130  	ssaop.OpAMD64CMPWconstloadidx1: true,
   131  	ssaop.OpAMD64CMPLconstloadidx1: true,
   132  	ssaop.OpAMD64CMPQconstloadidx1: true,
   133  	ssaop.OpAMD64CMPWconstloadidx2: true,
   134  	ssaop.OpAMD64CMPLconstloadidx4: true,
   135  	ssaop.OpAMD64CMPQconstloadidx8: true,
   136  }
   137  
   138  // For each entry k, v in this map, if we have a value x with:
   139  //
   140  //	x.Op == k[0]
   141  //	x.Args[0].Op == k[1]
   142  //
   143  // then we can set x.Op to v and set x.Args like this:
   144  //
   145  //	x.Args[0].Args + x.Args[1:]
   146  //
   147  // Additionally, the Aux/AuxInt from x.Args[0] is merged into x.
   148  var combine = map[[2]ssaop.Op]ssaop.Op{
   149  	// amd64
   150  	[2]ssaop.Op{ssaop.OpAMD64MOVBload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBloadidx1,
   151  	[2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVWloadidx1,
   152  	[2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVLloadidx1,
   153  	[2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVQloadidx1,
   154  	[2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSSloadidx1,
   155  	[2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSDloadidx1,
   156  
   157  	[2]ssaop.Op{ssaop.OpAMD64MOVBstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBstoreidx1,
   158  	[2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVWstoreidx1,
   159  	[2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVLstoreidx1,
   160  	[2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVQstoreidx1,
   161  	[2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSSstoreidx1,
   162  	[2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVSDstoreidx1,
   163  
   164  	[2]ssaop.Op{ssaop.OpAMD64MOVBstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVBstoreconstidx1,
   165  	[2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVWstoreconstidx1,
   166  	[2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVLstoreconstidx1,
   167  	[2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64MOVQstoreconstidx1,
   168  
   169  	[2]ssaop.Op{ssaop.OpAMD64MOVBload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVBloadidx1,
   170  	[2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVWloadidx1,
   171  	[2]ssaop.Op{ssaop.OpAMD64MOVWload, ssaop.OpAMD64LEAQ2}:  ssaop.OpAMD64MOVWloadidx2,
   172  	[2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVLloadidx1,
   173  	[2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ4}:  ssaop.OpAMD64MOVLloadidx4,
   174  	[2]ssaop.Op{ssaop.OpAMD64MOVLload, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64MOVLloadidx8,
   175  	[2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVQloadidx1,
   176  	[2]ssaop.Op{ssaop.OpAMD64MOVQload, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64MOVQloadidx8,
   177  	[2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSSloadidx1,
   178  	[2]ssaop.Op{ssaop.OpAMD64MOVSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVSSloadidx4,
   179  	[2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSDloadidx1,
   180  	[2]ssaop.Op{ssaop.OpAMD64MOVSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVSDloadidx8,
   181  
   182  	[2]ssaop.Op{ssaop.OpAMD64MOVBstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVBstoreidx1,
   183  	[2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVWstoreidx1,
   184  	[2]ssaop.Op{ssaop.OpAMD64MOVWstore, ssaop.OpAMD64LEAQ2}:  ssaop.OpAMD64MOVWstoreidx2,
   185  	[2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVLstoreidx1,
   186  	[2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ4}:  ssaop.OpAMD64MOVLstoreidx4,
   187  	[2]ssaop.Op{ssaop.OpAMD64MOVLstore, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64MOVLstoreidx8,
   188  	[2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64MOVQstoreidx1,
   189  	[2]ssaop.Op{ssaop.OpAMD64MOVQstore, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64MOVQstoreidx8,
   190  	[2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSSstoreidx1,
   191  	[2]ssaop.Op{ssaop.OpAMD64MOVSSstore, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVSSstoreidx4,
   192  	[2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVSDstoreidx1,
   193  	[2]ssaop.Op{ssaop.OpAMD64MOVSDstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVSDstoreidx8,
   194  
   195  	[2]ssaop.Op{ssaop.OpAMD64MOVBstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBstoreconstidx1,
   196  	[2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVWstoreconstidx1,
   197  	[2]ssaop.Op{ssaop.OpAMD64MOVWstoreconst, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVWstoreconstidx2,
   198  	[2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVLstoreconstidx1,
   199  	[2]ssaop.Op{ssaop.OpAMD64MOVLstoreconst, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVLstoreconstidx4,
   200  	[2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVQstoreconstidx1,
   201  	[2]ssaop.Op{ssaop.OpAMD64MOVQstoreconst, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVQstoreconstidx8,
   202  
   203  	[2]ssaop.Op{ssaop.OpAMD64SETEQstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETEQstoreidx1,
   204  	[2]ssaop.Op{ssaop.OpAMD64SETNEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETNEstoreidx1,
   205  	[2]ssaop.Op{ssaop.OpAMD64SETLstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64SETLstoreidx1,
   206  	[2]ssaop.Op{ssaop.OpAMD64SETLEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETLEstoreidx1,
   207  	[2]ssaop.Op{ssaop.OpAMD64SETGstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64SETGstoreidx1,
   208  	[2]ssaop.Op{ssaop.OpAMD64SETGEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETGEstoreidx1,
   209  	[2]ssaop.Op{ssaop.OpAMD64SETBstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64SETBstoreidx1,
   210  	[2]ssaop.Op{ssaop.OpAMD64SETBEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETBEstoreidx1,
   211  	[2]ssaop.Op{ssaop.OpAMD64SETAstore, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64SETAstoreidx1,
   212  	[2]ssaop.Op{ssaop.OpAMD64SETAEstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SETAEstoreidx1,
   213  
   214  	// These instructions are re-split differently for performance, see needSplit above.
   215  	// TODO if 386 versions are created, also update needSplit and _gen/386splitload.rules
   216  	[2]ssaop.Op{ssaop.OpAMD64CMPBload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPBloadidx1,
   217  	[2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPWloadidx1,
   218  	[2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPLloadidx1,
   219  	[2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPQloadidx1,
   220  
   221  	[2]ssaop.Op{ssaop.OpAMD64CMPBload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPBloadidx1,
   222  	[2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPWloadidx1,
   223  	[2]ssaop.Op{ssaop.OpAMD64CMPWload, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64CMPWloadidx2,
   224  	[2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPLloadidx1,
   225  	[2]ssaop.Op{ssaop.OpAMD64CMPLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64CMPLloadidx4,
   226  	[2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPQloadidx1,
   227  	[2]ssaop.Op{ssaop.OpAMD64CMPQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64CMPQloadidx8,
   228  
   229  	[2]ssaop.Op{ssaop.OpAMD64CMPBconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPBconstloadidx1,
   230  	[2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPWconstloadidx1,
   231  	[2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPLconstloadidx1,
   232  	[2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64CMPQconstloadidx1,
   233  
   234  	[2]ssaop.Op{ssaop.OpAMD64CMPBconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPBconstloadidx1,
   235  	[2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPWconstloadidx1,
   236  	[2]ssaop.Op{ssaop.OpAMD64CMPWconstload, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64CMPWconstloadidx2,
   237  	[2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPLconstloadidx1,
   238  	[2]ssaop.Op{ssaop.OpAMD64CMPLconstload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64CMPLconstloadidx4,
   239  	[2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64CMPQconstloadidx1,
   240  	[2]ssaop.Op{ssaop.OpAMD64CMPQconstload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64CMPQconstloadidx8,
   241  
   242  	[2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLloadidx1,
   243  	[2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQloadidx1,
   244  	[2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBLloadidx1,
   245  	[2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBQloadidx1,
   246  	[2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLloadidx1,
   247  	[2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQloadidx1,
   248  	[2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORLloadidx1,
   249  	[2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORQloadidx1,
   250  	[2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLloadidx1,
   251  	[2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQloadidx1,
   252  
   253  	[2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLloadidx1,
   254  	[2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLloadidx4,
   255  	[2]ssaop.Op{ssaop.OpAMD64ADDLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLloadidx8,
   256  	[2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQloadidx1,
   257  	[2]ssaop.Op{ssaop.OpAMD64ADDQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQloadidx8,
   258  	[2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBLloadidx1,
   259  	[2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBLloadidx4,
   260  	[2]ssaop.Op{ssaop.OpAMD64SUBLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBLloadidx8,
   261  	[2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBQloadidx1,
   262  	[2]ssaop.Op{ssaop.OpAMD64SUBQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBQloadidx8,
   263  	[2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLloadidx1,
   264  	[2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLloadidx4,
   265  	[2]ssaop.Op{ssaop.OpAMD64ANDLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLloadidx8,
   266  	[2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQloadidx1,
   267  	[2]ssaop.Op{ssaop.OpAMD64ANDQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQloadidx8,
   268  	[2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORLloadidx1,
   269  	[2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ4}:  ssaop.OpAMD64ORLloadidx4,
   270  	[2]ssaop.Op{ssaop.OpAMD64ORLload, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORLloadidx8,
   271  	[2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORQloadidx1,
   272  	[2]ssaop.Op{ssaop.OpAMD64ORQload, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORQloadidx8,
   273  	[2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLloadidx1,
   274  	[2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLloadidx4,
   275  	[2]ssaop.Op{ssaop.OpAMD64XORLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLloadidx8,
   276  	[2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQloadidx1,
   277  	[2]ssaop.Op{ssaop.OpAMD64XORQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQloadidx8,
   278  
   279  	[2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLmodifyidx1,
   280  	[2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQmodifyidx1,
   281  	[2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBLmodifyidx1,
   282  	[2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SUBQmodifyidx1,
   283  	[2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLmodifyidx1,
   284  	[2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQmodifyidx1,
   285  	[2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORLmodifyidx1,
   286  	[2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORQmodifyidx1,
   287  	[2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLmodifyidx1,
   288  	[2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQmodifyidx1,
   289  
   290  	[2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLmodifyidx1,
   291  	[2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLmodifyidx4,
   292  	[2]ssaop.Op{ssaop.OpAMD64ADDLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLmodifyidx8,
   293  	[2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQmodifyidx1,
   294  	[2]ssaop.Op{ssaop.OpAMD64ADDQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQmodifyidx8,
   295  	[2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBLmodifyidx1,
   296  	[2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBLmodifyidx4,
   297  	[2]ssaop.Op{ssaop.OpAMD64SUBLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBLmodifyidx8,
   298  	[2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBQmodifyidx1,
   299  	[2]ssaop.Op{ssaop.OpAMD64SUBQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBQmodifyidx8,
   300  	[2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLmodifyidx1,
   301  	[2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLmodifyidx4,
   302  	[2]ssaop.Op{ssaop.OpAMD64ANDLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLmodifyidx8,
   303  	[2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQmodifyidx1,
   304  	[2]ssaop.Op{ssaop.OpAMD64ANDQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQmodifyidx8,
   305  	[2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORLmodifyidx1,
   306  	[2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ4}:  ssaop.OpAMD64ORLmodifyidx4,
   307  	[2]ssaop.Op{ssaop.OpAMD64ORLmodify, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORLmodifyidx8,
   308  	[2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORQmodifyidx1,
   309  	[2]ssaop.Op{ssaop.OpAMD64ORQmodify, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORQmodifyidx8,
   310  	[2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLmodifyidx1,
   311  	[2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLmodifyidx4,
   312  	[2]ssaop.Op{ssaop.OpAMD64XORLmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLmodifyidx8,
   313  	[2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQmodifyidx1,
   314  	[2]ssaop.Op{ssaop.OpAMD64XORQmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQmodifyidx8,
   315  
   316  	[2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDLconstmodifyidx1,
   317  	[2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDQconstmodifyidx1,
   318  	[2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDLconstmodifyidx1,
   319  	[2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDQconstmodifyidx1,
   320  	[2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORLconstmodifyidx1,
   321  	[2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORQconstmodifyidx1,
   322  	[2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORLconstmodifyidx1,
   323  	[2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORQconstmodifyidx1,
   324  	[2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDWconstmodifyidx1,
   325  	[2]ssaop.Op{ssaop.OpAMD64ADDBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ADDBconstmodifyidx1,
   326  	[2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDWconstmodifyidx1,
   327  	[2]ssaop.Op{ssaop.OpAMD64ANDBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64ANDBconstmodifyidx1,
   328  	[2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORWconstmodifyidx1,
   329  	[2]ssaop.Op{ssaop.OpAMD64ORBconstmodify, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64ORBconstmodifyidx1,
   330  	[2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORWconstmodifyidx1,
   331  	[2]ssaop.Op{ssaop.OpAMD64XORBconstmodify, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64XORBconstmodifyidx1,
   332  
   333  	[2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDLconstmodifyidx1,
   334  	[2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDLconstmodifyidx4,
   335  	[2]ssaop.Op{ssaop.OpAMD64ADDLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDLconstmodifyidx8,
   336  	[2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDQconstmodifyidx1,
   337  	[2]ssaop.Op{ssaop.OpAMD64ADDQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDQconstmodifyidx8,
   338  	[2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDLconstmodifyidx1,
   339  	[2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ANDLconstmodifyidx4,
   340  	[2]ssaop.Op{ssaop.OpAMD64ANDLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDLconstmodifyidx8,
   341  	[2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDQconstmodifyidx1,
   342  	[2]ssaop.Op{ssaop.OpAMD64ANDQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ANDQconstmodifyidx8,
   343  	[2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORLconstmodifyidx1,
   344  	[2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ4}:  ssaop.OpAMD64ORLconstmodifyidx4,
   345  	[2]ssaop.Op{ssaop.OpAMD64ORLconstmodify, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORLconstmodifyidx8,
   346  	[2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORQconstmodifyidx1,
   347  	[2]ssaop.Op{ssaop.OpAMD64ORQconstmodify, ssaop.OpAMD64LEAQ8}:  ssaop.OpAMD64ORQconstmodifyidx8,
   348  	[2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORLconstmodifyidx1,
   349  	[2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64XORLconstmodifyidx4,
   350  	[2]ssaop.Op{ssaop.OpAMD64XORLconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORLconstmodifyidx8,
   351  	[2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORQconstmodifyidx1,
   352  	[2]ssaop.Op{ssaop.OpAMD64XORQconstmodify, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64XORQconstmodifyidx8,
   353  	[2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDWconstmodifyidx1,
   354  	[2]ssaop.Op{ssaop.OpAMD64ADDWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64ADDWconstmodifyidx2,
   355  	[2]ssaop.Op{ssaop.OpAMD64ADDBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDBconstmodifyidx1,
   356  	[2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDWconstmodifyidx1,
   357  	[2]ssaop.Op{ssaop.OpAMD64ANDWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64ANDWconstmodifyidx2,
   358  	[2]ssaop.Op{ssaop.OpAMD64ANDBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ANDBconstmodifyidx1,
   359  	[2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORWconstmodifyidx1,
   360  	[2]ssaop.Op{ssaop.OpAMD64ORWconstmodify, ssaop.OpAMD64LEAQ2}:  ssaop.OpAMD64ORWconstmodifyidx2,
   361  	[2]ssaop.Op{ssaop.OpAMD64ORBconstmodify, ssaop.OpAMD64LEAQ1}:  ssaop.OpAMD64ORBconstmodifyidx1,
   362  	[2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORWconstmodifyidx1,
   363  	[2]ssaop.Op{ssaop.OpAMD64XORWconstmodify, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64XORWconstmodifyidx2,
   364  	[2]ssaop.Op{ssaop.OpAMD64XORBconstmodify, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64XORBconstmodifyidx1,
   365  
   366  	[2]ssaop.Op{ssaop.OpAMD64ADDSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDSSloadidx1,
   367  	[2]ssaop.Op{ssaop.OpAMD64ADDSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64ADDSSloadidx4,
   368  	[2]ssaop.Op{ssaop.OpAMD64ADDSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64ADDSDloadidx1,
   369  	[2]ssaop.Op{ssaop.OpAMD64ADDSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64ADDSDloadidx8,
   370  	[2]ssaop.Op{ssaop.OpAMD64SUBSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBSSloadidx1,
   371  	[2]ssaop.Op{ssaop.OpAMD64SUBSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SUBSSloadidx4,
   372  	[2]ssaop.Op{ssaop.OpAMD64SUBSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SUBSDloadidx1,
   373  	[2]ssaop.Op{ssaop.OpAMD64SUBSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SUBSDloadidx8,
   374  	[2]ssaop.Op{ssaop.OpAMD64MULSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MULSSloadidx1,
   375  	[2]ssaop.Op{ssaop.OpAMD64MULSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MULSSloadidx4,
   376  	[2]ssaop.Op{ssaop.OpAMD64MULSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MULSDloadidx1,
   377  	[2]ssaop.Op{ssaop.OpAMD64MULSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MULSDloadidx8,
   378  	[2]ssaop.Op{ssaop.OpAMD64DIVSSload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64DIVSSloadidx1,
   379  	[2]ssaop.Op{ssaop.OpAMD64DIVSSload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64DIVSSloadidx4,
   380  	[2]ssaop.Op{ssaop.OpAMD64DIVSDload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64DIVSDloadidx1,
   381  	[2]ssaop.Op{ssaop.OpAMD64DIVSDload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64DIVSDloadidx8,
   382  
   383  	[2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SARXLloadidx1,
   384  	[2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SARXQloadidx1,
   385  	[2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHLXLloadidx1,
   386  	[2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHLXQloadidx1,
   387  	[2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHRXLloadidx1,
   388  	[2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64ADDQ}: ssaop.OpAMD64SHRXQloadidx1,
   389  
   390  	[2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SARXLloadidx1,
   391  	[2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SARXLloadidx4,
   392  	[2]ssaop.Op{ssaop.OpAMD64SARXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SARXLloadidx8,
   393  	[2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SARXQloadidx1,
   394  	[2]ssaop.Op{ssaop.OpAMD64SARXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SARXQloadidx8,
   395  	[2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHLXLloadidx1,
   396  	[2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SHLXLloadidx4,
   397  	[2]ssaop.Op{ssaop.OpAMD64SHLXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHLXLloadidx8,
   398  	[2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHLXQloadidx1,
   399  	[2]ssaop.Op{ssaop.OpAMD64SHLXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHLXQloadidx8,
   400  	[2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHRXLloadidx1,
   401  	[2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64SHRXLloadidx4,
   402  	[2]ssaop.Op{ssaop.OpAMD64SHRXLload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHRXLloadidx8,
   403  	[2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64SHRXQloadidx1,
   404  	[2]ssaop.Op{ssaop.OpAMD64SHRXQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64SHRXQloadidx8,
   405  
   406  	// amd64/v3
   407  	[2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBELloadidx1,
   408  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBEQloadidx1,
   409  	[2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBELloadidx1,
   410  	[2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVBELloadidx4,
   411  	[2]ssaop.Op{ssaop.OpAMD64MOVBELload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBELloadidx8,
   412  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEQloadidx1,
   413  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQload, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBEQloadidx8,
   414  
   415  	[2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBEWstoreidx1,
   416  	[2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBELstoreidx1,
   417  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64ADDQ}:  ssaop.OpAMD64MOVBEQstoreidx1,
   418  	[2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEWstoreidx1,
   419  	[2]ssaop.Op{ssaop.OpAMD64MOVBEWstore, ssaop.OpAMD64LEAQ2}: ssaop.OpAMD64MOVBEWstoreidx2,
   420  	[2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBELstoreidx1,
   421  	[2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ4}: ssaop.OpAMD64MOVBELstoreidx4,
   422  	[2]ssaop.Op{ssaop.OpAMD64MOVBELstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBELstoreidx8,
   423  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64LEAQ1}: ssaop.OpAMD64MOVBEQstoreidx1,
   424  	[2]ssaop.Op{ssaop.OpAMD64MOVBEQstore, ssaop.OpAMD64LEAQ8}: ssaop.OpAMD64MOVBEQstoreidx8,
   425  
   426  	// 386
   427  	[2]ssaop.Op{ssaop.Op386MOVBload, ssaop.Op386ADDL}:  ssaop.Op386MOVBloadidx1,
   428  	[2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386ADDL}:  ssaop.Op386MOVWloadidx1,
   429  	[2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386ADDL}:  ssaop.Op386MOVLloadidx1,
   430  	[2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386ADDL}: ssaop.Op386MOVSSloadidx1,
   431  	[2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386ADDL}: ssaop.Op386MOVSDloadidx1,
   432  
   433  	[2]ssaop.Op{ssaop.Op386MOVBstore, ssaop.Op386ADDL}:  ssaop.Op386MOVBstoreidx1,
   434  	[2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386ADDL}:  ssaop.Op386MOVWstoreidx1,
   435  	[2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386ADDL}:  ssaop.Op386MOVLstoreidx1,
   436  	[2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386ADDL}: ssaop.Op386MOVSSstoreidx1,
   437  	[2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386ADDL}: ssaop.Op386MOVSDstoreidx1,
   438  
   439  	[2]ssaop.Op{ssaop.Op386MOVBstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVBstoreconstidx1,
   440  	[2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVWstoreconstidx1,
   441  	[2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386ADDL}: ssaop.Op386MOVLstoreconstidx1,
   442  
   443  	[2]ssaop.Op{ssaop.Op386MOVBload, ssaop.Op386LEAL1}:  ssaop.Op386MOVBloadidx1,
   444  	[2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386LEAL1}:  ssaop.Op386MOVWloadidx1,
   445  	[2]ssaop.Op{ssaop.Op386MOVWload, ssaop.Op386LEAL2}:  ssaop.Op386MOVWloadidx2,
   446  	[2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386LEAL1}:  ssaop.Op386MOVLloadidx1,
   447  	[2]ssaop.Op{ssaop.Op386MOVLload, ssaop.Op386LEAL4}:  ssaop.Op386MOVLloadidx4,
   448  	[2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386LEAL1}: ssaop.Op386MOVSSloadidx1,
   449  	[2]ssaop.Op{ssaop.Op386MOVSSload, ssaop.Op386LEAL4}: ssaop.Op386MOVSSloadidx4,
   450  	[2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386LEAL1}: ssaop.Op386MOVSDloadidx1,
   451  	[2]ssaop.Op{ssaop.Op386MOVSDload, ssaop.Op386LEAL8}: ssaop.Op386MOVSDloadidx8,
   452  
   453  	[2]ssaop.Op{ssaop.Op386MOVBstore, ssaop.Op386LEAL1}:  ssaop.Op386MOVBstoreidx1,
   454  	[2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386LEAL1}:  ssaop.Op386MOVWstoreidx1,
   455  	[2]ssaop.Op{ssaop.Op386MOVWstore, ssaop.Op386LEAL2}:  ssaop.Op386MOVWstoreidx2,
   456  	[2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386LEAL1}:  ssaop.Op386MOVLstoreidx1,
   457  	[2]ssaop.Op{ssaop.Op386MOVLstore, ssaop.Op386LEAL4}:  ssaop.Op386MOVLstoreidx4,
   458  	[2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386LEAL1}: ssaop.Op386MOVSSstoreidx1,
   459  	[2]ssaop.Op{ssaop.Op386MOVSSstore, ssaop.Op386LEAL4}: ssaop.Op386MOVSSstoreidx4,
   460  	[2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386LEAL1}: ssaop.Op386MOVSDstoreidx1,
   461  	[2]ssaop.Op{ssaop.Op386MOVSDstore, ssaop.Op386LEAL8}: ssaop.Op386MOVSDstoreidx8,
   462  
   463  	[2]ssaop.Op{ssaop.Op386MOVBstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVBstoreconstidx1,
   464  	[2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVWstoreconstidx1,
   465  	[2]ssaop.Op{ssaop.Op386MOVWstoreconst, ssaop.Op386LEAL2}: ssaop.Op386MOVWstoreconstidx2,
   466  	[2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386LEAL1}: ssaop.Op386MOVLstoreconstidx1,
   467  	[2]ssaop.Op{ssaop.Op386MOVLstoreconst, ssaop.Op386LEAL4}: ssaop.Op386MOVLstoreconstidx4,
   468  
   469  	[2]ssaop.Op{ssaop.Op386ADDLload, ssaop.Op386LEAL4}: ssaop.Op386ADDLloadidx4,
   470  	[2]ssaop.Op{ssaop.Op386SUBLload, ssaop.Op386LEAL4}: ssaop.Op386SUBLloadidx4,
   471  	[2]ssaop.Op{ssaop.Op386MULLload, ssaop.Op386LEAL4}: ssaop.Op386MULLloadidx4,
   472  	[2]ssaop.Op{ssaop.Op386ANDLload, ssaop.Op386LEAL4}: ssaop.Op386ANDLloadidx4,
   473  	[2]ssaop.Op{ssaop.Op386ORLload, ssaop.Op386LEAL4}:  ssaop.Op386ORLloadidx4,
   474  	[2]ssaop.Op{ssaop.Op386XORLload, ssaop.Op386LEAL4}: ssaop.Op386XORLloadidx4,
   475  
   476  	[2]ssaop.Op{ssaop.Op386ADDLmodify, ssaop.Op386LEAL4}: ssaop.Op386ADDLmodifyidx4,
   477  	[2]ssaop.Op{ssaop.Op386SUBLmodify, ssaop.Op386LEAL4}: ssaop.Op386SUBLmodifyidx4,
   478  	[2]ssaop.Op{ssaop.Op386ANDLmodify, ssaop.Op386LEAL4}: ssaop.Op386ANDLmodifyidx4,
   479  	[2]ssaop.Op{ssaop.Op386ORLmodify, ssaop.Op386LEAL4}:  ssaop.Op386ORLmodifyidx4,
   480  	[2]ssaop.Op{ssaop.Op386XORLmodify, ssaop.Op386LEAL4}: ssaop.Op386XORLmodifyidx4,
   481  
   482  	[2]ssaop.Op{ssaop.Op386ADDLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386ADDLconstmodifyidx4,
   483  	[2]ssaop.Op{ssaop.Op386ANDLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386ANDLconstmodifyidx4,
   484  	[2]ssaop.Op{ssaop.Op386ORLconstmodify, ssaop.Op386LEAL4}:  ssaop.Op386ORLconstmodifyidx4,
   485  	[2]ssaop.Op{ssaop.Op386XORLconstmodify, ssaop.Op386LEAL4}: ssaop.Op386XORLconstmodifyidx4,
   486  
   487  	// s390x
   488  	[2]ssaop.Op{ssaop.OpS390XMOVDload, ssaop.OpS390XADD}: ssaop.OpS390XMOVDloadidx,
   489  	[2]ssaop.Op{ssaop.OpS390XMOVWload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWloadidx,
   490  	[2]ssaop.Op{ssaop.OpS390XMOVHload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHloadidx,
   491  	[2]ssaop.Op{ssaop.OpS390XMOVBload, ssaop.OpS390XADD}: ssaop.OpS390XMOVBloadidx,
   492  
   493  	[2]ssaop.Op{ssaop.OpS390XMOVWZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWZloadidx,
   494  	[2]ssaop.Op{ssaop.OpS390XMOVHZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHZloadidx,
   495  	[2]ssaop.Op{ssaop.OpS390XMOVBZload, ssaop.OpS390XADD}: ssaop.OpS390XMOVBZloadidx,
   496  
   497  	[2]ssaop.Op{ssaop.OpS390XMOVDBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVDBRloadidx,
   498  	[2]ssaop.Op{ssaop.OpS390XMOVWBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVWBRloadidx,
   499  	[2]ssaop.Op{ssaop.OpS390XMOVHBRload, ssaop.OpS390XADD}: ssaop.OpS390XMOVHBRloadidx,
   500  
   501  	[2]ssaop.Op{ssaop.OpS390XFMOVDload, ssaop.OpS390XADD}: ssaop.OpS390XFMOVDloadidx,
   502  	[2]ssaop.Op{ssaop.OpS390XFMOVSload, ssaop.OpS390XADD}: ssaop.OpS390XFMOVSloadidx,
   503  
   504  	[2]ssaop.Op{ssaop.OpS390XMOVDstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVDstoreidx,
   505  	[2]ssaop.Op{ssaop.OpS390XMOVWstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVWstoreidx,
   506  	[2]ssaop.Op{ssaop.OpS390XMOVHstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVHstoreidx,
   507  	[2]ssaop.Op{ssaop.OpS390XMOVBstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVBstoreidx,
   508  
   509  	[2]ssaop.Op{ssaop.OpS390XMOVDBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVDBRstoreidx,
   510  	[2]ssaop.Op{ssaop.OpS390XMOVWBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVWBRstoreidx,
   511  	[2]ssaop.Op{ssaop.OpS390XMOVHBRstore, ssaop.OpS390XADD}: ssaop.OpS390XMOVHBRstoreidx,
   512  
   513  	[2]ssaop.Op{ssaop.OpS390XFMOVDstore, ssaop.OpS390XADD}: ssaop.OpS390XFMOVDstoreidx,
   514  	[2]ssaop.Op{ssaop.OpS390XFMOVSstore, ssaop.OpS390XADD}: ssaop.OpS390XFMOVSstoreidx,
   515  
   516  	[2]ssaop.Op{ssaop.OpS390XMOVDload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDloadidx,
   517  	[2]ssaop.Op{ssaop.OpS390XMOVWload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWloadidx,
   518  	[2]ssaop.Op{ssaop.OpS390XMOVHload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHloadidx,
   519  	[2]ssaop.Op{ssaop.OpS390XMOVBload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBloadidx,
   520  
   521  	[2]ssaop.Op{ssaop.OpS390XMOVWZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWZloadidx,
   522  	[2]ssaop.Op{ssaop.OpS390XMOVHZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHZloadidx,
   523  	[2]ssaop.Op{ssaop.OpS390XMOVBZload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBZloadidx,
   524  
   525  	[2]ssaop.Op{ssaop.OpS390XMOVDBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDBRloadidx,
   526  	[2]ssaop.Op{ssaop.OpS390XMOVWBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWBRloadidx,
   527  	[2]ssaop.Op{ssaop.OpS390XMOVHBRload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHBRloadidx,
   528  
   529  	[2]ssaop.Op{ssaop.OpS390XFMOVDload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVDloadidx,
   530  	[2]ssaop.Op{ssaop.OpS390XFMOVSload, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVSloadidx,
   531  
   532  	[2]ssaop.Op{ssaop.OpS390XMOVDstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDstoreidx,
   533  	[2]ssaop.Op{ssaop.OpS390XMOVWstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWstoreidx,
   534  	[2]ssaop.Op{ssaop.OpS390XMOVHstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHstoreidx,
   535  	[2]ssaop.Op{ssaop.OpS390XMOVBstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVBstoreidx,
   536  
   537  	[2]ssaop.Op{ssaop.OpS390XMOVDBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVDBRstoreidx,
   538  	[2]ssaop.Op{ssaop.OpS390XMOVWBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVWBRstoreidx,
   539  	[2]ssaop.Op{ssaop.OpS390XMOVHBRstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XMOVHBRstoreidx,
   540  
   541  	[2]ssaop.Op{ssaop.OpS390XFMOVDstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVDstoreidx,
   542  	[2]ssaop.Op{ssaop.OpS390XFMOVSstore, ssaop.OpS390XMOVDaddridx}: ssaop.OpS390XFMOVSstoreidx,
   543  }
   544  

View as plain text