Skip to content

Commit eec5450

Browse files
authored
Implement fast jit float/double load/store opcodes translation (#1165)
1 parent 4135622 commit eec5450

File tree

3 files changed

+90
-15
lines changed

3 files changed

+90
-15
lines changed

core/iwasm/fast-jit/cg/x86-64/jit_codegen_x86_64.cpp

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,25 @@ x86::Gp regs_i64[] = {
8181
x86::r8, x86::r9, x86::r10, x86::r11,
8282
x86::r12, x86::r13, x86::r14, x86::r15,
8383
};
84+
85+
x86::Xmm regs_float[] = {
86+
x86::xmm0,
87+
x86::xmm1,
88+
x86::xmm2,
89+
x86::xmm3,
90+
x86::xmm4,
91+
x86::xmm5,
92+
x86::xmm6,
93+
x86::xmm7,
94+
x86::xmm8,
95+
x86::xmm9,
96+
x86::xmm10,
97+
x86::xmm11,
98+
x86::xmm12,
99+
x86::xmm13,
100+
x86::xmm14,
101+
x86::xmm15,
102+
};
84103
/* clang-format on */
85104

86105
int
@@ -611,12 +630,10 @@ mov_m_to_r(x86::Assembler &a, uint32 bytes_dst, uint32 kind_dst, bool is_signed,
611630
}
612631
}
613632
else if (kind_dst == JIT_REG_KIND_F32) {
614-
/* TODO */
615-
return false;
633+
a.movss(regs_float[reg_no_dst], m_src);
616634
}
617635
else if (kind_dst == JIT_REG_KIND_F64) {
618-
/* TODO */
619-
return false;
636+
a.movsd(regs_float[reg_no_dst], m_src);
620637
}
621638
return true;
622639
}
@@ -677,12 +694,10 @@ mov_r_to_m(x86::Assembler &a, uint32 bytes_dst, uint32 kind_dst,
677694
}
678695
}
679696
else if (kind_dst == JIT_REG_KIND_F32) {
680-
/* TODO */
681-
return false;
697+
a.movss(m_dst, regs_float[reg_no_src]);
682698
}
683699
else if (kind_dst == JIT_REG_KIND_F64) {
684-
/* TODO */
685-
return false;
700+
a.movsd(m_dst, regs_float[reg_no_src]);
686701
}
687702
return true;
688703
}
@@ -5217,21 +5232,23 @@ static const uint8 hreg_info_I64[3][16] = {
52175232
};
52185233

52195234
static uint8 hreg_info_F32[3][16] = {
5235+
/* xmm0 ~ xmm15 */
52205236
{ 0, 0, 0, 0, 0, 0, 0, 0,
5221-
1, 1, 1, 1, 1, 1, 1, 1 }, /* fixed, rsi is freely used */
5237+
1, 1, 1, 1, 1, 1, 1, 1 },
52225238
{ 1, 1, 1, 1, 1, 1, 1, 1,
5223-
1, 1, 1, 1, 1, 1, 1, 1 }, /* caller_saved_native */
5239+
1, 1, 1, 1, 1, 1, 1, 1 }, /* TBD:caller_saved_native */
52245240
{ 1, 1, 1, 1, 1, 1, 1, 1,
5225-
1, 1, 1, 1, 1, 1, 1, 1 }, /* caller_saved_jitted */
5241+
1, 1, 1, 1, 1, 1, 1, 1 }, /* TBD:caller_saved_jitted */
52265242
};
52275243

