x64: optimize mov <reg>, 0 (#7733)
parent
bf9b0c6345
commit
3e44393152
|
@ -514,30 +514,62 @@ pub fn (mut g Gen) gen_exit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut g Gen) mov(reg Register, val int) {
|
fn (mut g Gen) mov(reg Register, val int) {
|
||||||
match reg {
|
if val == 0 {
|
||||||
.eax, .rax {
|
// Optimise to xor reg, reg when val is 0
|
||||||
g.write8(0xb8)
|
match reg {
|
||||||
|
.eax, .rax {
|
||||||
|
g.write8(0x31)
|
||||||
|
g.write8(0xc0)
|
||||||
|
}
|
||||||
|
.edi, .rdi {
|
||||||
|
g.write8(0x31)
|
||||||
|
g.write8(0xff)
|
||||||
|
}
|
||||||
|
.edx {
|
||||||
|
g.write8(0x31)
|
||||||
|
g.write8(0xd2)
|
||||||
|
}
|
||||||
|
.rsi {
|
||||||
|
g.write8(0x48)
|
||||||
|
g.write8(0x31)
|
||||||
|
g.write8(0xf6)
|
||||||
|
}
|
||||||
|
.r12 {
|
||||||
|
g.write8(0x4d)
|
||||||
|
g.write8(0x31)
|
||||||
|
g.write8(0xe4)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panic('unhandled mov $reg')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.edi, .rdi {
|
g.println('xor $reg, $reg')
|
||||||
g.write8(0xbf)
|
} else {
|
||||||
}
|
match reg {
|
||||||
.edx {
|
.eax, .rax {
|
||||||
g.write8(0xba)
|
g.write8(0xb8)
|
||||||
}
|
}
|
||||||
.rsi {
|
.edi, .rdi {
|
||||||
g.write8(0x48)
|
g.write8(0xbf)
|
||||||
g.write8(0xbe)
|
}
|
||||||
}
|
.edx {
|
||||||
.r12 {
|
g.write8(0xba)
|
||||||
g.write8(0x41)
|
}
|
||||||
g.write8(0xbc) // r11 is 0xbb etc
|
.rsi {
|
||||||
}
|
g.write8(0x48)
|
||||||
else {
|
g.write8(0xbe)
|
||||||
panic('unhandled mov $reg')
|
}
|
||||||
|
.r12 {
|
||||||
|
g.write8(0x41)
|
||||||
|
g.write8(0xbc) // r11 is 0xbb etc
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panic('unhandled mov $reg')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
g.write32(val)
|
||||||
|
g.println('mov $reg, $val')
|
||||||
}
|
}
|
||||||
g.write32(val)
|
|
||||||
g.println('mov $reg, $val')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut g Gen) mov_reg(a Register, b Register) {
|
fn (mut g Gen) mov_reg(a Register, b Register) {
|
||||||
|
|
Loading…
Reference in New Issue