2015-06-06 16:03:33 -07:00
|
|
|
// autogenerated from gen/generic.rules: do not edit!
|
|
|
|
|
// generated with: cd gen; go run *.go
|
|
|
|
|
package ssa
|
|
|
|
|
|
|
|
|
|
func rewriteValuegeneric(v *Value, config *Config) bool {
|
2015-08-04 12:24:23 -07:00
|
|
|
b := v.Block
|
2015-06-06 16:03:33 -07:00
|
|
|
switch v.Op {
|
2015-07-19 15:48:20 -07:00
|
|
|
case OpAdd64:
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (Add64 (Const64 [c]) (Const64 [d]))
|
2015-07-19 15:48:20 -07:00
|
|
|
// cond:
|
2015-07-28 14:19:20 -07:00
|
|
|
// result: (Const64 [c+d])
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[0].Op != OpConst64 {
|
|
|
|
|
goto end8c46df6f85a11cb1d594076b0e467908
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-06-11 21:29:25 -07:00
|
|
|
c := v.Args[0].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConst64 {
|
|
|
|
|
goto end8c46df6f85a11cb1d594076b0e467908
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-06-11 21:29:25 -07:00
|
|
|
d := v.Args[1].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
v.Op = OpConst64
|
2015-07-19 15:48:20 -07:00
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = c + d
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end8c46df6f85a11cb1d594076b0e467908
|
|
|
|
|
end8c46df6f85a11cb1d594076b0e467908:
|
2015-07-19 15:48:20 -07:00
|
|
|
;
|
2015-07-22 13:46:15 -07:00
|
|
|
case OpAddPtr:
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (AddPtr (ConstPtr [c]) (ConstPtr [d]))
|
2015-07-22 13:46:15 -07:00
|
|
|
// cond:
|
2015-07-28 14:19:20 -07:00
|
|
|
// result: (ConstPtr [c+d])
|
2015-07-22 13:46:15 -07:00
|
|
|
{
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[0].Op != OpConstPtr {
|
|
|
|
|
goto end145c1aec793b2befff34bc8983b48a38
|
2015-07-22 13:46:15 -07:00
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConstPtr {
|
|
|
|
|
goto end145c1aec793b2befff34bc8983b48a38
|
2015-07-22 13:46:15 -07:00
|
|
|
}
|
|
|
|
|
d := v.Args[1].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
v.Op = OpConstPtr
|
2015-07-22 13:46:15 -07:00
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = c + d
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end145c1aec793b2befff34bc8983b48a38
|
|
|
|
|
end145c1aec793b2befff34bc8983b48a38:
|
2015-07-22 13:46:15 -07:00
|
|
|
;
|
2015-08-14 12:59:33 +02:00
|
|
|
case OpAnd16:
|
|
|
|
|
// match: (And16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end69ed6ee2a4fb0491b56c17f3c1926b10
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end69ed6ee2a4fb0491b56c17f3c1926b10
|
|
|
|
|
end69ed6ee2a4fb0491b56c17f3c1926b10:
|
|
|
|
|
;
|
|
|
|
|
case OpAnd32:
|
|
|
|
|
// match: (And32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endbbe8c3c5b2ca8f013aa178d856f3a99c
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endbbe8c3c5b2ca8f013aa178d856f3a99c
|
|
|
|
|
endbbe8c3c5b2ca8f013aa178d856f3a99c:
|
|
|
|
|
;
|
|
|
|
|
case OpAnd64:
|
|
|
|
|
// match: (And64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endc9736bf24d2e5cd8d662e1bcf3164640
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endc9736bf24d2e5cd8d662e1bcf3164640
|
|
|
|
|
endc9736bf24d2e5cd8d662e1bcf3164640:
|
|
|
|
|
;
|
|
|
|
|
case OpAnd8:
|
|
|
|
|
// match: (And8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endeaf127389bd0d4b0e0e297830f8f463b
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endeaf127389bd0d4b0e0e297830f8f463b
|
|
|
|
|
endeaf127389bd0d4b0e0e297830f8f463b:
|
|
|
|
|
;
|
2015-06-06 16:03:33 -07:00
|
|
|
case OpArrayIndex:
|
|
|
|
|
// match: (ArrayIndex (Load ptr mem) idx)
|
|
|
|
|
// cond:
|
2015-06-12 11:01:13 -07:00
|
|
|
// result: (Load (PtrIndex <v.Type.PtrTo()> ptr idx) mem)
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpLoad {
|
2015-06-12 11:01:13 -07:00
|
|
|
goto end4894dd7b58383fee5f8a92be08437c33
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
ptr := v.Args[0].Args[0]
|
|
|
|
|
mem := v.Args[0].Args[1]
|
|
|
|
|
idx := v.Args[1]
|
|
|
|
|
v.Op = OpLoad
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpPtrIndex, TypeInvalid)
|
2015-06-12 11:01:13 -07:00
|
|
|
v0.Type = v.Type.PtrTo()
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(ptr)
|
|
|
|
|
v0.AddArg(idx)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-06-12 11:01:13 -07:00
|
|
|
goto end4894dd7b58383fee5f8a92be08437c33
|
|
|
|
|
end4894dd7b58383fee5f8a92be08437c33:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-07-30 16:02:24 -04:00
|
|
|
case OpCom16:
|
|
|
|
|
// match: (Com16 (Com16 x))
|
|
|
|
|
// cond:
|
2015-08-05 10:33:09 -07:00
|
|
|
// result: x
|
2015-07-30 16:02:24 -04:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpCom16 {
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
|
2015-07-30 16:02:24 -04:00
|
|
|
}
|
|
|
|
|
x := v.Args[0].Args[0]
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = x.Type
|
2015-07-30 16:02:24 -04:00
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
|
|
|
|
|
end1ea17710dd4dd7ba4e710e0e4c7b5a56:
|
2015-07-30 16:02:24 -04:00
|
|
|
;
|
|
|
|
|
case OpCom32:
|
|
|
|
|
// match: (Com32 (Com32 x))
|
|
|
|
|
// cond:
|
2015-08-05 10:33:09 -07:00
|
|
|
// result: x
|
2015-07-30 16:02:24 -04:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpCom32 {
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end9a04ed536496e292c27bef4414128cbf
|
2015-07-30 16:02:24 -04:00
|
|
|
}
|
|
|
|
|
x := v.Args[0].Args[0]
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = x.Type
|
2015-07-30 16:02:24 -04:00
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end9a04ed536496e292c27bef4414128cbf
|
|
|
|
|
end9a04ed536496e292c27bef4414128cbf:
|
2015-07-30 16:02:24 -04:00
|
|
|
;
|
|
|
|
|
case OpCom64:
|
|
|
|
|
// match: (Com64 (Com64 x))
|
|
|
|
|
// cond:
|
2015-08-05 10:33:09 -07:00
|
|
|
// result: x
|
2015-07-30 16:02:24 -04:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpCom64 {
|
2015-08-05 10:33:09 -07:00
|
|
|
goto ended44e29d5968f0f7b86972b7bf417ab3
|
2015-07-30 16:02:24 -04:00
|
|
|
}
|
|
|
|
|
x := v.Args[0].Args[0]
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = x.Type
|
2015-07-30 16:02:24 -04:00
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-05 10:33:09 -07:00
|
|
|
goto ended44e29d5968f0f7b86972b7bf417ab3
|
|
|
|
|
ended44e29d5968f0f7b86972b7bf417ab3:
|
2015-07-30 16:02:24 -04:00
|
|
|
;
|
|
|
|
|
case OpCom8:
|
|
|
|
|
// match: (Com8 (Com8 x))
|
|
|
|
|
// cond:
|
2015-08-05 10:33:09 -07:00
|
|
|
// result: x
|
2015-07-30 16:02:24 -04:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpCom8 {
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end4d92ff3ba567d9afd38fc9ca113602ad
|
2015-07-30 16:02:24 -04:00
|
|
|
}
|
|
|
|
|
x := v.Args[0].Args[0]
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = x.Type
|
2015-07-30 16:02:24 -04:00
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-05 10:33:09 -07:00
|
|
|
goto end4d92ff3ba567d9afd38fc9ca113602ad
|
|
|
|
|
end4d92ff3ba567d9afd38fc9ca113602ad:
|
2015-07-30 16:02:24 -04:00
|
|
|
;
|
2015-07-28 14:19:20 -07:00
|
|
|
case OpConstString:
|
|
|
|
|
// match: (ConstString {s})
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (StringMake (Addr <config.Frontend().TypeBytePtr()> {config.fe.StringData(s.(string))} (SB <config.Frontend().TypeUintptr()>)) (ConstPtr <config.Frontend().TypeUintptr()> [int64(len(s.(string)))]))
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
s := v.Aux
|
|
|
|
|
v.Op = OpStringMake
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpAddr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeBytePtr()
|
2015-07-24 11:28:12 -07:00
|
|
|
v0.Aux = config.fe.StringData(s.(string))
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpSB, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(v1)
|
|
|
|
|
v.AddArg(v0)
|
2015-08-04 12:24:23 -07:00
|
|
|
v2 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v2.Type = config.Frontend().TypeUintptr()
|
2015-07-24 11:28:12 -07:00
|
|
|
v2.AuxInt = int64(len(s.(string)))
|
|
|
|
|
v.AddArg(v2)
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end68cc91679848c7c30bd8b0a8ed533843
|
|
|
|
|
end68cc91679848c7c30bd8b0a8ed533843:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-07-31 12:32:22 +02:00
|
|
|
case OpEq16:
|
|
|
|
|
// match: (Eq16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {true})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto enda503589f9b617e708a5ad3ddb047809f
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = true
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto enda503589f9b617e708a5ad3ddb047809f
|
|
|
|
|
enda503589f9b617e708a5ad3ddb047809f:
|
|
|
|
|
;
|
|
|
|
|
case OpEq32:
|
|
|
|
|
// match: (Eq32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {true})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endc94ae3b97d0090257b02152e437b3e17
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = true
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endc94ae3b97d0090257b02152e437b3e17
|
|
|
|
|
endc94ae3b97d0090257b02152e437b3e17:
|
|
|
|
|
;
|
|
|
|
|
case OpEq64:
|
|
|
|
|
// match: (Eq64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {true})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end4d21cead60174989467a9c8202dbb91d
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = true
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end4d21cead60174989467a9c8202dbb91d
|
|
|
|
|
end4d21cead60174989467a9c8202dbb91d:
|
|
|
|
|
;
|
|
|
|
|
case OpEq8:
|
|
|
|
|
// match: (Eq8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {true})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end73dce8bba164e4f4a1dd701bf8cfb362
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = true
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end73dce8bba164e4f4a1dd701bf8cfb362
|
|
|
|
|
end73dce8bba164e4f4a1dd701bf8cfb362:
|
|
|
|
|
;
|
2015-07-27 13:17:45 -07:00
|
|
|
case OpEqFat:
|
|
|
|
|
// match: (EqFat x y)
|
2015-07-28 14:19:20 -07:00
|
|
|
// cond: x.Op == OpConstNil && y.Op != OpConstNil
|
2015-07-27 13:17:45 -07:00
|
|
|
// result: (EqFat y x)
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
y := v.Args[1]
|
2015-07-28 14:19:20 -07:00
|
|
|
if !(x.Op == OpConstNil && y.Op != OpConstNil) {
|
|
|
|
|
goto endcea7f7399afcff860c54d82230a9a934
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpEqFat
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AddArg(y)
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto endcea7f7399afcff860c54d82230a9a934
|
|
|
|
|
endcea7f7399afcff860c54d82230a9a934:
|
2015-07-27 13:17:45 -07:00
|
|
|
;
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (EqFat (Load ptr mem) (ConstNil))
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (EqPtr (Load <config.Frontend().TypeUintptr()> ptr mem) (ConstPtr <config.Frontend().TypeUintptr()> [0]))
|
2015-07-27 13:17:45 -07:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpLoad {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end540dc8dfbc66adcd3db2d7e819c534f6
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
ptr := v.Args[0].Args[0]
|
|
|
|
|
mem := v.Args[0].Args[1]
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConstNil {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end540dc8dfbc66adcd3db2d7e819c534f6
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpEqPtr
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeUintptr()
|
2015-07-27 13:17:45 -07:00
|
|
|
v0.AddArg(ptr)
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
v.AddArg(v0)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-07-27 13:17:45 -07:00
|
|
|
v1.AuxInt = 0
|
|
|
|
|
v.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end540dc8dfbc66adcd3db2d7e819c534f6
|
|
|
|
|
end540dc8dfbc66adcd3db2d7e819c534f6:
|
2015-07-27 13:17:45 -07:00
|
|
|
;
|
2015-06-06 16:03:33 -07:00
|
|
|
case OpIsInBounds:
|
2015-08-12 13:48:36 -07:00
|
|
|
// match: (IsInBounds (Const32 [c]) (Const32 [d]))
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {inBounds32(c,d)})
|
|
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpConst32 {
|
|
|
|
|
goto endc3396bf88b56276e1691abe62811dba5
|
|
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
|
|
|
|
if v.Args[1].Op != OpConst32 {
|
|
|
|
|
goto endc3396bf88b56276e1691abe62811dba5
|
|
|
|
|
}
|
|
|
|
|
d := v.Args[1].AuxInt
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = inBounds32(c, d)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endc3396bf88b56276e1691abe62811dba5
|
|
|
|
|
endc3396bf88b56276e1691abe62811dba5:
|
|
|
|
|
;
|
|
|
|
|
// match: (IsInBounds (Const64 [c]) (Const64 [d]))
|
2015-06-06 16:03:33 -07:00
|
|
|
// cond:
|
2015-08-12 13:48:36 -07:00
|
|
|
// result: (ConstBool {inBounds64(c,d)})
|
|
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpConst64 {
|
|
|
|
|
goto end0b4b8178a54662835b00bfa503cf879a
|
|
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
|
|
|
|
if v.Args[1].Op != OpConst64 {
|
|
|
|
|
goto end0b4b8178a54662835b00bfa503cf879a
|
|
|
|
|
}
|
|
|
|
|
d := v.Args[1].AuxInt
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = inBounds64(c, d)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end0b4b8178a54662835b00bfa503cf879a
|
|
|
|
|
end0b4b8178a54662835b00bfa503cf879a:
|
|
|
|
|
;
|
|
|
|
|
// match: (IsInBounds (ConstPtr [c]) (ConstPtr [d]))
|
|
|
|
|
// cond: config.PtrSize == 4
|
|
|
|
|
// result: (ConstBool {inBounds32(c,d)})
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[0].Op != OpConstPtr {
|
2015-08-12 13:48:36 -07:00
|
|
|
goto end2c6938f68a67e08dbd96edb1e693e549
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-06-11 21:29:25 -07:00
|
|
|
c := v.Args[0].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConstPtr {
|
2015-08-12 13:48:36 -07:00
|
|
|
goto end2c6938f68a67e08dbd96edb1e693e549
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-06-11 21:29:25 -07:00
|
|
|
d := v.Args[1].AuxInt
|
2015-08-12 13:48:36 -07:00
|
|
|
if !(config.PtrSize == 4) {
|
|
|
|
|
goto end2c6938f68a67e08dbd96edb1e693e549
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = inBounds32(c, d)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end2c6938f68a67e08dbd96edb1e693e549
|
|
|
|
|
end2c6938f68a67e08dbd96edb1e693e549:
|
|
|
|
|
;
|
|
|
|
|
// match: (IsInBounds (ConstPtr [c]) (ConstPtr [d]))
|
|
|
|
|
// cond: config.PtrSize == 8
|
|
|
|
|
// result: (ConstBool {inBounds64(c,d)})
|
|
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpConstPtr {
|
|
|
|
|
goto end84d6ae817944985f572ecaac51999d6c
|
|
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
|
|
|
|
if v.Args[1].Op != OpConstPtr {
|
|
|
|
|
goto end84d6ae817944985f572ecaac51999d6c
|
|
|
|
|
}
|
|
|
|
|
d := v.Args[1].AuxInt
|
|
|
|
|
if !(config.PtrSize == 8) {
|
|
|
|
|
goto end84d6ae817944985f572ecaac51999d6c
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-12 13:48:36 -07:00
|
|
|
v.Aux = inBounds64(c, d)
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
2015-08-12 13:48:36 -07:00
|
|
|
goto end84d6ae817944985f572ecaac51999d6c
|
|
|
|
|
end84d6ae817944985f572ecaac51999d6c:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
|
|
|
|
case OpLoad:
|
|
|
|
|
// match: (Load <t> ptr mem)
|
|
|
|
|
// cond: t.IsString()
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (StringMake (Load <config.Frontend().TypeBytePtr()> ptr mem) (Load <config.Frontend().TypeUintptr()> (OffPtr <config.Frontend().TypeBytePtr()> [config.PtrSize] ptr) mem))
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
t := v.Type
|
|
|
|
|
ptr := v.Args[0]
|
|
|
|
|
mem := v.Args[1]
|
|
|
|
|
if !(t.IsString()) {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end18afa4a6fdd6d0b92ed292840898c8f6
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpStringMake
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeBytePtr()
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(ptr)
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
v.AddArg(v0)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-08-04 12:24:23 -07:00
|
|
|
v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v2.Type = config.Frontend().TypeBytePtr()
|
2015-07-19 15:48:20 -07:00
|
|
|
v2.AuxInt = config.PtrSize
|
2015-06-06 16:03:33 -07:00
|
|
|
v2.AddArg(ptr)
|
|
|
|
|
v1.AddArg(v2)
|
|
|
|
|
v1.AddArg(mem)
|
|
|
|
|
v.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end18afa4a6fdd6d0b92ed292840898c8f6
|
|
|
|
|
end18afa4a6fdd6d0b92ed292840898c8f6:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-07-22 13:46:15 -07:00
|
|
|
case OpMul64:
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (Mul64 (Const64 [c]) (Const64 [d]))
|
2015-07-22 13:46:15 -07:00
|
|
|
// cond:
|
2015-07-28 14:19:20 -07:00
|
|
|
// result: (Const64 [c*d])
|
2015-07-22 13:46:15 -07:00
|
|
|
{
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[0].Op != OpConst64 {
|
|
|
|
|
goto end7aea1048b5d1230974b97f17238380ae
|
2015-07-22 13:46:15 -07:00
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConst64 {
|
|
|
|
|
goto end7aea1048b5d1230974b97f17238380ae
|
2015-07-22 13:46:15 -07:00
|
|
|
}
|
|
|
|
|
d := v.Args[1].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
v.Op = OpConst64
|
2015-07-22 13:46:15 -07:00
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = c * d
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end7aea1048b5d1230974b97f17238380ae
|
|
|
|
|
end7aea1048b5d1230974b97f17238380ae:
|
2015-07-22 13:46:15 -07:00
|
|
|
;
|
|
|
|
|
case OpMulPtr:
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (MulPtr (ConstPtr [c]) (ConstPtr [d]))
|
2015-07-22 13:46:15 -07:00
|
|
|
// cond:
|
2015-07-28 14:19:20 -07:00
|
|
|
// result: (ConstPtr [c*d])
|
2015-07-22 13:46:15 -07:00
|
|
|
{
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[0].Op != OpConstPtr {
|
|
|
|
|
goto end808c190f346658bb1ad032bf37a1059f
|
2015-07-22 13:46:15 -07:00
|
|
|
}
|
|
|
|
|
c := v.Args[0].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConstPtr {
|
|
|
|
|
goto end808c190f346658bb1ad032bf37a1059f
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-07-22 13:46:15 -07:00
|
|
|
d := v.Args[1].AuxInt
|
2015-07-28 14:19:20 -07:00
|
|
|
v.Op = OpConstPtr
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = c * d
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end808c190f346658bb1ad032bf37a1059f
|
|
|
|
|
end808c190f346658bb1ad032bf37a1059f:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-07-31 12:32:22 +02:00
|
|
|
case OpNeq16:
|
|
|
|
|
// match: (Neq16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {false})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end192755dd3c2be992e9d3deb53794a8d2
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = false
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end192755dd3c2be992e9d3deb53794a8d2
|
|
|
|
|
end192755dd3c2be992e9d3deb53794a8d2:
|
|
|
|
|
;
|
|
|
|
|
case OpNeq32:
|
|
|
|
|
// match: (Neq32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {false})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endeb23619fc85950a8df7b31126252c4dd
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = false
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endeb23619fc85950a8df7b31126252c4dd
|
|
|
|
|
endeb23619fc85950a8df7b31126252c4dd:
|
|
|
|
|
;
|
|
|
|
|
case OpNeq64:
|
|
|
|
|
// match: (Neq64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {false})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endfc6eea780fb4056afb9e4287076da60c
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = false
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endfc6eea780fb4056afb9e4287076da60c
|
|
|
|
|
endfc6eea780fb4056afb9e4287076da60c:
|
|
|
|
|
;
|
|
|
|
|
case OpNeq8:
|
|
|
|
|
// match: (Neq8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (ConstBool {false})
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endcccf700d93c6d57765b80f92f7b3fa81
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConstBool
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Aux = false
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endcccf700d93c6d57765b80f92f7b3fa81
|
|
|
|
|
endcccf700d93c6d57765b80f92f7b3fa81:
|
|
|
|
|
;
|
2015-07-27 13:17:45 -07:00
|
|
|
case OpNeqFat:
|
|
|
|
|
// match: (NeqFat x y)
|
2015-07-28 14:19:20 -07:00
|
|
|
// cond: x.Op == OpConstNil && y.Op != OpConstNil
|
2015-07-27 13:17:45 -07:00
|
|
|
// result: (NeqFat y x)
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
y := v.Args[1]
|
2015-07-28 14:19:20 -07:00
|
|
|
if !(x.Op == OpConstNil && y.Op != OpConstNil) {
|
|
|
|
|
goto end94c68f7dc30c66ed42e507e01c4e5dc7
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpNeqFat
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AddArg(y)
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end94c68f7dc30c66ed42e507e01c4e5dc7
|
|
|
|
|
end94c68f7dc30c66ed42e507e01c4e5dc7:
|
2015-07-27 13:17:45 -07:00
|
|
|
;
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (NeqFat (Load ptr mem) (ConstNil))
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (NeqPtr (Load <config.Frontend().TypeUintptr()> ptr mem) (ConstPtr <config.Frontend().TypeUintptr()> [0]))
|
2015-07-27 13:17:45 -07:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpLoad {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end67d723bb0f39a5c897816abcf411e5cf
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
ptr := v.Args[0].Args[0]
|
|
|
|
|
mem := v.Args[0].Args[1]
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Args[1].Op != OpConstNil {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end67d723bb0f39a5c897816abcf411e5cf
|
2015-07-27 13:17:45 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpNeqPtr
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeUintptr()
|
2015-07-27 13:17:45 -07:00
|
|
|
v0.AddArg(ptr)
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
v.AddArg(v0)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-07-27 13:17:45 -07:00
|
|
|
v1.AuxInt = 0
|
|
|
|
|
v.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end67d723bb0f39a5c897816abcf411e5cf
|
|
|
|
|
end67d723bb0f39a5c897816abcf411e5cf:
|
2015-07-27 13:17:45 -07:00
|
|
|
;
|
2015-08-14 12:59:33 +02:00
|
|
|
case OpOr16:
|
|
|
|
|
// match: (Or16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end47a2f25fd31a76807aced3e2b126acdc
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end47a2f25fd31a76807aced3e2b126acdc
|
|
|
|
|
end47a2f25fd31a76807aced3e2b126acdc:
|
|
|
|
|
;
|
|
|
|
|
case OpOr32:
|
|
|
|
|
// match: (Or32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end231e283e568e90bd9a3e6a4fa328c8a4
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end231e283e568e90bd9a3e6a4fa328c8a4
|
|
|
|
|
end231e283e568e90bd9a3e6a4fa328c8a4:
|
|
|
|
|
;
|
|
|
|
|
case OpOr64:
|
|
|
|
|
// match: (Or64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end6b0efc212016dc97d0e3939db04c81d9
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end6b0efc212016dc97d0e3939db04c81d9
|
|
|
|
|
end6b0efc212016dc97d0e3939db04c81d9:
|
|
|
|
|
;
|
|
|
|
|
case OpOr8:
|
|
|
|
|
// match: (Or8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: x
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end05295dbfafd6869af79b4daee9fda000
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.Type = x.Type
|
|
|
|
|
v.AddArg(x)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end05295dbfafd6869af79b4daee9fda000
|
|
|
|
|
end05295dbfafd6869af79b4daee9fda000:
|
|
|
|
|
;
|
2015-06-06 16:03:33 -07:00
|
|
|
case OpPtrIndex:
|
|
|
|
|
// match: (PtrIndex <t> ptr idx)
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (AddPtr ptr (MulPtr <config.Frontend().TypeUintptr()> idx (ConstPtr <config.Frontend().TypeUintptr()> [t.Elem().Size()])))
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
t := v.Type
|
|
|
|
|
ptr := v.Args[0]
|
|
|
|
|
idx := v.Args[1]
|
2015-07-19 15:48:20 -07:00
|
|
|
v.Op = OpAddPtr
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AddArg(ptr)
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpMulPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeUintptr()
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(idx)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-06-11 21:29:25 -07:00
|
|
|
v1.AuxInt = t.Elem().Size()
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(v1)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto endf7546737f42c76a99699f241d41f491a
|
|
|
|
|
endf7546737f42c76a99699f241d41f491a:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
|
|
|
|
case OpSliceCap:
|
|
|
|
|
// match: (SliceCap (Load ptr mem))
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (Load (AddPtr <ptr.Type> ptr (ConstPtr <config.Frontend().TypeUintptr()> [config.PtrSize*2])) mem)
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpLoad {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end6696811bf6bd45e505d24c1a15c68e70
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
ptr := v.Args[0].Args[0]
|
|
|
|
|
mem := v.Args[0].Args[1]
|
|
|
|
|
v.Op = OpLoad
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpAddPtr, TypeInvalid)
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.Type = ptr.Type
|
|
|
|
|
v0.AddArg(ptr)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-07-19 15:48:20 -07:00
|
|
|
v1.AuxInt = config.PtrSize * 2
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(v1)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end6696811bf6bd45e505d24c1a15c68e70
|
|
|
|
|
end6696811bf6bd45e505d24c1a15c68e70:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
|
|
|
|
case OpSliceLen:
|
|
|
|
|
// match: (SliceLen (Load ptr mem))
|
|
|
|
|
// cond:
|
2015-07-30 11:03:05 -07:00
|
|
|
// result: (Load (AddPtr <ptr.Type> ptr (ConstPtr <config.Frontend().TypeUintptr()> [config.PtrSize])) mem)
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpLoad {
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end9844ce3e290e81355493141e653e37d5
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
ptr := v.Args[0].Args[0]
|
|
|
|
|
mem := v.Args[0].Args[1]
|
|
|
|
|
v.Op = OpLoad
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpAddPtr, TypeInvalid)
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.Type = ptr.Type
|
|
|
|
|
v0.AddArg(ptr)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpConstPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-07-19 15:48:20 -07:00
|
|
|
v1.AuxInt = config.PtrSize
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(v1)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-07-30 11:03:05 -07:00
|
|
|
goto end9844ce3e290e81355493141e653e37d5
|
|
|
|
|
end9844ce3e290e81355493141e653e37d5:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
|
|
|
|
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
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AddArg(ptr)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end459613b83f95b65729d45c2ed663a153
|
|
|
|
|
end459613b83f95b65729d45c2ed663a153:
|
|
|
|
|
;
|
|
|
|
|
case OpStore:
|
2015-08-14 21:47:20 -07:00
|
|
|
// match: (Store [size] dst (Load src mem) mem)
|
|
|
|
|
// cond: size > config.IntSize
|
|
|
|
|
// result: (Move [size] dst src mem)
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
2015-08-14 21:47:20 -07:00
|
|
|
size := v.AuxInt
|
2015-06-06 16:03:33 -07:00
|
|
|
dst := v.Args[0]
|
|
|
|
|
if v.Args[1].Op != OpLoad {
|
2015-08-14 21:47:20 -07:00
|
|
|
goto enda18a7163888e2f4fca9f38bae56cef42
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
src := v.Args[1].Args[0]
|
|
|
|
|
mem := v.Args[1].Args[1]
|
2015-07-31 12:32:22 +02:00
|
|
|
if v.Args[2] != mem {
|
2015-08-14 21:47:20 -07:00
|
|
|
goto enda18a7163888e2f4fca9f38bae56cef42
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-08-14 21:47:20 -07:00
|
|
|
if !(size > config.IntSize) {
|
|
|
|
|
goto enda18a7163888e2f4fca9f38bae56cef42
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpMove
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-14 21:47:20 -07:00
|
|
|
v.AuxInt = size
|
2015-06-06 16:03:33 -07:00
|
|
|
v.AddArg(dst)
|
|
|
|
|
v.AddArg(src)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-14 21:47:20 -07:00
|
|
|
goto enda18a7163888e2f4fca9f38bae56cef42
|
|
|
|
|
enda18a7163888e2f4fca9f38bae56cef42:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-08-18 10:28:58 -07:00
|
|
|
// match: (Store [2*config.PtrSize] dst str mem)
|
2015-06-06 16:03:33 -07:00
|
|
|
// cond: str.Type.IsString()
|
2015-08-18 10:28:58 -07:00
|
|
|
// result: (Store [config.PtrSize] (OffPtr <config.Frontend().TypeBytePtr()> [config.PtrSize] dst) (StringLen <config.Frontend().TypeUintptr()> str) (Store [config.PtrSize] <TypeMem> dst (StringPtr <config.Frontend().TypeBytePtr()> str) mem))
|
2015-06-06 16:03:33 -07:00
|
|
|
{
|
2015-08-18 10:28:58 -07:00
|
|
|
if v.AuxInt != 2*config.PtrSize {
|
|
|
|
|
goto end6942df62f9cb570a99ab97a5aeebfd2d
|
|
|
|
|
}
|
2015-06-06 16:03:33 -07:00
|
|
|
dst := v.Args[0]
|
|
|
|
|
str := v.Args[1]
|
|
|
|
|
mem := v.Args[2]
|
|
|
|
|
if !(str.Type.IsString()) {
|
2015-08-18 10:28:58 -07:00
|
|
|
goto end6942df62f9cb570a99ab97a5aeebfd2d
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
v.Op = OpStore
|
2015-06-11 21:29:25 -07:00
|
|
|
v.AuxInt = 0
|
2015-06-06 16:03:33 -07:00
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
2015-08-18 10:28:58 -07:00
|
|
|
v.AuxInt = config.PtrSize
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v0.Type = config.Frontend().TypeBytePtr()
|
2015-07-19 15:48:20 -07:00
|
|
|
v0.AuxInt = config.PtrSize
|
2015-06-06 16:03:33 -07:00
|
|
|
v0.AddArg(dst)
|
|
|
|
|
v.AddArg(v0)
|
2015-08-04 12:24:23 -07:00
|
|
|
v1 := b.NewValue0(v.Line, OpStringLen, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v1.Type = config.Frontend().TypeUintptr()
|
2015-06-06 16:03:33 -07:00
|
|
|
v1.AddArg(str)
|
|
|
|
|
v.AddArg(v1)
|
2015-08-04 12:24:23 -07:00
|
|
|
v2 := b.NewValue0(v.Line, OpStore, TypeInvalid)
|
2015-08-18 10:28:58 -07:00
|
|
|
v2.AuxInt = config.PtrSize
|
2015-06-06 16:03:33 -07:00
|
|
|
v2.Type = TypeMem
|
|
|
|
|
v2.AddArg(dst)
|
2015-08-04 12:24:23 -07:00
|
|
|
v3 := b.NewValue0(v.Line, OpStringPtr, TypeInvalid)
|
2015-07-30 11:03:05 -07:00
|
|
|
v3.Type = config.Frontend().TypeBytePtr()
|
2015-06-06 16:03:33 -07:00
|
|
|
v3.AddArg(str)
|
|
|
|
|
v2.AddArg(v3)
|
|
|
|
|
v2.AddArg(mem)
|
|
|
|
|
v.AddArg(v2)
|
|
|
|
|
return true
|
|
|
|
|
}
|
2015-08-18 10:28:58 -07:00
|
|
|
goto end6942df62f9cb570a99ab97a5aeebfd2d
|
|
|
|
|
end6942df62f9cb570a99ab97a5aeebfd2d:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
|
|
|
|
case OpStringLen:
|
|
|
|
|
// match: (StringLen (StringMake _ len))
|
|
|
|
|
// cond:
|
|
|
|
|
// result: len
|
|
|
|
|
{
|
|
|
|
|
if v.Args[0].Op != OpStringMake {
|
|
|
|
|
goto end0d922460b7e5ca88324034f4bd6c027c
|
|
|
|
|
}
|
|
|
|
|
len := v.Args[0].Args[1]
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
2015-06-06 16:03:33 -07:00
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = len.Type
|
|
|
|
|
v.AddArg(len)
|
2015-06-06 16:03:33 -07:00
|
|
|
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]
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Op = OpCopy
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
2015-06-06 16:03:33 -07:00
|
|
|
v.resetArgs()
|
2015-08-05 10:33:09 -07:00
|
|
|
v.Type = ptr.Type
|
|
|
|
|
v.AddArg(ptr)
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end061edc5d85c73ad909089af2556d9380
|
|
|
|
|
end061edc5d85c73ad909089af2556d9380:
|
2015-07-15 21:33:49 -07:00
|
|
|
;
|
|
|
|
|
case OpStructSelect:
|
|
|
|
|
// match: (StructSelect [idx] (Load ptr mem))
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Load (OffPtr <v.Type.PtrTo()> [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()
|
2015-08-04 12:24:23 -07:00
|
|
|
v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
|
2015-07-15 21:33:49 -07:00
|
|
|
v0.Type = v.Type.PtrTo()
|
|
|
|
|
v0.AuxInt = idx
|
|
|
|
|
v0.AddArg(ptr)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
v.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end16fdb45e1dd08feb36e3cc3fb5ed8935
|
|
|
|
|
end16fdb45e1dd08feb36e3cc3fb5ed8935:
|
2015-08-14 12:59:33 +02:00
|
|
|
;
|
|
|
|
|
case OpSub16:
|
|
|
|
|
// match: (Sub16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const16 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end83da541391be564f2a08464e674a49e7
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst16
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end83da541391be564f2a08464e674a49e7
|
|
|
|
|
end83da541391be564f2a08464e674a49e7:
|
|
|
|
|
;
|
|
|
|
|
case OpSub32:
|
|
|
|
|
// match: (Sub32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const32 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto enda747581e798f199e07f4ad69747cd069
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst32
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto enda747581e798f199e07f4ad69747cd069
|
|
|
|
|
enda747581e798f199e07f4ad69747cd069:
|
|
|
|
|
;
|
|
|
|
|
case OpSub64:
|
|
|
|
|
// match: (Sub64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const64 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end0387dc2b7bbe57d4aa54eab5d959da4b
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst64
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end0387dc2b7bbe57d4aa54eab5d959da4b
|
|
|
|
|
end0387dc2b7bbe57d4aa54eab5d959da4b:
|
|
|
|
|
;
|
|
|
|
|
case OpSub8:
|
|
|
|
|
// match: (Sub8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const8 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end4e2ee15ef17611919a1a6b5f80bbfe18
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst8
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end4e2ee15ef17611919a1a6b5f80bbfe18
|
|
|
|
|
end4e2ee15ef17611919a1a6b5f80bbfe18:
|
|
|
|
|
;
|
|
|
|
|
case OpXor16:
|
|
|
|
|
// match: (Xor16 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const16 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end5733ceb1903b8140248d8e2cac02fefe
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst16
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end5733ceb1903b8140248d8e2cac02fefe
|
|
|
|
|
end5733ceb1903b8140248d8e2cac02fefe:
|
|
|
|
|
;
|
|
|
|
|
case OpXor32:
|
|
|
|
|
// match: (Xor32 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const32 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end268ca02df6515d648e0bfb4e90981d25
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst32
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end268ca02df6515d648e0bfb4e90981d25
|
|
|
|
|
end268ca02df6515d648e0bfb4e90981d25:
|
|
|
|
|
;
|
|
|
|
|
case OpXor64:
|
|
|
|
|
// match: (Xor64 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const64 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto endaf44e7f9fc58af30df69070953fb45ce
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst64
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endaf44e7f9fc58af30df69070953fb45ce
|
|
|
|
|
endaf44e7f9fc58af30df69070953fb45ce:
|
|
|
|
|
;
|
|
|
|
|
case OpXor8:
|
|
|
|
|
// match: (Xor8 x x)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Const8 [0])
|
|
|
|
|
{
|
|
|
|
|
x := v.Args[0]
|
|
|
|
|
if v.Args[1] != x {
|
|
|
|
|
goto end949b3a60b7d181688e6f79f93c782fc8
|
|
|
|
|
}
|
|
|
|
|
v.Op = OpConst8
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
v.Aux = nil
|
|
|
|
|
v.resetArgs()
|
|
|
|
|
v.AuxInt = 0
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end949b3a60b7d181688e6f79f93c782fc8
|
|
|
|
|
end949b3a60b7d181688e6f79f93c782fc8:
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteBlockgeneric(b *Block) bool {
|
|
|
|
|
switch b.Kind {
|
|
|
|
|
case BlockIf:
|
2015-08-12 11:22:16 -07:00
|
|
|
// match: (If (IsNonNil (GetG)) yes no)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (Plain nil yes)
|
|
|
|
|
{
|
|
|
|
|
v := b.Control
|
|
|
|
|
if v.Op != OpIsNonNil {
|
|
|
|
|
goto end0f2bb0111a86be0436b44210dbd83a90
|
|
|
|
|
}
|
|
|
|
|
if v.Args[0].Op != OpGetG {
|
|
|
|
|
goto end0f2bb0111a86be0436b44210dbd83a90
|
|
|
|
|
}
|
|
|
|
|
yes := b.Succs[0]
|
|
|
|
|
no := b.Succs[1]
|
|
|
|
|
b.Func.removePredecessor(b, no)
|
|
|
|
|
b.Kind = BlockPlain
|
|
|
|
|
b.Control = nil
|
|
|
|
|
b.Succs = b.Succs[:1]
|
|
|
|
|
b.Succs[0] = yes
|
|
|
|
|
b.Likely = BranchUnknown
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto end0f2bb0111a86be0436b44210dbd83a90
|
|
|
|
|
end0f2bb0111a86be0436b44210dbd83a90:
|
|
|
|
|
;
|
2015-07-23 18:44:09 -05:00
|
|
|
// match: (If (Not cond) yes no)
|
|
|
|
|
// cond:
|
|
|
|
|
// result: (If cond no yes)
|
|
|
|
|
{
|
|
|
|
|
v := b.Control
|
|
|
|
|
if v.Op != OpNot {
|
|
|
|
|
goto endebe19c1c3c3bec068cdb2dd29ef57f96
|
|
|
|
|
}
|
|
|
|
|
cond := v.Args[0]
|
|
|
|
|
yes := b.Succs[0]
|
|
|
|
|
no := b.Succs[1]
|
|
|
|
|
b.Kind = BlockIf
|
|
|
|
|
b.Control = cond
|
|
|
|
|
b.Succs[0] = no
|
|
|
|
|
b.Succs[1] = yes
|
2015-08-11 17:28:56 -07:00
|
|
|
b.Likely *= -1
|
2015-07-23 18:44:09 -05:00
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
goto endebe19c1c3c3bec068cdb2dd29ef57f96
|
|
|
|
|
endebe19c1c3c3bec068cdb2dd29ef57f96:
|
|
|
|
|
;
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (If (ConstBool {c}) yes no)
|
2015-06-06 16:03:33 -07:00
|
|
|
// cond: c.(bool)
|
|
|
|
|
// result: (Plain nil yes)
|
|
|
|
|
{
|
|
|
|
|
v := b.Control
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Op != OpConstBool {
|
|
|
|
|
goto end9ff0273f9b1657f4afc287562ca889f0
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
c := v.Aux
|
|
|
|
|
yes := b.Succs[0]
|
|
|
|
|
no := b.Succs[1]
|
|
|
|
|
if !(c.(bool)) {
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end9ff0273f9b1657f4afc287562ca889f0
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-08-04 12:24:23 -07:00
|
|
|
b.Func.removePredecessor(b, no)
|
2015-06-06 16:03:33 -07:00
|
|
|
b.Kind = BlockPlain
|
|
|
|
|
b.Control = nil
|
|
|
|
|
b.Succs = b.Succs[:1]
|
|
|
|
|
b.Succs[0] = yes
|
2015-08-11 17:28:56 -07:00
|
|
|
b.Likely = BranchUnknown
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto end9ff0273f9b1657f4afc287562ca889f0
|
|
|
|
|
end9ff0273f9b1657f4afc287562ca889f0:
|
2015-06-06 16:03:33 -07:00
|
|
|
;
|
2015-07-28 14:19:20 -07:00
|
|
|
// match: (If (ConstBool {c}) yes no)
|
2015-06-06 16:03:33 -07:00
|
|
|
// cond: !c.(bool)
|
|
|
|
|
// result: (Plain nil no)
|
|
|
|
|
{
|
|
|
|
|
v := b.Control
|
2015-07-28 14:19:20 -07:00
|
|
|
if v.Op != OpConstBool {
|
|
|
|
|
goto endf401a4553c3c7c6bed64801da7bba076
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
c := v.Aux
|
|
|
|
|
yes := b.Succs[0]
|
|
|
|
|
no := b.Succs[1]
|
|
|
|
|
if !(!c.(bool)) {
|
2015-07-28 14:19:20 -07:00
|
|
|
goto endf401a4553c3c7c6bed64801da7bba076
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
2015-08-04 12:24:23 -07:00
|
|
|
b.Func.removePredecessor(b, yes)
|
2015-06-06 16:03:33 -07:00
|
|
|
b.Kind = BlockPlain
|
|
|
|
|
b.Control = nil
|
|
|
|
|
b.Succs = b.Succs[:1]
|
|
|
|
|
b.Succs[0] = no
|
2015-08-11 17:28:56 -07:00
|
|
|
b.Likely = BranchUnknown
|
2015-06-06 16:03:33 -07:00
|
|
|
return true
|
|
|
|
|
}
|
2015-07-28 14:19:20 -07:00
|
|
|
goto endf401a4553c3c7c6bed64801da7bba076
|
|
|
|
|
endf401a4553c3c7c6bed64801da7bba076:
|
2015-06-06 16:03:33 -07:00
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|