52285244
static uint8 hreg_info_F64[3][16] = {
5245+
/* xmm0 ~ xmm15 */
52295246
{ 1, 1, 1, 1, 1, 1, 1, 1,
5230-
0, 0, 0, 0, 0, 0, 0, 0 }, /* fixed, rsi is freely used */
5247+
0, 0, 0, 0, 0, 0, 0, 0 },
52315248
{ 1, 1, 1, 1, 1, 1, 1, 1,
5232-
1, 1, 1, 1, 1, 1, 1, 1 }, /* caller_saved_native */
5249+
1, 1, 1, 1, 1, 1, 1, 1 }, /* TBD:caller_saved_native */
52335250
{ 1, 1, 1, 1, 1, 1, 1, 1,
5234-
1, 1, 1, 1, 1, 1, 1, 1 }, /* caller_saved_jitted */
5251+
1, 1, 1, 1, 1, 1, 1, 1 }, /* TBD:caller_saved_jitted */
52355252
};
52365253

52375254
static const JitHardRegInfo hreg_info = {

core/iwasm/fast-jit/fe/jit_emit_control.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ copy_block_arities(JitCompContext *cc, JitReg dst_frame_sp, uint8 *dst_types,
304304
break;
305305
case VALUE_TYPE_F64:
306306
value = gen_load_f64(jit_frame, offset_src);
307-
GEN_INSN(STI64, value, dst_frame_sp,
307+
GEN_INSN(STF64, value, dst_frame_sp,
308308
NEW_CONST(I32, offset_dst * 4));
309309
offset_src += 2;
310310
offset_dst += 2;

core/iwasm/fast-jit/fe/jit_emit_memory.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,42 @@ jit_compile_op_i64_load(JitCompContext *cc, uint32 align, uint32 offset,
294294
bool
295295
jit_compile_op_f32_load(JitCompContext *cc, uint32 align, uint32 offset)
296296
{
297+
JitReg addr, maddr, value;
298+
299+
POP_I32(addr);
300+
301+
maddr = check_and_seek(cc, addr, offset, 4);
302+
if (!maddr) {
303+
goto fail;
304+
}
305+
306+
value = jit_cc_new_reg_F32(cc);
307+
GEN_INSN(LDF32, value, maddr, NEW_CONST(I32, 0));
308+
309+
PUSH_F32(value);
310+
return true;
311+
fail:
297312
return false;
298313
}
299314

300315
bool
301316
jit_compile_op_f64_load(JitCompContext *cc, uint32 align, uint32 offset)
302317
{
318+
JitReg addr, maddr, value;
319+
320+
POP_I32(addr);
321+
322+
maddr = check_and_seek(cc, addr, offset, 8);
323+
if (!maddr) {
324+
goto fail;
325+
}
326+
327+
value = jit_cc_new_reg_F64(cc);
328+
GEN_INSN(LDF64, value, maddr, NEW_CONST(I32, 0));
329+
330+
PUSH_F64(value);
331+
return true;
332+
fail:
303333
return false;
304334
}
305335

@@ -395,12 +425,40 @@ jit_compile_op_i64_store(JitCompContext *cc, uint32 align, uint32 offset,
395425
bool
396426
jit_compile_op_f32_store(JitCompContext *cc, uint32 align, uint32 offset)
397427
{
428+
JitReg value, addr, maddr;
429+
430+
POP_F32(value);
431+
POP_I32(addr);
432+
433+
maddr = check_and_seek(cc, addr, offset, 4);
434+
if (!maddr) {
435+
goto fail;
436+
}
437+
438+
GEN_INSN(STF32, value, maddr, NEW_CONST(I32, 0));
439+
440+
return true;
441+
fail:
398442
return false;
399443
}
400444

401445
bool
402446
jit_compile_op_f64_store(JitCompContext *cc, uint32 align, uint32 offset)
403447
{
448+
JitReg value, addr, maddr;
449+
450+
POP_F64(value);
451+
POP_I32(addr);
452+
453+
maddr = check_and_seek(cc, addr, offset, 8);
454+
if (!maddr) {
455+
goto fail;
456+
}
457+
458+
GEN_INSN(STF64, value, maddr, NEW_CONST(I32, 0));
459+
460+
return true;
461+
fail:
404462
return false;
405463
}
406464

0 commit comments

Comments
 (0)