From f21a19efc40c1b11ffb69790008c2de086af6b92 Mon Sep 17 00:00:00 2001 From: liu Date: Fri, 26 May 2023 15:33:10 +0800 Subject: [PATCH] fix: mov lagre imm to mem instruction in jit (#433) * fix: mov lagre imm to mem instruction in jit * fix: possible bad pointer --- internal/decoder/assembler_amd64_go116.go | 2 +- internal/decoder/assembler_amd64_go117.go | 2 +- internal/jit/assembler_amd64.go | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/decoder/assembler_amd64_go116.go b/internal/decoder/assembler_amd64_go116.go index 86d5a3d..adcb723 100644 --- a/internal/decoder/assembler_amd64_go116.go +++ b/internal/decoder/assembler_amd64_go116.go @@ -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 { diff --git a/internal/decoder/assembler_amd64_go117.go b/internal/decoder/assembler_amd64_go117.go index e25d6ef..68d5515 100644 --- a/internal/decoder/assembler_amd64_go117.go +++ b/internal/decoder/assembler_amd64_go117.go @@ -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 { diff --git a/internal/jit/assembler_amd64.go b/internal/jit/assembler_amd64.go index 00e6009..d7d1751 100644 --- a/internal/jit/assembler_amd64.go +++ b/internal/jit/assembler_amd64.go @@ -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)))) }