From dde8bf3b429b197e30017e30978fb60030fde84f Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Mon, 30 Sep 2019 16:53:08 +0200 Subject: [PATCH] arm32: support 64b immediate mem writes --- core/rec-ARM/rec_arm.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/rec-ARM/rec_arm.cpp b/core/rec-ARM/rec_arm.cpp index 61d50dee6..64997f504 100644 --- a/core/rec-ARM/rec_arm.cpp +++ b/core/rec-ARM/rec_arm.cpp @@ -1075,7 +1075,7 @@ bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool staging mem_op_type optp = memop_type(op); bool isram = false; - void* ptr = _vmem_read_const(op->rs1._imm, isram, memop_bytes(optp)); + void* ptr = _vmem_read_const(op->rs1._imm, isram, max(4u, memop_bytes(optp))); eReg rd = (optp != SZ_32F && optp != SZ_64F) ? reg.mapg(op->rd) : r0; if (isram) @@ -1147,7 +1147,7 @@ bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool stag mem_op_type optp = memop_type(op); bool isram = false; - void* ptr = _vmem_write_const(op->rs1._imm, isram, memop_bytes(optp)); + void* ptr = _vmem_write_const(op->rs1._imm, isram, max(4u, memop_bytes(optp))); eReg rs2 = r1; eFSReg rs2f = f0; @@ -1155,7 +1155,7 @@ bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool stag MOV32(rs2, op->rs2._imm); else if (optp == SZ_32F) rs2f = reg.mapf(op->rs2); - else + else if (optp != SZ_64F) rs2 = reg.mapg(op->rs2); if (isram) @@ -1179,6 +1179,11 @@ bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool stag VSTR(rs2f, r0, 0); break; + case SZ_64F: + VLDR(d0, r8, op->rs2.reg_nofs() / 4); + VSTR(d0, r0, 0); + break; + default: die("Invalid size"); break;