| // autogenerated from rulegen/generic.rules: do not edit! |
| // generated with: go run rulegen/rulegen.go rulegen/generic.rules genericBlockRules genericValueRules generic.go |
| package ssa |
| |
| func genericValueRules(v *Value, config *Config) bool { |
| switch v.Op { |
| case OpAdd: |
| // match: (Add <t> (Const [c]) (Const [d])) |
| // cond: is64BitInt(t) |
| // result: (Const [{c.(int64)+d.(int64)}]) |
| { |
| t := v.Type |
| if v.Args[0].Op != OpConst { |
| goto end8d047ed0ae9537b840adc79ea82c6e05 |
| } |
| c := v.Args[0].Aux |
| if v.Args[1].Op != OpConst { |
| goto end8d047ed0ae9537b840adc79ea82c6e05 |
| } |
| d := v.Args[1].Aux |
| if !(is64BitInt(t)) { |
| goto end8d047ed0ae9537b840adc79ea82c6e05 |
| } |
| v.Op = OpConst |
| v.Aux = nil |
| v.resetArgs() |
| v.Aux = c.(int64) + d.(int64) |
| return true |
| } |
| goto end8d047ed0ae9537b840adc79ea82c6e05 |
| end8d047ed0ae9537b840adc79ea82c6e05: |
| ; |
| case OpArrayIndex: |
| // match: (ArrayIndex (Load ptr mem) idx) |
| // cond: |
| // result: (Load (PtrIndex <ptr.Type.Elem().Elem().PtrTo()> ptr idx) mem) |
| { |
| if v.Args[0].Op != OpLoad { |
| goto end3809f4c52270a76313e4ea26e6f0b753 |
| } |
| ptr := v.Args[0].Args[0] |
| mem := v.Args[0].Args[1] |
| idx := v.Args[1] |
| v.Op = OpLoad |
| v.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpPtrIndex, TypeInvalid, nil) |
| v0.Type = ptr.Type.Elem().Elem().PtrTo() |
| v0.AddArg(ptr) |
| v0.AddArg(idx) |
| v.AddArg(v0) |
| v.AddArg(mem) |
| return true |
| } |
| goto end3809f4c52270a76313e4ea26e6f0b753 |
| end3809f4c52270a76313e4ea26e6f0b753: |
| ; |
| 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 end8442aa5b3f4e5b840055475883110372 |
| } |
| v.Op = OpStringMake |
| v.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpOffPtr, TypeInvalid, nil) |
| v0.Type = TypeBytePtr |
| v0.Aux = 2 * config.ptrSize |
| v1 := v.Block.NewValue(OpGlobal, TypeInvalid, nil) |
| v1.Type = TypeBytePtr |
| v1.Aux = config.fe.StringSym(s.(string)) |
| v0.AddArg(v1) |
| v.AddArg(v0) |
| v2 := v.Block.NewValue(OpConst, TypeInvalid, nil) |
| v2.Type = config.Uintptr |
| v2.Aux = int64(len(s.(string))) |
| v.AddArg(v2) |
| return true |
| } |
| goto end8442aa5b3f4e5b840055475883110372 |
| end8442aa5b3f4e5b840055475883110372: |
| ; |
| case OpIsInBounds: |
| // match: (IsInBounds (Const [c]) (Const [d])) |
| // cond: |
| // result: (Const [inBounds(c.(int64),d.(int64))]) |
| { |
| if v.Args[0].Op != OpConst { |
| goto enddbd1a394d9b71ee64335361b8384865c |
| } |
| c := v.Args[0].Aux |
| if v.Args[1].Op != OpConst { |
| goto enddbd1a394d9b71ee64335361b8384865c |
| } |
| d := v.Args[1].Aux |
| v.Op = OpConst |
| v.Aux = nil |
| v.resetArgs() |
| v.Aux = inBounds(c.(int64), d.(int64)) |
| return true |
| } |
| goto enddbd1a394d9b71ee64335361b8384865c |
| enddbd1a394d9b71ee64335361b8384865c: |
| ; |
| 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.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpLoad, TypeInvalid, nil) |
| v0.Type = TypeBytePtr |
| v0.AddArg(ptr) |
| v0.AddArg(mem) |
| v.AddArg(v0) |
| v1 := v.Block.NewValue(OpLoad, TypeInvalid, nil) |
| v1.Type = config.Uintptr |
| v2 := v.Block.NewValue(OpOffPtr, TypeInvalid, nil) |
| v2.Type = TypeBytePtr |
| v2.Aux = 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.(int64)*d.(int64)}]) |
| { |
| t := v.Type |
| if v.Args[0].Op != OpConst { |
| goto end776610f88cf04f438242d76ed2b14f1c |
| } |
| c := v.Args[0].Aux |
| if v.Args[1].Op != OpConst { |
| goto end776610f88cf04f438242d76ed2b14f1c |
| } |
| d := v.Args[1].Aux |
| if !(is64BitInt(t)) { |
| goto end776610f88cf04f438242d76ed2b14f1c |
| } |
| v.Op = OpConst |
| v.Aux = nil |
| v.resetArgs() |
| v.Aux = c.(int64) * d.(int64) |
| return true |
| } |
| goto end776610f88cf04f438242d76ed2b14f1c |
| end776610f88cf04f438242d76ed2b14f1c: |
| ; |
| 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.Aux = nil |
| v.resetArgs() |
| v.AddArg(ptr) |
| v0 := v.Block.NewValue(OpMul, TypeInvalid, nil) |
| v0.Type = config.Uintptr |
| v0.AddArg(idx) |
| v1 := v.Block.NewValue(OpConst, TypeInvalid, nil) |
| v1.Type = config.Uintptr |
| v1.Aux = 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> [int64(config.ptrSize*2)])) mem) |
| { |
| if v.Args[0].Op != OpLoad { |
| goto endc871dcd9a720b4290c9cae78fe147c8a |
| } |
| ptr := v.Args[0].Args[0] |
| mem := v.Args[0].Args[1] |
| v.Op = OpLoad |
| v.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpAdd, TypeInvalid, nil) |
| v0.Type = ptr.Type |
| v0.AddArg(ptr) |
| v1 := v.Block.NewValue(OpConst, TypeInvalid, nil) |
| v1.Type = config.Uintptr |
| v1.Aux = int64(config.ptrSize * 2) |
| v0.AddArg(v1) |
| v.AddArg(v0) |
| v.AddArg(mem) |
| return true |
| } |
| goto endc871dcd9a720b4290c9cae78fe147c8a |
| endc871dcd9a720b4290c9cae78fe147c8a: |
| ; |
| case OpSliceLen: |
| // match: (SliceLen (Load ptr mem)) |
| // cond: |
| // result: (Load (Add <ptr.Type> ptr (Const <config.Uintptr> [int64(config.ptrSize)])) mem) |
| { |
| if v.Args[0].Op != OpLoad { |
| goto end1eec05e44f5fc8944e7c176f98a74d92 |
| } |
| ptr := v.Args[0].Args[0] |
| mem := v.Args[0].Args[1] |
| v.Op = OpLoad |
| v.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpAdd, TypeInvalid, nil) |
| v0.Type = ptr.Type |
| v0.AddArg(ptr) |
| v1 := v.Block.NewValue(OpConst, TypeInvalid, nil) |
| v1.Type = config.Uintptr |
| v1.Aux = int64(config.ptrSize) |
| v0.AddArg(v1) |
| v.AddArg(v0) |
| v.AddArg(mem) |
| return true |
| } |
| goto end1eec05e44f5fc8944e7c176f98a74d92 |
| end1eec05e44f5fc8944e7c176f98a74d92: |
| ; |
| 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.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.Aux = nil |
| v.resetArgs() |
| v.Aux = 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.Aux = nil |
| v.resetArgs() |
| v0 := v.Block.NewValue(OpOffPtr, TypeInvalid, nil) |
| v0.Type = TypeBytePtr |
| v0.Aux = config.ptrSize |
| v0.AddArg(dst) |
| v.AddArg(v0) |
| v1 := v.Block.NewValue(OpStringLen, TypeInvalid, nil) |
| v1.Type = config.Uintptr |
| v1.AddArg(str) |
| v.AddArg(v1) |
| v2 := v.Block.NewValue(OpStore, TypeInvalid, nil) |
| v2.Type = TypeMem |
| v2.AddArg(dst) |
| v3 := v.Block.NewValue(OpStringPtr, TypeInvalid, nil) |
| 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.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.Aux = ptr.Aux |
| v.resetArgs() |
| v.AddArgs(ptr.Args...) |
| return true |
| } |
| goto end061edc5d85c73ad909089af2556d9380 |
| end061edc5d85c73ad909089af2556d9380: |
| } |
| return false |
| } |
| func genericBlockRules(b *Block) bool { |
| switch b.Kind { |
| case BlockIf: |
| // match: (BlockIf (Const [c]) yes no) |
| // cond: c.(bool) |
| // result: (BlockPlain nil yes) |
| { |
| v := b.Control |
| if v.Op != OpConst { |
| goto endbe39807508a6192b4022c7293eb6e114 |
| } |
| c := v.Aux |
| yes := b.Succs[0] |
| no := b.Succs[1] |
| if !(c.(bool)) { |
| goto endbe39807508a6192b4022c7293eb6e114 |
| } |
| removePredecessor(b, no) |
| b.Kind = BlockPlain |
| b.Control = nil |
| b.Succs = b.Succs[:1] |
| b.Succs[0] = yes |
| return true |
| } |
| goto endbe39807508a6192b4022c7293eb6e114 |
| endbe39807508a6192b4022c7293eb6e114: |
| ; |
| // match: (BlockIf (Const [c]) yes no) |
| // cond: !c.(bool) |
| // result: (BlockPlain nil no) |
| { |
| v := b.Control |
| if v.Op != OpConst { |
| goto end69ac35957ebe0a77a5ef5103c1f79fbf |
| } |
| c := v.Aux |
| yes := b.Succs[0] |
| no := b.Succs[1] |
| if !(!c.(bool)) { |
| goto end69ac35957ebe0a77a5ef5103c1f79fbf |
| } |
| removePredecessor(b, yes) |
| b.Kind = BlockPlain |
| b.Control = nil |
| b.Succs = b.Succs[:1] |
| b.Succs[0] = no |
| return true |
| } |
| goto end69ac35957ebe0a77a5ef5103c1f79fbf |
| end69ac35957ebe0a77a5ef5103c1f79fbf: |
| } |
| return false |
| } |