// autogenerated from gen/generic.rules: do not edit! // generated with: cd gen; go run *.go package ssa func rewriteValuegeneric(v *Value, config *Config) bool { switch v.Op { case OpAdd: // match: (Add (Const [c]) (Const [d])) // cond: is64BitInt(t) // result: (Const [c+d]) { t := v.Type if v.Args[0].Op != OpConst { goto end279f4ea85ed10e5ffc5b53f9e060529b } c := v.Args[0].AuxInt if v.Args[1].Op != OpConst { goto end279f4ea85ed10e5ffc5b53f9e060529b } d := v.Args[1].AuxInt if !(is64BitInt(t)) { goto end279f4ea85ed10e5ffc5b53f9e060529b } v.Op = OpConst v.AuxInt = 0 v.Aux = nil v.resetArgs() v.AuxInt = c + d return true } goto end279f4ea85ed10e5ffc5b53f9e060529b end279f4ea85ed10e5ffc5b53f9e060529b: ; case OpArrayIndex: // match: (ArrayIndex (Load ptr mem) idx) // cond: // result: (Load (PtrIndex ptr idx) mem) { if v.Args[0].Op != OpLoad { goto end4894dd7b58383fee5f8a92be08437c33 } ptr := v.Args[0].Args[0] mem := v.Args[0].Args[1] idx := v.Args[1] v.Op = OpLoad v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpPtrIndex, TypeInvalid) v0.Type = v.Type.PtrTo() v0.AddArg(ptr) v0.AddArg(idx) v.AddArg(v0) v.AddArg(mem) return true } goto end4894dd7b58383fee5f8a92be08437c33 end4894dd7b58383fee5f8a92be08437c33: ; case OpConst: // match: (Const {s}) // cond: t.IsString() // result: (StringMake (OffPtr [2*config.ptrSize] (Addr {config.fe.StringSym(s.(string))} (SB ))) (Const [int64(len(s.(string)))])) { t := v.Type s := v.Aux if !(t.IsString()) { goto end55cd8fd3b98a2459d0ee9d6cbb456b01 } v.Op = OpStringMake v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpOffPtr, TypeInvalid) v0.Type = TypeBytePtr v0.AuxInt = 2 * config.ptrSize v1 := v.Block.NewValue0(v.Line, OpAddr, TypeInvalid) v1.Type = TypeBytePtr v1.Aux = config.fe.StringSym(s.(string)) v2 := v.Block.NewValue0(v.Line, OpSB, TypeInvalid) v2.Type = config.Uintptr v1.AddArg(v2) v0.AddArg(v1) v.AddArg(v0) v3 := v.Block.NewValue0(v.Line, OpConst, TypeInvalid) v3.Type = config.Uintptr v3.AuxInt = int64(len(s.(string))) v.AddArg(v3) return true } goto end55cd8fd3b98a2459d0ee9d6cbb456b01 end55cd8fd3b98a2459d0ee9d6cbb456b01: ; case OpIsInBounds: // match: (IsInBounds (Const [c]) (Const [d])) // cond: // result: (Const {inBounds(c,d)}) { if v.Args[0].Op != OpConst { goto enda96ccac78df2d17ae96c8baf2af2e189 } c := v.Args[0].AuxInt if v.Args[1].Op != OpConst { goto enda96ccac78df2d17ae96c8baf2af2e189 } d := v.Args[1].AuxInt v.Op = OpConst v.AuxInt = 0 v.Aux = nil v.resetArgs() v.Aux = inBounds(c, d) return true } goto enda96ccac78df2d17ae96c8baf2af2e189 enda96ccac78df2d17ae96c8baf2af2e189: ; case OpLoad: // match: (Load ptr mem) // cond: t.IsString() // result: (StringMake (Load ptr mem) (Load (OffPtr [config.ptrSize] ptr) mem)) { t := v.Type ptr := v.Args[0] mem := v.Args[1] if !(t.IsString()) { goto endd0afd003b70d726a1c5bbaf51fe06182 } v.Op = OpStringMake v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpLoad, TypeInvalid) v0.Type = TypeBytePtr v0.AddArg(ptr) v0.AddArg(mem) v.AddArg(v0) v1 := v.Block.NewValue0(v.Line, OpLoad, TypeInvalid) v1.Type = config.Uintptr v2 := v.Block.NewValue0(v.Line, OpOffPtr, TypeInvalid) v2.Type = TypeBytePtr v2.AuxInt = config.ptrSize v2.AddArg(ptr) v1.AddArg(v2) v1.AddArg(mem) v.AddArg(v1) return true } goto endd0afd003b70d726a1c5bbaf51fe06182 endd0afd003b70d726a1c5bbaf51fe06182: ; case OpMul: // match: (Mul (Const [c]) (Const [d])) // cond: is64BitInt(t) // result: (Const [c*d]) { t := v.Type if v.Args[0].Op != OpConst { goto endd82095c6a872974522d33aaff1ee07be } c := v.Args[0].AuxInt if v.Args[1].Op != OpConst { goto endd82095c6a872974522d33aaff1ee07be } d := v.Args[1].AuxInt if !(is64BitInt(t)) { goto endd82095c6a872974522d33aaff1ee07be } v.Op = OpConst v.AuxInt = 0 v.Aux = nil v.resetArgs() v.AuxInt = c * d return true } goto endd82095c6a872974522d33aaff1ee07be endd82095c6a872974522d33aaff1ee07be: ; case OpPtrIndex: // match: (PtrIndex ptr idx) // cond: // result: (Add ptr (Mul idx (Const [t.Elem().Size()]))) { t := v.Type ptr := v.Args[0] idx := v.Args[1] v.Op = OpAdd v.AuxInt = 0 v.Aux = nil v.resetArgs() v.AddArg(ptr) v0 := v.Block.NewValue0(v.Line, OpMul, TypeInvalid) v0.Type = config.Uintptr v0.AddArg(idx) v1 := v.Block.NewValue0(v.Line, OpConst, TypeInvalid) v1.Type = config.Uintptr v1.AuxInt = t.Elem().Size() v0.AddArg(v1) v.AddArg(v0) return true } goto end88c7c383675420d1581daeb899039fa8 end88c7c383675420d1581daeb899039fa8: ; case OpSliceCap: // match: (SliceCap (Load ptr mem)) // cond: // result: (Load (Add ptr (Const [config.ptrSize*2])) mem) { if v.Args[0].Op != OpLoad { goto end919cfa3d3539eb2e06a435d5f89654b9 } ptr := v.Args[0].Args[0] mem := v.Args[0].Args[1] v.Op = OpLoad v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpAdd, TypeInvalid) v0.Type = ptr.Type v0.AddArg(ptr) v1 := v.Block.NewValue0(v.Line, OpConst, TypeInvalid) v1.Type = config.Uintptr v1.AuxInt = config.ptrSize * 2 v0.AddArg(v1) v.AddArg(v0) v.AddArg(mem) return true } goto end919cfa3d3539eb2e06a435d5f89654b9 end919cfa3d3539eb2e06a435d5f89654b9: ; case OpSliceLen: // match: (SliceLen (Load ptr mem)) // cond: // result: (Load (Add ptr (Const [config.ptrSize])) mem) { if v.Args[0].Op != OpLoad { goto end3d74a5ef07180a709a91052da88bcd01 } ptr := v.Args[0].Args[0] mem := v.Args[0].Args[1] v.Op = OpLoad v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpAdd, TypeInvalid) v0.Type = ptr.Type v0.AddArg(ptr) v1 := v.Block.NewValue0(v.Line, OpConst, TypeInvalid) v1.Type = config.Uintptr v1.AuxInt = config.ptrSize v0.AddArg(v1) v.AddArg(v0) v.AddArg(mem) return true } goto end3d74a5ef07180a709a91052da88bcd01 end3d74a5ef07180a709a91052da88bcd01: ; case OpSlicePtr: // match: (SlicePtr (Load ptr mem)) // cond: // result: (Load ptr mem) { if v.Args[0].Op != OpLoad { goto end459613b83f95b65729d45c2ed663a153 } ptr := v.Args[0].Args[0] mem := v.Args[0].Args[1] v.Op = OpLoad v.AuxInt = 0 v.Aux = nil v.resetArgs() v.AddArg(ptr) v.AddArg(mem) return true } goto end459613b83f95b65729d45c2ed663a153 end459613b83f95b65729d45c2ed663a153: ; case OpStore: // match: (Store dst (Load src mem) mem) // cond: t.Size() > 8 // result: (Move [t.Size()] dst src mem) { dst := v.Args[0] if v.Args[1].Op != OpLoad { goto end324ffb6d2771808da4267f62c854e9c8 } t := v.Args[1].Type src := v.Args[1].Args[0] mem := v.Args[1].Args[1] if v.Args[2] != v.Args[1].Args[1] { goto end324ffb6d2771808da4267f62c854e9c8 } if !(t.Size() > 8) { goto end324ffb6d2771808da4267f62c854e9c8 } v.Op = OpMove v.AuxInt = 0 v.Aux = nil v.resetArgs() v.AuxInt = t.Size() v.AddArg(dst) v.AddArg(src) v.AddArg(mem) return true } goto end324ffb6d2771808da4267f62c854e9c8 end324ffb6d2771808da4267f62c854e9c8: ; // match: (Store dst str mem) // cond: str.Type.IsString() // result: (Store (OffPtr [config.ptrSize] dst) (StringLen str) (Store dst (StringPtr str) mem)) { dst := v.Args[0] str := v.Args[1] mem := v.Args[2] if !(str.Type.IsString()) { goto end410559d97aed8018f820cd88723de442 } v.Op = OpStore v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpOffPtr, TypeInvalid) v0.Type = TypeBytePtr v0.AuxInt = config.ptrSize v0.AddArg(dst) v.AddArg(v0) v1 := v.Block.NewValue0(v.Line, OpStringLen, TypeInvalid) v1.Type = config.Uintptr v1.AddArg(str) v.AddArg(v1) v2 := v.Block.NewValue0(v.Line, OpStore, TypeInvalid) v2.Type = TypeMem v2.AddArg(dst) v3 := v.Block.NewValue0(v.Line, OpStringPtr, TypeInvalid) v3.Type = TypeBytePtr v3.AddArg(str) v2.AddArg(v3) v2.AddArg(mem) v.AddArg(v2) return true } goto end410559d97aed8018f820cd88723de442 end410559d97aed8018f820cd88723de442: ; case OpStringLen: // match: (StringLen (StringMake _ len)) // cond: // result: len { if v.Args[0].Op != OpStringMake { goto end0d922460b7e5ca88324034f4bd6c027c } len := v.Args[0].Args[1] v.Op = len.Op v.AuxInt = len.AuxInt v.Aux = len.Aux v.resetArgs() v.AddArgs(len.Args...) return true } goto end0d922460b7e5ca88324034f4bd6c027c end0d922460b7e5ca88324034f4bd6c027c: ; case OpStringPtr: // match: (StringPtr (StringMake ptr _)) // cond: // result: ptr { if v.Args[0].Op != OpStringMake { goto end061edc5d85c73ad909089af2556d9380 } ptr := v.Args[0].Args[0] v.Op = ptr.Op v.AuxInt = ptr.AuxInt v.Aux = ptr.Aux v.resetArgs() v.AddArgs(ptr.Args...) return true } goto end061edc5d85c73ad909089af2556d9380 end061edc5d85c73ad909089af2556d9380: ; case OpStructSelect: // match: (StructSelect [idx] (Load ptr mem)) // cond: // result: (Load (OffPtr [idx] ptr) mem) { idx := v.AuxInt if v.Args[0].Op != OpLoad { goto end16fdb45e1dd08feb36e3cc3fb5ed8935 } ptr := v.Args[0].Args[0] mem := v.Args[0].Args[1] v.Op = OpLoad v.AuxInt = 0 v.Aux = nil v.resetArgs() v0 := v.Block.NewValue0(v.Line, OpOffPtr, TypeInvalid) v0.Type = v.Type.PtrTo() v0.AuxInt = idx v0.AddArg(ptr) v.AddArg(v0) v.AddArg(mem) return true } goto end16fdb45e1dd08feb36e3cc3fb5ed8935 end16fdb45e1dd08feb36e3cc3fb5ed8935: } return false } func rewriteBlockgeneric(b *Block) bool { switch b.Kind { case BlockIf: // match: (If (Const {c}) yes no) // cond: c.(bool) // result: (Plain nil yes) { v := b.Control if v.Op != OpConst { goto end915e334b6388fed7d63e09aa69ecb05c } c := v.Aux yes := b.Succs[0] no := b.Succs[1] if !(c.(bool)) { goto end915e334b6388fed7d63e09aa69ecb05c } v.Block.Func.removePredecessor(b, no) b.Kind = BlockPlain b.Control = nil b.Succs = b.Succs[:1] b.Succs[0] = yes return true } goto end915e334b6388fed7d63e09aa69ecb05c end915e334b6388fed7d63e09aa69ecb05c: ; // match: (If (Const {c}) yes no) // cond: !c.(bool) // result: (Plain nil no) { v := b.Control if v.Op != OpConst { goto end6452ee3a5bb02c708bddc3181c3ea3cb } c := v.Aux yes := b.Succs[0] no := b.Succs[1] if !(!c.(bool)) { goto end6452ee3a5bb02c708bddc3181c3ea3cb } v.Block.Func.removePredecessor(b, yes) b.Kind = BlockPlain b.Control = nil b.Succs = b.Succs[:1] b.Succs[0] = no return true } goto end6452ee3a5bb02c708bddc3181c3ea3cb end6452ee3a5bb02c708bddc3181c3ea3cb: } return false }