github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/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  	return false
    86  }
    87  func rewriteValueARM_OpAddr(v *Value, config *Config) bool {
    88  	b := v.Block
    89  	_ = b
    90  	// match: (Addr {sym} base)
    91  	// cond:
    92  	// result: (ADDconst {sym} base)
    93  	for {
    94  		sym := v.Aux
    95  		base := v.Args[0]
    96  		v.reset(OpARMADDconst)
    97  		v.Aux = sym
    98  		v.AddArg(base)
    99  		return true
   100  	}
   101  	return false
   102  }
   103  func rewriteValueARM_OpConst32(v *Value, config *Config) bool {
   104  	b := v.Block
   105  	_ = b
   106  	// match: (Const32 [val])
   107  	// cond:
   108  	// result: (MOVWconst [val])
   109  	for {
   110  		val := v.AuxInt
   111  		v.reset(OpARMMOVWconst)
   112  		v.AuxInt = val
   113  		return true
   114  	}
   115  	return false
   116  }
   117  func rewriteValueARM_OpLess32(v *Value, config *Config) bool {
   118  	b := v.Block
   119  	_ = b
   120  	// match: (Less32 x y)
   121  	// cond:
   122  	// result: (LessThan (CMP x y))
   123  	for {
   124  		x := v.Args[0]
   125  		y := v.Args[1]
   126  		v.reset(OpARMLessThan)
   127  		v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags)
   128  		v0.AddArg(x)
   129  		v0.AddArg(y)
   130  		v.AddArg(v0)
   131  		return true
   132  	}
   133  	return false
   134  }
   135  func rewriteValueARM_OpLoad(v *Value, config *Config) bool {
   136  	b := v.Block
   137  	_ = b
   138  	// match: (Load <t> ptr mem)
   139  	// cond: is32BitInt(t)
   140  	// result: (MOVWload ptr mem)
   141  	for {
   142  		t := v.Type
   143  		ptr := v.Args[0]
   144  		mem := v.Args[1]
   145  		if !(is32BitInt(t)) {
   146  			break
   147  		}
   148  		v.reset(OpARMMOVWload)
   149  		v.AddArg(ptr)
   150  		v.AddArg(mem)
   151  		return true
   152  	}
   153  	return false
   154  }
   155  func rewriteValueARM_OpARMMOVWload(v *Value, config *Config) bool {
   156  	b := v.Block
   157  	_ = b
   158  	// match: (MOVWload [off1] {sym1} (ADDconst [off2] {sym2} ptr) mem)
   159  	// cond: canMergeSym(sym1,sym2)
   160  	// result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
   161  	for {
   162  		off1 := v.AuxInt
   163  		sym1 := v.Aux
   164  		v_0 := v.Args[0]
   165  		if v_0.Op != OpARMADDconst {
   166  			break
   167  		}
   168  		off2 := v_0.AuxInt
   169  		sym2 := v_0.Aux
   170  		ptr := v_0.Args[0]
   171  		mem := v.Args[1]
   172  		if !(canMergeSym(sym1, sym2)) {
   173  			break
   174  		}
   175  		v.reset(OpARMMOVWload)
   176  		v.AuxInt = off1 + off2
   177  		v.Aux = mergeSym(sym1, sym2)
   178  		v.AddArg(ptr)
   179  		v.AddArg(mem)
   180  		return true
   181  	}
   182  	return false
   183  }
   184  func rewriteValueARM_OpARMMOVWstore(v *Value, config *Config) bool {
   185  	b := v.Block
   186  	_ = b
   187  	// match: (MOVWstore [off1] {sym1} (ADDconst [off2] {sym2} ptr) val mem)
   188  	// cond: canMergeSym(sym1,sym2)
   189  	// result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem)
   190  	for {
   191  		off1 := v.AuxInt
   192  		sym1 := v.Aux
   193  		v_0 := v.Args[0]
   194  		if v_0.Op != OpARMADDconst {
   195  			break
   196  		}
   197  		off2 := v_0.AuxInt
   198  		sym2 := v_0.Aux
   199  		ptr := v_0.Args[0]
   200  		val := v.Args[1]
   201  		mem := v.Args[2]
   202  		if !(canMergeSym(sym1, sym2)) {
   203  			break
   204  		}
   205  		v.reset(OpARMMOVWstore)
   206  		v.AuxInt = off1 + off2
   207  		v.Aux = mergeSym(sym1, sym2)
   208  		v.AddArg(ptr)
   209  		v.AddArg(val)
   210  		v.AddArg(mem)
   211  		return true
   212  	}
   213  	return false
   214  }
   215  func rewriteValueARM_OpOffPtr(v *Value, config *Config) bool {
   216  	b := v.Block
   217  	_ = b
   218  	// match: (OffPtr [off] ptr)
   219  	// cond:
   220  	// result: (ADD (MOVWconst <config.Frontend().TypeInt32()> [off]) ptr)
   221  	for {
   222  		off := v.AuxInt
   223  		ptr := v.Args[0]
   224  		v.reset(OpARMADD)
   225  		v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.Frontend().TypeInt32())
   226  		v0.AuxInt = off
   227  		v.AddArg(v0)
   228  		v.AddArg(ptr)
   229  		return true
   230  	}
   231  	return false
   232  }
   233  func rewriteValueARM_OpStaticCall(v *Value, config *Config) bool {
   234  	b := v.Block
   235  	_ = b
   236  	// match: (StaticCall [argwid] {target} mem)
   237  	// cond:
   238  	// result: (CALLstatic [argwid] {target} mem)
   239  	for {
   240  		argwid := v.AuxInt
   241  		target := v.Aux
   242  		mem := v.Args[0]
   243  		v.reset(OpARMCALLstatic)
   244  		v.AuxInt = argwid
   245  		v.Aux = target
   246  		v.AddArg(mem)
   247  		return true
   248  	}
   249  	return false
   250  }
   251  func rewriteValueARM_OpStore(v *Value, config *Config) bool {
   252  	b := v.Block
   253  	_ = b
   254  	// match: (Store [4] ptr val mem)
   255  	// cond:
   256  	// result: (MOVWstore ptr val mem)
   257  	for {
   258  		if v.AuxInt != 4 {
   259  			break
   260  		}
   261  		ptr := v.Args[0]
   262  		val := v.Args[1]
   263  		mem := v.Args[2]
   264  		v.reset(OpARMMOVWstore)
   265  		v.AddArg(ptr)
   266  		v.AddArg(val)
   267  		v.AddArg(mem)
   268  		return true
   269  	}
   270  	return false
   271  }
   272  func rewriteBlockARM(b *Block) bool {
   273  	switch b.Kind {
   274  	case BlockIf:
   275  		// match: (If (LessThan cc) yes no)
   276  		// cond:
   277  		// result: (LT cc yes no)
   278  		for {
   279  			v := b.Control
   280  			if v.Op != OpARMLessThan {
   281  				break
   282  			}
   283  			cc := v.Args[0]
   284  			yes := b.Succs[0]
   285  			no := b.Succs[1]
   286  			b.Kind = BlockARMLT
   287  			b.SetControl(cc)
   288  			b.Succs[0] = yes
   289  			b.Succs[1] = no
   290  			return true
   291  		}
   292  	}
   293  	return false
   294  }