mirror of
https://github.com/ii64/sonic.git
synced 2026-06-21 00:46:43 +08:00
fix: mov lagre imm to mem instruction in jit (#433)
* fix: mov lagre imm to mem instruction in jit * fix: possible bad pointer
This commit is contained in:
parent
be00a52b0d
commit
f21a19efc4
3 changed files with 14 additions and 2 deletions
|
|
@ -1653,7 +1653,7 @@ func (self *_Assembler) _asm_OP_check_empty(p *_Instr) {
|
|||
self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(rbracket))) // CMPB (IP)(IC), ']'
|
||||
self.Sjmp("JNE" , "_not_empty_array_{n}") // JNE _not_empty_array_{n}
|
||||
self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC
|
||||
self.Emit("MOVQ", jit.Imm(_Zero_Base), jit.Ptr(_VP, 0)) // MOVQ $zerobase, (VP)
|
||||
self.StorePtr(_Zero_Base, jit.Ptr(_VP, 0), _AX) // MOVQ $zerobase, (VP)
|
||||
self.Xjmp("JMP" , p.vi()) // JMP {p.vi()}
|
||||
self.Link("_not_empty_array_{n}")
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1643,7 +1643,7 @@ func (self *_Assembler) _asm_OP_check_empty(p *_Instr) {
|
|||
self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(rbracket))) // CMPB (IP)(IC), ']'
|
||||
self.Sjmp("JNE" , "_not_empty_array_{n}") // JNE _not_empty_array_{n}
|
||||
self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC
|
||||
self.Emit("MOVQ", jit.Imm(_Zero_Base), jit.Ptr(_VP, 0)) // MOVQ $zerobase, (VP)
|
||||
self.StorePtr(_Zero_Base, jit.Ptr(_VP, 0), _AX) // MOVQ $zerobase, (VP)
|
||||
self.Xjmp("JMP" , p.vi()) // JMP {p.vi()}
|
||||
self.Link("_not_empty_array_{n}")
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -72,6 +72,18 @@ func (self *BaseAssembler) NOPn(n int) {
|
|||
}
|
||||
}
|
||||
|
||||
func (self *BaseAssembler) StorePtr(ptr int64, to obj.Addr, tmp obj.Addr) {
|
||||
if (to.Type != obj.TYPE_MEM) || (tmp.Type != obj.TYPE_REG) {
|
||||
panic("must store imm to memory, tmp must be register")
|
||||
}
|
||||
if (ptr >> 32) != 0 {
|
||||
self.Emit("MOVQ", Imm(ptr), tmp)
|
||||
self.Emit("MOVQ", tmp, to)
|
||||
} else {
|
||||
self.Emit("MOVQ", Imm(ptr), to);
|
||||
}
|
||||
}
|
||||
|
||||
func (self *BaseAssembler) Byte(v ...byte) {
|
||||
for ; len(v) >= 8; v = v[8:] { self.From("QUAD", Imm(rt.Get64(v))) }
|
||||
for ; len(v) >= 4; v = v[4:] { self.From("LONG", Imm(int64(rt.Get32(v)))) }
|
||||
|
|
|
|||
Loading…
Reference in a new issue