* [Qemu-devel] [PATCH 0/3] m68k: Some FPU enhancements. @ 2009-05-31 0:50 Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type Laurent Vivier 0 siblings, 1 reply; 6+ messages in thread From: Laurent Vivier @ 2009-05-31 0:50 UTC (permalink / raw) To: qemu-devel; +Cc: Andreas Schwab This series of patch is needed to be able to run "find". "find" is using some FPU instructions (who knows why ?), and this series of patches adds the missing features. [PATCH 1/3] m68k: allow fpu to manage double single data type. [PATCH 2/3] m68k: add FScc instruction [PATCH 3/3] m68k: add single data type to gen_ea It must be applied after the series I sent yesterday and the patches sent by Andreas to correct some of them. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type. 2009-05-31 0:50 [Qemu-devel] [PATCH 0/3] m68k: Some FPU enhancements Laurent Vivier @ 2009-05-31 0:50 ` Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 2/3] m68k: add FScc instruction Laurent Vivier 2009-05-31 12:03 ` [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type Andreas Schwab 0 siblings, 2 replies; 6+ messages in thread From: Laurent Vivier @ 2009-05-31 0:50 UTC (permalink / raw) To: qemu-devel; +Cc: Andreas Schwab, Laurent Vivier This patch allows to manage instructions like "fcmpd #2.2, %fp0". Original function manages only data accessed through an address register. Signed-off-by: Laurent Vivier <laurent@vivier.eu> --- target-m68k/translate.c | 71 +++++++++++++++++++++++++---------------------- 1 files changed, 38 insertions(+), 33 deletions(-) diff --git a/target-m68k/translate.c b/target-m68k/translate.c index ea6b34b..223b296 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3115,40 +3115,45 @@ DISAS_INSN(fpu) goto undef; } if (opsize == OS_DOUBLE) { - tmp32 = tcg_temp_new_i32(); - tcg_gen_mov_i32(tmp32, AREG(insn, 0)); - switch ((insn >> 3) & 7) { - case 2: - case 3: - break; - case 4: - tcg_gen_addi_i32(tmp32, tmp32, -8); - break; - case 5: - offset = ldsw_code(s->pc); - s->pc += 2; - tcg_gen_addi_i32(tmp32, tmp32, offset); - break; - case 7: - offset = ldsw_code(s->pc); - offset += s->pc - 2; - s->pc += 2; - tcg_gen_addi_i32(tmp32, tmp32, offset); - break; - default: - goto undef; - } - src = gen_load64(s, tmp32); - switch ((insn >> 3) & 7) { - case 3: - tcg_gen_addi_i32(tmp32, tmp32, 8); - tcg_gen_mov_i32(AREG(insn, 0), tmp32); - break; - case 4: - tcg_gen_mov_i32(AREG(insn, 0), tmp32); - break; + if ((insn & 7) == 4) { + src = gen_load64(s, tcg_const_i32(s->pc)); + s->pc += 8; + } else { + tmp32 = tcg_temp_new_i32(); + tcg_gen_mov_i32(tmp32, AREG(insn, 0)); + switch ((insn >> 3) & 7) { + case 2: + case 3: + break; + case 4: + tcg_gen_addi_i32(tmp32, tmp32, -8); + break; + case 5: + offset = ldsw_code(s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; + case 7: + offset = ldsw_code(s->pc); + offset += s->pc - 2; + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; + default: + goto undef; + } + src = gen_load64(s, tmp32); + switch ((insn >> 3) & 7) { + case 3: + tcg_gen_addi_i32(tmp32, tmp32, 8); + tcg_gen_mov_i32(AREG(insn, 0), tmp32); + break; + case 4: + tcg_gen_mov_i32(AREG(insn, 0), tmp32); + break; + } + tcg_temp_free_i32(tmp32); } - tcg_temp_free_i32(tmp32); } else { SRC_EA(tmp32, opsize, 1, NULL); src = tcg_temp_new_i64(); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/3] m68k: add FScc instruction 2009-05-31 0:50 ` [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type Laurent Vivier @ 2009-05-31 0:50 ` Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 3/3] m68k: add single data type to gen_ea Laurent Vivier 2009-05-31 12:03 ` [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type Andreas Schwab 1 sibling, 1 reply; 6+ messages in thread From: Laurent Vivier @ 2009-05-31 0:50 UTC (permalink / raw) To: qemu-devel; +Cc: Andreas Schwab, Laurent Vivier This patch allows to manage instructions like "fsge %d0". Signed-off-by: Laurent Vivier <laurent@vivier.eu> --- target-m68k/translate.c | 82 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 68 insertions(+), 14 deletions(-) diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 223b296..8e73984 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3259,27 +3259,15 @@ undef: disas_undef_fpu(s, insn); } -DISAS_INSN(fbcc) +static void gen_fjmpcc(DisasContext *s, int cond, int l1) { - uint32_t offset; - uint32_t addr; TCGv flag; - int l1; - addr = s->pc; - offset = ldsw_code(s->pc); - s->pc += 2; - if (insn & (1 << 6)) { - offset = (offset << 16) | lduw_code(s->pc); - s->pc += 2; - } - - l1 = gen_new_label(); /* TODO: Raise BSUN exception. */ flag = tcg_temp_new(); gen_helper_compare_f64(flag, cpu_env, QREG_FP_RESULT); /* Jump to l1 if condition is true. */ - switch (insn & 0xf) { + switch (cond) { case 0: /* f */ break; case 1: /* eq (=0) */ @@ -3330,11 +3318,75 @@ DISAS_INSN(fbcc) tcg_gen_br(l1); break; } +} + +DISAS_INSN(fbcc) +{ + uint32_t offset; + uint32_t addr; + int l1; + + addr = s->pc; + offset = ldsw_code(s->pc); + s->pc += 2; + if (insn & (1 << 6)) { + offset = (offset << 16) | lduw_code(s->pc); + s->pc += 2; + } + + l1 = gen_new_label(); + gen_fjmpcc(s, insn & 0xf, l1); gen_jmp_tb(s, 0, s->pc); gen_set_label(l1); gen_jmp_tb(s, 1, addr + offset); } +DISAS_INSN(fscc_mem) +{ + int l1, l2; + TCGv taddr; + TCGv addr; + uint16_t ext; + + ext = lduw_code(s->pc); + s->pc += 2; + + taddr = gen_lea(s, insn, OS_BYTE); + if (IS_NULL_QREG(taddr)) { + gen_addr_fault(s); + return; + } + addr = tcg_temp_local_new (); + tcg_gen_mov_i32(addr, taddr); + l1 = gen_new_label(); + l2 = gen_new_label(); + gen_fjmpcc(s, ext & 0xf, l1); + gen_store(s, OS_BYTE, addr, tcg_const_i32(0x00)); + tcg_gen_br(l2); + gen_set_label(l1); + gen_store(s, OS_BYTE, addr, tcg_const_i32(0xff)); + gen_set_label(l2); + tcg_temp_free(addr); +} + +DISAS_INSN(fscc_reg) +{ + int l1; + TCGv reg; + uint16_t ext; + + ext = lduw_code(s->pc); + s->pc += 2; + + reg = DREG(insn, 0); + + l1 = gen_new_label(); + tcg_gen_ori_i32(reg, reg, 0x000000ff); + gen_fjmpcc(s, ext & 0xf, l1); + tcg_gen_andi_i32(reg, reg, 0xffffff00); + gen_set_label(l1); +} + DISAS_INSN(frestore) { /* TODO: Implement frestore. */ @@ -3912,6 +3964,8 @@ void register_m68k_insns (CPUM68KState *env) INSN(frestore, f340, ffc0, CF_FPU); INSN(fsave, f340, ffc0, CF_FPU); INSN(fpu, f200, ffc0, FPU); + INSN(fscc_mem, f240, ffc0, FPU); + INSN(fscc_reg, f240, fff8, FPU); INSN(fbcc, f280, ffc0, FPU); INSN(frestore, f340, ffc0, FPU); INSN(fsave, f340, ffc0, FPU); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 3/3] m68k: add single data type to gen_ea 2009-05-31 0:50 ` [Qemu-devel] [PATCH 2/3] m68k: add FScc instruction Laurent Vivier @ 2009-05-31 0:50 ` Laurent Vivier 0 siblings, 0 replies; 6+ messages in thread From: Laurent Vivier @ 2009-05-31 0:50 UTC (permalink / raw) To: qemu-devel; +Cc: Andreas Schwab, Laurent Vivier This patch allows to have instructions like "fcmps #0.1,%fp1". Signed-off-by: Laurent Vivier <laurent@vivier.eu> --- target-m68k/translate.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 8e73984..8740ea0 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -699,6 +699,7 @@ static TCGv gen_ea(DisasContext *s, uint16_t insn, int opsize, TCGv val, s->pc += 2; break; case OS_LONG: + case OS_SINGLE: offset = read_im32(s); break; default: -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type. 2009-05-31 0:50 ` [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 2/3] m68k: add FScc instruction Laurent Vivier @ 2009-05-31 12:03 ` Andreas Schwab 2009-05-31 12:57 ` Laurent Vivier 1 sibling, 1 reply; 6+ messages in thread From: Andreas Schwab @ 2009-05-31 12:03 UTC (permalink / raw) To: Laurent Vivier; +Cc: qemu-devel Laurent Vivier <laurent@vivier.eu> writes: > + if ((insn & 7) == 4) { > + src = gen_load64(s, tcg_const_i32(s->pc)); > + s->pc += 8; This is wrong, it doesn't check that this is indeed a 7.4 addressing mode, but will match any other mode with register 4. > + case 7: > + offset = ldsw_code(s->pc); > + offset += s->pc - 2; > + s->pc += 2; > + tcg_gen_addi_i32(tmp32, tmp32, offset); > + break; Btw, this is still broken, pc-rel addressing surely does not want the contents of register a2 added in (and the 68k supports all the indexed modes as well). All non-immediate addresses should probably be handled by gen_lea. Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type. 2009-05-31 12:03 ` [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type Andreas Schwab @ 2009-05-31 12:57 ` Laurent Vivier 0 siblings, 0 replies; 6+ messages in thread From: Laurent Vivier @ 2009-05-31 12:57 UTC (permalink / raw) To: Andreas Schwab; +Cc: qemu-devel Le dimanche 31 mai 2009 à 14:03 +0200, Andreas Schwab a écrit : > Laurent Vivier <laurent@vivier.eu> writes: > > > + if ((insn & 7) == 4) { > > + src = gen_load64(s, tcg_const_i32(s->pc)); > > + s->pc += 8; > > This is wrong, it doesn't check that this is indeed a 7.4 addressing > mode, but will match any other mode with register 4. > > > + case 7: > > + offset = ldsw_code(s->pc); > > + offset += s->pc - 2; > > + s->pc += 2; > > + tcg_gen_addi_i32(tmp32, tmp32, offset); > > + break; > > Btw, this is still broken, pc-rel addressing surely does not want the > contents of register a2 added in (and the 68k supports all the indexed > modes as well). All non-immediate addresses should probably be handled > by gen_lea. Yes, I agree, I rework this part. Laurent ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-05-31 12:57 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-05-31 0:50 [Qemu-devel] [PATCH 0/3] m68k: Some FPU enhancements Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 2/3] m68k: add FScc instruction Laurent Vivier 2009-05-31 0:50 ` [Qemu-devel] [PATCH 3/3] m68k: add single data type to gen_ea Laurent Vivier 2009-05-31 12:03 ` [Qemu-devel] Re: [PATCH 1/3] m68k: allow fpu to manage double single data type Andreas Schwab 2009-05-31 12:57 ` Laurent Vivier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).