blob: ef891c37d9dbeff6c375ff095184ed70919155aa [file] [log] [blame]
// autogenerated from rulegen/lower_amd64.rules: do not edit!
// generated with: go run rulegen/rulegen.go rulegen/lower_amd64.rules lowerAmd64 lowerAmd64.go
package ssa
func lowerAmd64(v *Value) bool {
switch v.Op {
case OpADDCQ:
// match: (ADDCQ [c] (LEAQ8 [d] x y))
// cond:
// result: (LEAQ8 [c.(int64)+d.(int64)] x y)
{
c := v.Aux
if v.Args[0].Op != OpLEAQ8 {
goto end16348939e556e99e8447227ecb986f01
}
d := v.Args[0].Aux
x := v.Args[0].Args[0]
y := v.Args[0].Args[1]
v.Op = OpLEAQ8
v.Aux = nil
v.resetArgs()
v.Aux = c.(int64) + d.(int64)
v.AddArg(x)
v.AddArg(y)
return true
}
goto end16348939e556e99e8447227ecb986f01
end16348939e556e99e8447227ecb986f01:
;
// match: (ADDCQ [off1] (FPAddr [off2]))
// cond:
// result: (FPAddr [off1.(int64)+off2.(int64)])
{
off1 := v.Aux
if v.Args[0].Op != OpFPAddr {
goto end28e093ab0618066e6b2609db7aaf309b
}
off2 := v.Args[0].Aux
v.Op = OpFPAddr
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
return true
}
goto end28e093ab0618066e6b2609db7aaf309b
end28e093ab0618066e6b2609db7aaf309b:
;
// match: (ADDCQ [off1] (SPAddr [off2]))
// cond:
// result: (SPAddr [off1.(int64)+off2.(int64)])
{
off1 := v.Aux
if v.Args[0].Op != OpSPAddr {
goto endd0c27c62d150b88168075c5ba113d1fa
}
off2 := v.Args[0].Aux
v.Op = OpSPAddr
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
return true
}
goto endd0c27c62d150b88168075c5ba113d1fa
endd0c27c62d150b88168075c5ba113d1fa:
;
case OpADDQ:
// match: (ADDQ x (Const [c]))
// cond:
// result: (ADDCQ [c] x)
{
x := v.Args[0]
if v.Args[1].Op != OpConst {
goto endef6908cfdf56e102cc327a3ddc14393d
}
c := v.Args[1].Aux
v.Op = OpADDCQ
v.Aux = nil
v.resetArgs()
v.Aux = c
v.AddArg(x)
return true
}
goto endef6908cfdf56e102cc327a3ddc14393d
endef6908cfdf56e102cc327a3ddc14393d:
;
// match: (ADDQ (Const [c]) x)
// cond:
// result: (ADDCQ [c] x)
{
if v.Args[0].Op != OpConst {
goto endb54a32cf3147f424f08b46db62c69b23
}
c := v.Args[0].Aux
x := v.Args[1]
v.Op = OpADDCQ
v.Aux = nil
v.resetArgs()
v.Aux = c
v.AddArg(x)
return true
}
goto endb54a32cf3147f424f08b46db62c69b23
endb54a32cf3147f424f08b46db62c69b23:
;
// match: (ADDQ x (SHLCQ [shift] y))
// cond: shift.(int64) == 3
// result: (LEAQ8 [int64(0)] x y)
{
x := v.Args[0]
if v.Args[1].Op != OpSHLCQ {
goto end7fa0d837edd248748cef516853fd9475
}
shift := v.Args[1].Aux
y := v.Args[1].Args[0]
if !(shift.(int64) == 3) {
goto end7fa0d837edd248748cef516853fd9475
}
v.Op = OpLEAQ8
v.Aux = nil
v.resetArgs()
v.Aux = int64(0)
v.AddArg(x)
v.AddArg(y)
return true
}
goto end7fa0d837edd248748cef516853fd9475
end7fa0d837edd248748cef516853fd9475:
;
case OpAdd:
// match: (Add <t> x y)
// cond: (is64BitInt(t) || isPtr(t))
// result: (ADDQ x y)
{
t := v.Type
x := v.Args[0]
y := v.Args[1]
if !(is64BitInt(t) || isPtr(t)) {
goto endf031c523d7dd08e4b8e7010a94cd94c9
}
v.Op = OpADDQ
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.AddArg(y)
return true
}
goto endf031c523d7dd08e4b8e7010a94cd94c9
endf031c523d7dd08e4b8e7010a94cd94c9:
;
// match: (Add <t> x y)
// cond: is32BitInt(t)
// result: (ADDL x y)
{
t := v.Type
x := v.Args[0]
y := v.Args[1]
if !(is32BitInt(t)) {
goto end35a02a1587264e40cf1055856ff8445a
}
v.Op = OpADDL
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.AddArg(y)
return true
}
goto end35a02a1587264e40cf1055856ff8445a
end35a02a1587264e40cf1055856ff8445a:
;
case OpCMPQ:
// match: (CMPQ x (Const [c]))
// cond:
// result: (CMPCQ x [c])
{
x := v.Args[0]
if v.Args[1].Op != OpConst {
goto end1770a40e4253d9f669559a360514613e
}
c := v.Args[1].Aux
v.Op = OpCMPCQ
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.Aux = c
return true
}
goto end1770a40e4253d9f669559a360514613e
end1770a40e4253d9f669559a360514613e:
;
// match: (CMPQ (Const [c]) x)
// cond:
// result: (InvertFlags (CMPCQ <TypeFlags> x [c]))
{
if v.Args[0].Op != OpConst {
goto enda4e64c7eaeda16c1c0db9dac409cd126
}
c := v.Args[0].Aux
x := v.Args[1]
v.Op = OpInvertFlags
v.Aux = nil
v.resetArgs()
v0 := v.Block.NewValue(OpCMPCQ, TypeInvalid, nil)
v0.Type = TypeFlags
v0.AddArg(x)
v0.Aux = c
v.AddArg(v0)
return true
}
goto enda4e64c7eaeda16c1c0db9dac409cd126
enda4e64c7eaeda16c1c0db9dac409cd126:
;
case OpIsInBounds:
// match: (IsInBounds idx len)
// cond:
// result: (SETB (CMPQ <TypeFlags> idx len))
{
idx := v.Args[0]
len := v.Args[1]
v.Op = OpSETB
v.Aux = nil
v.resetArgs()
v0 := v.Block.NewValue(OpCMPQ, TypeInvalid, nil)
v0.Type = TypeFlags
v0.AddArg(idx)
v0.AddArg(len)
v.AddArg(v0)
return true
}
goto endb51d371171154c0f1613b687757e0576
endb51d371171154c0f1613b687757e0576:
;
case OpIsNonNil:
// match: (IsNonNil p)
// cond:
// result: (SETNE (TESTQ <TypeFlags> p p))
{
p := v.Args[0]
v.Op = OpSETNE
v.Aux = nil
v.resetArgs()
v0 := v.Block.NewValue(OpTESTQ, TypeInvalid, nil)
v0.Type = TypeFlags
v0.AddArg(p)
v0.AddArg(p)
v.AddArg(v0)
return true
}
goto endff508c3726edfb573abc6128c177e76c
endff508c3726edfb573abc6128c177e76c:
;
case OpLess:
// match: (Less x y)
// cond: is64BitInt(v.Args[0].Type) && isSigned(v.Args[0].Type)
// result: (SETL (CMPQ <TypeFlags> x y))
{
x := v.Args[0]
y := v.Args[1]
if !(is64BitInt(v.Args[0].Type) && isSigned(v.Args[0].Type)) {
goto endcecf13a952d4c6c2383561c7d68a3cf9
}
v.Op = OpSETL
v.Aux = nil
v.resetArgs()
v0 := v.Block.NewValue(OpCMPQ, TypeInvalid, nil)
v0.Type = TypeFlags
v0.AddArg(x)
v0.AddArg(y)
v.AddArg(v0)
return true
}
goto endcecf13a952d4c6c2383561c7d68a3cf9
endcecf13a952d4c6c2383561c7d68a3cf9:
;
case OpLoad:
// match: (Load <t> ptr mem)
// cond: (is64BitInt(t) || isPtr(t))
// result: (MOVQload [int64(0)] ptr mem)
{
t := v.Type
ptr := v.Args[0]
mem := v.Args[1]
if !(is64BitInt(t) || isPtr(t)) {
goto end581ce5a20901df1b8143448ba031685b
}
v.Op = OpMOVQload
v.Aux = nil
v.resetArgs()
v.Aux = int64(0)
v.AddArg(ptr)
v.AddArg(mem)
return true
}
goto end581ce5a20901df1b8143448ba031685b
end581ce5a20901df1b8143448ba031685b:
;
case OpMOVQload:
// match: (MOVQload [off1] (FPAddr [off2]) mem)
// cond:
// result: (MOVQloadFP [off1.(int64)+off2.(int64)] mem)
{
off1 := v.Aux
if v.Args[0].Op != OpFPAddr {
goto endce972b1aa84b56447978c43def87fa57
}
off2 := v.Args[0].Aux
mem := v.Args[1]
v.Op = OpMOVQloadFP
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(mem)
return true
}
goto endce972b1aa84b56447978c43def87fa57
endce972b1aa84b56447978c43def87fa57:
;
// match: (MOVQload [off1] (SPAddr [off2]) mem)
// cond:
// result: (MOVQloadSP [off1.(int64)+off2.(int64)] mem)
{
off1 := v.Aux
if v.Args[0].Op != OpSPAddr {
goto end3d8628a6536350a123be81240b8a1376
}
off2 := v.Args[0].Aux
mem := v.Args[1]
v.Op = OpMOVQloadSP
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(mem)
return true
}
goto end3d8628a6536350a123be81240b8a1376
end3d8628a6536350a123be81240b8a1376:
;
// match: (MOVQload [off] (Global [sym]) mem)
// cond:
// result: (MOVQloadglobal [GlobalOffset{sym,off.(int64)}] mem)
{
off := v.Aux
if v.Args[0].Op != OpGlobal {
goto end20693899317f3f8d1b47fefa64087654
}
sym := v.Args[0].Aux
mem := v.Args[1]
v.Op = OpMOVQloadglobal
v.Aux = nil
v.resetArgs()
v.Aux = GlobalOffset{sym, off.(int64)}
v.AddArg(mem)
return true
}
goto end20693899317f3f8d1b47fefa64087654
end20693899317f3f8d1b47fefa64087654:
;
// match: (MOVQload [off1] (ADDCQ [off2] ptr) mem)
// cond:
// result: (MOVQload [off1.(int64)+off2.(int64)] ptr mem)
{
off1 := v.Aux
if v.Args[0].Op != OpADDCQ {
goto enda68a39292ba2a05b3436191cb0bb0516
}
off2 := v.Args[0].Aux
ptr := v.Args[0].Args[0]
mem := v.Args[1]
v.Op = OpMOVQload
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(ptr)
v.AddArg(mem)
return true
}
goto enda68a39292ba2a05b3436191cb0bb0516
enda68a39292ba2a05b3436191cb0bb0516:
;
// match: (MOVQload [off1] (LEAQ8 [off2] ptr idx) mem)
// cond:
// result: (MOVQloadidx8 [off1.(int64)+off2.(int64)] ptr idx mem)
{
off1 := v.Aux
if v.Args[0].Op != OpLEAQ8 {
goto endba0e5cee85021614041016b1a2709ab8
}
off2 := v.Args[0].Aux
ptr := v.Args[0].Args[0]
idx := v.Args[0].Args[1]
mem := v.Args[1]
v.Op = OpMOVQloadidx8
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(ptr)
v.AddArg(idx)
v.AddArg(mem)
return true
}
goto endba0e5cee85021614041016b1a2709ab8
endba0e5cee85021614041016b1a2709ab8:
;
case OpMOVQstore:
// match: (MOVQstore [off1] (FPAddr [off2]) val mem)
// cond:
// result: (MOVQstoreFP [off1.(int64)+off2.(int64)] val mem)
{
off1 := v.Aux
if v.Args[0].Op != OpFPAddr {
goto end0a2a81a20558dfc93790aecb1e9cc81a
}
off2 := v.Args[0].Aux
val := v.Args[1]
mem := v.Args[2]
v.Op = OpMOVQstoreFP
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end0a2a81a20558dfc93790aecb1e9cc81a
end0a2a81a20558dfc93790aecb1e9cc81a:
;
// match: (MOVQstore [off1] (SPAddr [off2]) val mem)
// cond:
// result: (MOVQstoreSP [off1.(int64)+off2.(int64)] val mem)
{
off1 := v.Aux
if v.Args[0].Op != OpSPAddr {
goto end1cb5b7e766f018270fa434c6f46f607f
}
off2 := v.Args[0].Aux
val := v.Args[1]
mem := v.Args[2]
v.Op = OpMOVQstoreSP
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end1cb5b7e766f018270fa434c6f46f607f
end1cb5b7e766f018270fa434c6f46f607f:
;
// match: (MOVQstore [off] (Global [sym]) val mem)
// cond:
// result: (MOVQstoreglobal [GlobalOffset{sym,off.(int64)}] val mem)
{
off := v.Aux
if v.Args[0].Op != OpGlobal {
goto end657d07e37c720a8fbb108a31bb48090d
}
sym := v.Args[0].Aux
val := v.Args[1]
mem := v.Args[2]
v.Op = OpMOVQstoreglobal
v.Aux = nil
v.resetArgs()
v.Aux = GlobalOffset{sym, off.(int64)}
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end657d07e37c720a8fbb108a31bb48090d
end657d07e37c720a8fbb108a31bb48090d:
;
// match: (MOVQstore [off1] (ADDCQ [off2] ptr) val mem)
// cond:
// result: (MOVQstore [off1.(int64)+off2.(int64)] ptr val mem)
{
off1 := v.Aux
if v.Args[0].Op != OpADDCQ {
goto end271e3052de832e22b1f07576af2854de
}
off2 := v.Args[0].Aux
ptr := v.Args[0].Args[0]
val := v.Args[1]
mem := v.Args[2]
v.Op = OpMOVQstore
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(ptr)
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end271e3052de832e22b1f07576af2854de
end271e3052de832e22b1f07576af2854de:
;
// match: (MOVQstore [off1] (LEAQ8 [off2] ptr idx) val mem)
// cond:
// result: (MOVQstoreidx8 [off1.(int64)+off2.(int64)] ptr idx val mem)
{
off1 := v.Aux
if v.Args[0].Op != OpLEAQ8 {
goto end4ad469f534c7369f6ac36bdace3462ad
}
off2 := v.Args[0].Aux
ptr := v.Args[0].Args[0]
idx := v.Args[0].Args[1]
val := v.Args[1]
mem := v.Args[2]
v.Op = OpMOVQstoreidx8
v.Aux = nil
v.resetArgs()
v.Aux = off1.(int64) + off2.(int64)
v.AddArg(ptr)
v.AddArg(idx)
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end4ad469f534c7369f6ac36bdace3462ad
end4ad469f534c7369f6ac36bdace3462ad:
;
case OpMULCQ:
// match: (MULCQ [c] x)
// cond: c.(int64) == 8
// result: (SHLCQ [int64(3)] x)
{
c := v.Aux
x := v.Args[0]
if !(c.(int64) == 8) {
goto end90a1c055d9658aecacce5e101c1848b4
}
v.Op = OpSHLCQ
v.Aux = nil
v.resetArgs()
v.Aux = int64(3)
v.AddArg(x)
return true
}
goto end90a1c055d9658aecacce5e101c1848b4
end90a1c055d9658aecacce5e101c1848b4:
;
case OpMULQ:
// match: (MULQ x (Const [c]))
// cond:
// result: (MULCQ [c] x)
{
x := v.Args[0]
if v.Args[1].Op != OpConst {
goto endc427f4838d2e83c00cc097b20bd20a37
}
c := v.Args[1].Aux
v.Op = OpMULCQ
v.Aux = nil
v.resetArgs()
v.Aux = c
v.AddArg(x)
return true
}
goto endc427f4838d2e83c00cc097b20bd20a37
endc427f4838d2e83c00cc097b20bd20a37:
;
// match: (MULQ (Const [c]) x)
// cond:
// result: (MULCQ [c] x)
{
if v.Args[0].Op != OpConst {
goto endd70de938e71150d1c9e8173c2a5b2d95
}
c := v.Args[0].Aux
x := v.Args[1]
v.Op = OpMULCQ
v.Aux = nil
v.resetArgs()
v.Aux = c
v.AddArg(x)
return true
}
goto endd70de938e71150d1c9e8173c2a5b2d95
endd70de938e71150d1c9e8173c2a5b2d95:
;
case OpMul:
// match: (Mul <t> x y)
// cond: is64BitInt(t)
// result: (MULQ x y)
{
t := v.Type
x := v.Args[0]
y := v.Args[1]
if !(is64BitInt(t)) {
goto endfab0d598f376ecba45a22587d50f7aff
}
v.Op = OpMULQ
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.AddArg(y)
return true
}
goto endfab0d598f376ecba45a22587d50f7aff
endfab0d598f376ecba45a22587d50f7aff:
;
case OpSETL:
// match: (SETL (InvertFlags x))
// cond:
// result: (SETGE x)
{
if v.Args[0].Op != OpInvertFlags {
goto end456c7681d48305698c1ef462d244bdc6
}
x := v.Args[0].Args[0]
v.Op = OpSETGE
v.Aux = nil
v.resetArgs()
v.AddArg(x)
return true
}
goto end456c7681d48305698c1ef462d244bdc6
end456c7681d48305698c1ef462d244bdc6:
;
case OpSUBQ:
// match: (SUBQ x (Const [c]))
// cond:
// result: (SUBCQ x [c])
{
x := v.Args[0]
if v.Args[1].Op != OpConst {
goto endb31e242f283867de4722665a5796008c
}
c := v.Args[1].Aux
v.Op = OpSUBCQ
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.Aux = c
return true
}
goto endb31e242f283867de4722665a5796008c
endb31e242f283867de4722665a5796008c:
;
// match: (SUBQ <t> (Const [c]) x)
// cond:
// result: (NEGQ (SUBCQ <t> x [c]))
{
t := v.Type
if v.Args[0].Op != OpConst {
goto end569cc755877d1f89a701378bec05c08d
}
c := v.Args[0].Aux
x := v.Args[1]
v.Op = OpNEGQ
v.Aux = nil
v.resetArgs()
v0 := v.Block.NewValue(OpSUBCQ, TypeInvalid, nil)
v0.Type = t
v0.AddArg(x)
v0.Aux = c
v.AddArg(v0)
return true
}
goto end569cc755877d1f89a701378bec05c08d
end569cc755877d1f89a701378bec05c08d:
;
case OpStore:
// match: (Store ptr val mem)
// cond: (is64BitInt(val.Type) || isPtr(val.Type))
// result: (MOVQstore [int64(0)] ptr val mem)
{
ptr := v.Args[0]
val := v.Args[1]
mem := v.Args[2]
if !(is64BitInt(val.Type) || isPtr(val.Type)) {
goto end9680b43f504bc06f9fab000823ce471a
}
v.Op = OpMOVQstore
v.Aux = nil
v.resetArgs()
v.Aux = int64(0)
v.AddArg(ptr)
v.AddArg(val)
v.AddArg(mem)
return true
}
goto end9680b43f504bc06f9fab000823ce471a
end9680b43f504bc06f9fab000823ce471a:
;
case OpSub:
// match: (Sub <t> x y)
// cond: is64BitInt(t)
// result: (SUBQ x y)
{
t := v.Type
x := v.Args[0]
y := v.Args[1]
if !(is64BitInt(t)) {
goto ende6ef29f885a8ecf3058212bb95917323
}
v.Op = OpSUBQ
v.Aux = nil
v.resetArgs()
v.AddArg(x)
v.AddArg(y)
return true
}
goto ende6ef29f885a8ecf3058212bb95917323
ende6ef29f885a8ecf3058212bb95917323:
}
return false
}