| // 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 <t> (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 <v.Type.PtrTo()> 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 <t> {s}) |
| // cond: t.IsString() |
| // result: (StringMake (OffPtr <TypeBytePtr> [2*config.ptrSize] (Global <TypeBytePtr> {config.fe.StringSym(s.(string))})) (Const <config.Uintptr> [int64(len(s.(string)))])) |
| { |
| t := v.Type |
| s := v.Aux |
| if !(t.IsString()) { |
| goto end6d6321106a054a5984b2ed0acec52a5b |
| } |
| 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, OpGlobal, TypeInvalid) |
| v1.Type = TypeBytePtr |
| v1.Aux = config.fe.StringSym(s.(string)) |
| v0.AddArg(v1) |
| v.AddArg(v0) |
| v2 := v.Block.NewValue0(v.Line, OpConst, TypeInvalid) |
| v2.Type = config.Uintptr |
| v2.AuxInt = int64(len(s.(string))) |
| v.AddArg(v2) |
| return true |
| } |
| goto end6d6321106a054a5984b2ed0acec52a5b |
| end6d6321106a054a5984b2ed0acec52a5b: |
| ; |
| 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 <t> ptr mem) |
| // cond: t.IsString() |
| // result: (StringMake (Load <TypeBytePtr> ptr mem) (Load <config.Uintptr> (OffPtr <TypeBytePtr> [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 <t> (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 <t> ptr idx) |
| // cond: |
| // result: (Add ptr (Mul <config.Uintptr> idx (Const <config.Uintptr> [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.Type> ptr (Const <config.Uintptr> [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.Type> ptr (Const <config.Uintptr> [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 <t> 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 <TypeBytePtr> [config.ptrSize] dst) (StringLen <config.Uintptr> str) (Store <TypeMem> dst (StringPtr <TypeBytePtr> 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: |
| } |
| 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 |
| } |
| 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 |
| } |
| 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 |
| } |