From: Richard Henderson <rth@twiddle.net>
To: Laurent Vivier <laurent@vivier.eu>, qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, peter.crosthwaite@xilinx.com,
Andreas Schwab <schwab@linux-m68k.org>,
gerg@uclinux.org
Subject: Re: [Qemu-devel] [PATCH for-2.5 17/30] m68k: ori/andi/subi/addi/eori/cmpi can modify SR/CCR
Date: Wed, 12 Aug 2015 09:44:37 -0700 [thread overview]
Message-ID: <55CB77F5.4070603@twiddle.net> (raw)
In-Reply-To: <1439151229-27747-18-git-send-email-laurent@vivier.eu>
On 08/09/2015 01:13 PM, Laurent Vivier wrote:
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
> target-m68k/translate.c | 95 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 58 insertions(+), 37 deletions(-)
>
> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
> index 6a426e1..9e379b3 100644
> --- a/target-m68k/translate.c
> +++ b/target-m68k/translate.c
> @@ -1343,6 +1343,42 @@ DISAS_INSN(bitop_im)
> DEST_EA(env, insn, opsize, tmp, &addr);
> }
> }
> +
> +static TCGv gen_get_ccr(DisasContext *s)
> +{
> + TCGv dest;
> +
> + gen_flush_flags(s);
> + dest = tcg_temp_new();
> + tcg_gen_shli_i32(dest, QREG_CC_X, 4);
> + tcg_gen_or_i32(dest, dest, QREG_CC_DEST);
> + return dest;
> +}
> +
> +static TCGv gen_get_sr(DisasContext *s)
> +{
> + TCGv ccr;
> + TCGv sr;
> +
> + ccr = gen_get_ccr(s);
> + sr = tcg_temp_new();
> + tcg_gen_andi_i32(sr, QREG_SR, 0xffe0);
> + tcg_gen_or_i32(sr, sr, ccr);
> + return sr;
> +}
Leaking the temporary produced by gen_get_ccr.
> +
> +static void gen_set_sr(DisasContext *s, TCGv val, int ccr_only)
> +{
> + TCGv tmp;
> + tmp = tcg_temp_new();
> + tcg_gen_andi_i32(QREG_CC_DEST, val, 0xf);
> + tcg_gen_shri_i32(tmp, val, 4);
> + tcg_gen_andi_i32(QREG_CC_X, tmp, 1);
> + if (!ccr_only) {
> + gen_helper_set_sr(cpu_env, val);
> + }
> +}
Leaking tmp. And you don't even need to allocate it -- perform the shift into
QREG_CC_X.
> +
> DISAS_INSN(arith_im)
> {
> int op;
> @@ -1367,7 +1403,20 @@ DISAS_INSN(arith_im)
> default:
> abort();
> }
> - SRC_EA(env, src1, opsize, -1, (op == 6) ? NULL : &addr);
> + if ((op == 0 || op == 1) &&
The subject line is surely misleading, as this is only ANDI/ORI, right? Again,
some more commentary would be helpful.
> + (insn & 0x3f) == 0x3c) {
> + if (opsize == OS_BYTE) {
> + src1 = gen_get_ccr(s);
> + } else {
> + if (IS_USER(s)) {
> + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE);
> + return;
> + }
> + src1 = gen_get_sr(s);
> + }
> + } else {
> + SRC_EA(env, src1, opsize, -1, (op == 6) ? NULL : &addr);
> + }
> dest = tcg_temp_new();
> switch (op) {
> case 0: /* ori */
> @@ -1405,7 +1454,14 @@ DISAS_INSN(arith_im)
> default:
> abort();
> }
> - DEST_EA(env, insn, opsize, dest, &addr);
> + if (op != 6) {
> + if ((op == 0 || op == 1) &&
> + (insn & 0x3f) == 0x3c) {
> + gen_set_sr(s, dest, opsize == OS_BYTE);
> + } else {
> + DEST_EA(env, insn, opsize, dest, &addr);
> + }
> + }
That said, I think this code should be rearranged so that you don't have to
replicate so many conditionals. In particular, the only thing of use in the
middle of import for the ccr insns are two lines: tcg_gen_andi/ori_tl.
I think it would be better to structure as
if ((insn & 0x3f) == 0x3c && (op == 0 || op == 1)) {
if (opsize == OS_BYTE) {
src1 = gen_get_ccr ();
} else {
...
}
if (op == 0) {
tcg_gen_ori_i32 ...
} else {
tcg_gen_andi_i32 ...
}
gen_set_sr(s, dest, opsize == OS_BYTE);
return;
}
// existing code
r~
next prev parent reply other threads:[~2015-08-12 16:44 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-09 20:13 [Qemu-devel] [PATCH for-2.5 00/30] 680x0 instructions emulation Laurent Vivier
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 01/30] m68k: define m680x0 CPUs and features Laurent Vivier
2015-08-11 23:13 ` Richard Henderson
2015-08-12 8:01 ` Laurent Vivier
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 02/30] m68k: manage scaled index Laurent Vivier
2015-08-12 3:42 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 03/30] m68k: introduce read_imXX() functions Laurent Vivier
2015-08-09 21:12 ` Andreas Schwab
2015-08-12 3:54 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 04/30] m68k: set disassembler mode to 680x0 or coldfire Laurent Vivier
2015-08-12 3:57 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 05/30] m68k: define operand sizes Laurent Vivier
2015-08-12 4:07 ` Richard Henderson
2015-08-12 8:44 ` Laurent Vivier
2015-08-12 8:52 ` Andreas Schwab
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 06/30] m68k: REG() macro cleanup Laurent Vivier
2015-08-12 4:11 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 07/30] m68k: allow to update flags with operation on words and bytes Laurent Vivier
2015-08-12 4:28 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 08/30] m68k: update CPU flags management Laurent Vivier
2015-08-12 5:12 ` Richard Henderson
2015-08-12 20:56 ` Laurent Vivier
2015-08-12 21:19 ` Richard Henderson
2015-08-12 21:21 ` Laurent Vivier
2015-08-13 18:09 ` Laurent Vivier
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 09/30] m68k: add X flag helpers Laurent Vivier
2015-08-12 5:18 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 10/30] m68k: tst bugfix Laurent Vivier
2015-08-12 5:18 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 11/30] m68k: improve clr/moveq Laurent Vivier
2015-08-12 5:20 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 12/30] m68k: Manage divw overflow Laurent Vivier
2015-08-12 6:03 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 13/30] m68k: set Z and N on divu/muls overflow as a real 68040 Laurent Vivier
2015-08-12 6:29 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 14/30] m68k: allow adda/suba to add/sub word Laurent Vivier
2015-08-12 7:32 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 15/30] m68k: add more modes to movem Laurent Vivier
2015-08-12 7:54 ` Richard Henderson
2015-08-12 8:07 ` Andreas Schwab
2015-08-12 15:13 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 16/30] m68k: Add all access modes and data sizes to some 680x0 instructions Laurent Vivier
2015-08-12 16:25 ` Richard Henderson
2015-08-12 16:27 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 17/30] m68k: ori/andi/subi/addi/eori/cmpi can modify SR/CCR Laurent Vivier
2015-08-12 16:44 ` Richard Henderson [this message]
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 18/30] m68k: addq/subq can work with all the data sizes Laurent Vivier
2015-08-12 16:48 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 19/30] m68k: add cmpm Laurent Vivier
2015-08-12 17:00 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 20/30] m68k: add exg Laurent Vivier
2015-08-12 17:05 ` Richard Henderson
2015-08-12 22:43 ` Laurent Vivier
2015-08-12 23:09 ` Richard Henderson
2015-08-12 23:10 ` Laurent Vivier
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 21/30] m68k: add bkpt Laurent Vivier
2015-08-12 17:07 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 22/30] m68k: add cas instruction Laurent Vivier
2015-08-12 17:14 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 23/30] m68k: add linkl Laurent Vivier
2015-08-12 17:33 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 24/30] m68k: add DBcc and Scc (memory operand) Laurent Vivier
2015-08-12 17:49 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 25/30] m68k: add abcd, sbcd, nbcd instructions Laurent Vivier
2015-08-12 17:57 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 26/30] m68k: add mull/divl Laurent Vivier
2015-08-12 18:36 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 27/30] m68k: add addx/subx/negx Laurent Vivier
2015-08-12 18:46 ` Richard Henderson
2015-08-13 0:11 ` Laurent Vivier
2015-08-13 2:23 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 28/30] m68k: shift/rotate bytes and words Laurent Vivier
2015-08-12 19:11 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 29/30] m68k: add rol/rox/ror/roxr Laurent Vivier
2015-08-12 19:40 ` Richard Henderson
2015-08-09 20:13 ` [Qemu-devel] [PATCH for-2.5 30/30] m68k: add bitfield instructions Laurent Vivier
2015-08-12 21:05 ` Richard Henderson
2015-08-13 2:22 ` [Qemu-devel] [PATCH for-2.5 00/30] 680x0 instructions emulation Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55CB77F5.4070603@twiddle.net \
--to=rth@twiddle.net \
--cc=gerg@uclinux.org \
--cc=laurent@vivier.eu \
--cc=peter.crosthwaite@xilinx.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=schwab@linux-m68k.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).