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 }