mips: Add extra mips release 6 instructions. - lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib/jit_mips-cpu.c
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月25日 13:22:58 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月25日 13:22:58 -0300
commit346d3458456e775eedf64af3aa6c6d9816b8f8fd (patch)
treeeb8b39189f8bedd5f2c7e453b3c7cd272e5ed718 /lib/jit_mips-cpu.c
parent17a3dbde6f61dc2c6ab559443269c10d959a1b03 (diff)
downloadlightning-346d3458456e775eedf64af3aa6c6d9816b8f8fd.tar.gz
mips: Add extra mips release 6 instructions.
The AUI and DAUI were implemented only when rs == rt. Documentation says they can be different, but at least with qemu 7.0 behavior is only correct if they are the same. DAHI and DATI work as documented.
Diffstat (limited to 'lib/jit_mips-cpu.c')
-rw-r--r--lib/jit_mips-cpu.c 57
1 files changed, 55 insertions, 2 deletions
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 57985c8..1af6406 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -166,6 +166,7 @@ typedef union {
# define MIPS_LDR 0x1b
# define MIPS_SPECIAL2 0x1c
# define MIPS_JALX 0x1d
+# define MIPS_DAUI 0x1d
# define MIPS_SPECIAL3 0x1f
# define MIPS_LB 0x20
# define MIPS_LH 0x21
@@ -356,6 +357,7 @@ static void _nop(jit_state_t*,jit_int32_t);
# define ALUIPC(rs,im) hrri(MIPS_PCREL,rs,31,im)
# define ADDIUPC(rs,im) hriW(MIPS_PCREL,rs,0,im)
# define LUI(rt,im) h_ri(MIPS_LUI,rt,im)
+# define AUI(rs,rt) hrri(MIPS_LUI,rs,rt,im) /* mips r6 */
# define ADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_ADDU)
# define DADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DADDU)
# define ADDIU(rt,rs,im) hrri(MIPS_ADDIU,rs,rt,im)
@@ -453,6 +455,9 @@ static void _nop(jit_state_t*,jit_int32_t);
# define SLTU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_SLTU)
# define SLTI(rt,rs,im) hrri(MIPS_SLTI,rs,rt,im)
# define SLTIU(rt,rs,im) hrri(MIPS_SLTIU,rs,rt,im)
+# define DAUI(rt,rs,im) hrri(MIPS_DAUI,rs,rt,im)
+# define DAHI(rs,im) hrri(MIPS_REGIMM,rs,6,im)
+# define DATI(rs,im) hrri(MIPS_REGIMM,rs,30,im)
# define BLTZ(rs,im) hrri(MIPS_REGIMM,rs,MIPS_BLTZ,im)
# define BLEZ(rs,im) hrri(MIPS_BLEZ,rs,_ZERO_REGNO,im)
# define BEQ(rs,rt,im) hrri(MIPS_BEQ,rs,rt,im)
@@ -1072,6 +1077,11 @@ _jit_get_reg_for_delay_slot(jit_state_t *_jit, jit_int32_t mask,
break;
case MIPS_REGIMM: /* 01 */
switch (i.rt.b) {
+ /* DAHI */
+ case 6: /* 06 */
+ /* DATI */
+ case 15: /* 1e */
+ assert(jit_mips6_p());
case MIPS_BLTZ: /* 00 */
case MIPS_BGEZ: /* 01 */
case MIPS_BGEZAL: /* 11 */
@@ -1093,10 +1103,11 @@ _jit_get_reg_for_delay_slot(jit_state_t *_jit, jit_int32_t mask,
regs[0] = regs[1] = regs[2] = 0;
break;
case MIPS_LUI: /* 0f */
- assert(i.rs.b == 0);
+ assert(jit_mips6_p() || i.rs.b == 0);
if (mask & jit_class_gpr) {
regs[0] = i.rt.b;
- regs[1] = regs[1] = 0;
+ regs[1] = i.rs.b; /* AUI if non zero */
+ regs[1] = 0;
}
break;
case MIPS_SPECIAL2: /* 1c */
@@ -1348,6 +1359,9 @@ _jit_get_reg_for_delay_slot(jit_state_t *_jit, jit_int32_t mask,
break;
}
break;
+ case MIPS_DAUI: /* JALX */ /* 1d */
+ /* Do not generate JALX. No microMIPS64 or MIPS16e support */
+ assert(jit_mips6_p() && i.rs.b != 0);
case MIPS_ADDIU: /* 09 */
case MIPS_SLTI: /* 0a */
case MIPS_SLTIU: /* 0b */
@@ -1710,11 +1724,50 @@ _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
else if (can_sign_extend_short_p(i0))
addiu(r0, r1, i0);
else {
+ if (jit_mips6_p()) {
+ union {
+ struct {
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+ jit_word_t _ : 16;
+ jit_word_t aui : 16;
+# if __WORDSIZE == 64
+ jit_word_t ahi : 16;
+ jit_word_t ati : 16;
+# endif
+# else
+# if __WORDSIZE == 64
+ jit_word_t ati : 16;
+ jit_word_t ahi : 16;
+# endif
+ jit_word_t aui : 16;
+ jit_word_t _ : 16;
+# endif
+ } b;
+ jit_word_t w;
+ } bits;
+ bits.w = i0;
+ if (r0 == r1 && ((jit_word_t)bits.b.aui << 16) == i0)
+ /* FIXME It should not be required r0 == r1 per
+ * documentation, but this is now it works in qemu
+ * for DAUI. Assume AUI has the same restriction. */
+ DAUI(r1, r0, bits.b.aui & 0xffff);
+#if __WORDSIZE == 64
+ else if (r0 == r1 && ((jit_word_t)bits.b.ahi << 32) == i0)
+ DAHI(r0, bits.b.ahi & 0xffff);
+ else if (r0 == r1 && ((jit_word_t)bits.b.ati << 48) == i0)
+ DATI(r0, bits.b.ati & 0xffff);
+#endif
+ else
+ goto fallback;
+ goto done;
+ }
+ fallback:
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
addr(r0, r1, rn(reg));
jit_unget_reg(reg);
}
+done:;
}
static void
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月11日 19:45:19 +0000

AltStyle によって変換されたページ (->オリジナル) /