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 }