github.com/mh-cbon/go@v0.0.0-20160603070303-9e112a3fe4c0/src/cmd/compile/internal/ssa/rewriteARM.go (about)

     1  // autogenerated from gen/ARM.rules: do not edit!
     2  // generated with: cd gen; go run *.go
     3  
     4  package ssa
     5  
     6  import "math"
     7  
     8  var _ = math.MinInt8 // in case not otherwise used
     9  func rewriteValueARM(v *Value, config *Config) bool {
    10  	switch v.Op {
    11  	case OpARMADD:
    12  		return rewriteValueARM_OpARMADD(v, config)
    13  	case OpAdd32:
    14  		return rewriteValueARM_OpAdd32(v, config)
    15  	case OpAddr:
    16  		return rewriteValueARM_OpAddr(v, config)
    17  	case OpConst32:
    18  		return rewriteValueARM_OpConst32(v, config)
    19  	case OpLess32:
    20  		return rewriteValueARM_OpLess32(v, config)
    21  	case OpLoad:
    22  		return rewriteValueARM_OpLoad(v, config)
    23  	case OpARMMOVWload:
    24  		return rewriteValueARM_OpARMMOVWload(v, config)
    25  	case OpARMMOVWstore:
    26  		return rewriteValueARM_OpARMMOVWstore(v, config)
    27  	case OpOffPtr:
    28  		return rewriteValueARM_OpOffPtr(v, config)
    29  	case OpStaticCall:
    30  		return rewriteValueARM_OpStaticCall(v, config)
    31  	case OpStore:
    32  		return rewriteValueARM_OpStore(v, config)
    33  	}
    34  	return false
    35  }
    36  func rewriteValueARM_OpARMADD(v *Value, config *Config) bool {
    37  	b := v.Block
    38  	_ = b
    39  	// match: (ADD (MOVWconst [c]) x)
    40  	// cond:
    41  	// result: (ADDconst [c] x)
    42  	for {
    43  		v_0 := v.Args[0]
    44  		if v_0.Op != OpARMMOVWconst {
    45  			break
    46  		}
    47  		c := v_0.AuxInt
    48  		x := v.Args[1]
    49  		v.reset(OpARMADDconst)
    50  		v.AuxInt = c
    51  		v.AddArg(x)
    52  		return true
    53  	}
    54  	// match: (ADD x (MOVWconst [c]))
    55  	// cond:
    56  	// result: (ADDconst [c] x)
    57  	for {
    58  		x := v.Args[0]
    59  		v_1 := v.Args[1]
    60  		if v_1.Op != OpARMMOVWconst {
    61  			break
    62  		}
    63  		c := v_1.AuxInt
    64  		v.reset(OpARMADDconst)
    65  		v.AuxInt = c
    66  		v.AddArg(x)
    67  		return true
    68  	}
    69  	return false
    70  }
    71  func rewriteValueARM_OpAdd32(v *Value, config *Config) bool {
    72  	b := v.Block
    73  	_ = b
    74  	// match: (Add32 x y)
    75  	// cond:
    76  	// result: (ADD x y)
    77  	for {
    78  		x := v.Args[0]
    79  		y := v.Args[1]
    80  		v.reset(OpARMADD)
    81  		v.AddArg(x)
    82  		v.AddArg(y)
    83  		return true
    84  	}
    85  }
    86  func rewriteValueARM_OpAddr(v *Value, config *Config) bool {
    87  	b := v.Block
    88  	_ = b
    89  	// match: (Addr {sym} base)
    90  	// cond:
    91  	// result: (ADDconst {sym} base)
    92  	for {
    93  		sym := v.Aux
    94  		base := v.Args[0]
    95  		v.reset(OpARMADDconst)
    96  		v.Aux = sym
    97  		v.AddArg(base)
    98  		return true
    99  	}
   100  }
   101  func rewriteValueARM_OpConst32(v *Value, config *Config) bool {
   102  	b := v.Block
   103  	_ = b
   104  	// match: (Const32 [val])
   105  	// cond:
   106  	// result: (MOVWconst [val])
   107  	for {
   108  		val := v.AuxInt
   109  		v.reset(OpARMMOVWconst)
   110  		v.AuxInt = val
   111  		return true
   112  	}
   113  }
   114  func rewriteValueARM_OpLess32(v *Value, config *Config) bool {
   115  	b := v.Block
   116  	_ = b
   117  	// match: (Less32 x y)
   118  	// cond:
   119  	// result: (LessThan (CMP x y))
   120  	for {
   121  		x := v.Args[0]
   122  		y := v.Args[1]
   123  		v.reset(OpARMLessThan)
   124  		v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags)
   125  		v0.AddArg(x)
   126  		v0.AddArg(y)
   127  		v.AddArg(v0)
   128  		return true
   129  	}
   130  }
   131  func rewriteValueARM_OpLoad(v *Value, config *Config) bool {
   132  	b := v.Block
   133  	_ = b
   134  	// match: (Load <t> ptr mem)
   135  	// cond: is32BitInt(t)
   136  	// result: (MOVWload ptr mem)
   137  	for {
   138  		t := v.Type
   139  		ptr := v.Args[0]
   140  		mem := v.Args[1]
   141  		if !(is32BitInt(t)) {
   142  			break
   143  		}
   144  		v.reset(OpARMMOVWload)
   145  		v.AddArg(ptr)
   146  		v.AddArg(mem)
   147  		return true
   148  	}
   149  	return false
   150  }
   151  func rewriteValueARM_OpARMMOVWload(v *Value, config *Config) bool {
   152  	b := v.Block
   153  	_ = b
   154  	// match: (MOVWload [off1] {sym1} (ADDconst [off2] {sym2} ptr) mem)
   155  	// cond: canMergeSym(sym1,sym2)
   156  	// result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
   157  	for {
   158  		off1 := v.AuxInt
   159  		sym1 := v.Aux
   160  		v_0 := v.Args[0]
   161  		if v_0.Op != OpARMADDconst {
   162  			break
   163  		}
   164  		off2 := v_0.AuxInt
   165  		sym2 := v_0.Aux
   166  		ptr := v_0.Args[0]
   167  		mem := v.Args[1]
   168  		if !(canMergeSym(sym1, sym2)) {
   169  			break
   170  		}
   171  		v.reset(OpARMMOVWload)
   172  		v.AuxInt = off1 + off2
   173  		v.Aux = mergeSym(sym1, sym2)
   174  		v.AddArg(ptr)
   175  		v.AddArg(mem)
   176  		return true
   177  	}
   178  	return false
   179  }
   180  func rewriteValueARM_OpARMMOVWstore(v *Value, config *Config) bool {
   181  	b := v.Block
   182  	_ = b
   183  	// match: (MOVWstore [off1] {sym1} (ADDconst [off2] {sym2} ptr) val mem)
   184  	// cond: canMergeSym(sym1,sym2)
   185  	// result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
   186  	for {
   187  		off1 := v.AuxInt
   188  		sym1 := v.Aux
   189  		v_0 := v.Args[0]
   190  		if v_0.Op != OpARMADDconst {
   191  			break
   192  		}
   193  		off2 := v_0.AuxInt
   194  		sym2 := v_0.Aux
   195  		ptr := v_0.Args[0]
   196  		val := v.Args[1]
   197  		mem := v.Args[2]
   198  		if !(canMergeSym(sym1, sym2)) {
   199  			break
   200  		}
   201  		v.reset(OpARMMOVWstore)
   202  		v.AuxInt = off1 + off2
   203  		v.Aux = mergeSym(sym1, sym2)
   204  		v.AddArg(ptr)
   205  		v.AddArg(val)
   206  		v.AddArg(mem)
   207  		return true
   208  	}
   209  	return false
   210  }
   211  func rewriteValueARM_OpOffPtr(v *Value, config *Config) bool {
   212  	b := v.Block
   213  	_ = b
   214  	// match: (OffPtr [off] ptr)
   215  	// cond:
   216  	// result: (ADD (MOVWconst <config.Frontend().TypeInt32()> [off]) ptr)
   217  	for {
   218  		off := v.AuxInt
   219  		ptr := v.Args[0]
   220  		v.reset(OpARMADD)
   221  		v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.Frontend().TypeInt32())
   222  		v0.AuxInt = off
   223  		v.AddArg(v0)
   224  		v.AddArg(ptr)
   225  		return true
   226  	}
   227  }
   228  func rewriteValueARM_OpStaticCall(v *Value, config *Config) bool {
   229  	b := v.Block
   230  	_ = b
   231  	// match: (StaticCall [argwid] {target} mem)
   232  	// cond:
   233  	// result: (CALLstatic [argwid] {target} mem)
   234  	for {
   235  		argwid := v.AuxInt
   236  		target := v.Aux
   237  		mem := v.Args[0]
   238  		v.reset(OpARMCALLstatic)
   239  		v.AuxInt = argwid
   240  		v.Aux = target
   241  		v.AddArg(mem)
   242  		return true
   243  	}
   244  }
   245  func rewriteValueARM_OpStore(v *Value, config *Config) bool {
   246  	b := v.Block
   247  	_ = b
   248  	// match: (Store [4] ptr val mem)
   249  	// cond:
   250  	// result: (MOVWstore ptr val mem)
   251  	for {
   252  		if v.AuxInt != 4 {
   253  			break
   254  		}
   255  		ptr := v.Args[0]
   256  		val := v.Args[1]
   257  		mem := v.Args[2]
   258  		v.reset(OpARMMOVWstore)
   259  		v.AddArg(ptr)
   260  		v.AddArg(val)
   261  		v.AddArg(mem)
   262  		return true
   263  	}
   264  	return false
   265  }
   266  func rewriteBlockARM(b *Block) bool {
   267  	switch b.Kind {
   268  	case BlockIf:
   269  		// match: (If (LessThan cc) yes no)
   270  		// cond:
   271  		// result: (LT cc yes no)
   272  		for {
   273  			v := b.Control
   274  			if v.Op != OpARMLessThan {
   275  				break
   276  			}
   277  			cc := v.Args[0]
   278  			yes := b.Succs[0]
   279  			no := b.Succs[1]
   280  			b.Kind = BlockARMLT
   281  			b.SetControl(cc)
   282  			_ = yes
   283  			_ = no
   284  			return true
   285  		}
   286  	}
   287  	return false
   288  }