aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-29 01:18:34 +0000
committeraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2009-03-29 01:18:34 +0000
commit3a55fa4796a09e94e81294eb1920c56b046f4e57 (patch)
tree0b5f2fc37649891cdd2687f45a9b51ac6290745e
parentf157bfe11a63a9cc12106cdfa8d54c599f5541ad (diff)
downloadqemu-3a55fa4796a09e94e81294eb1920c56b046f4e57.zip
qemu-3a55fa4796a09e94e81294eb1920c56b046f4e57.tar.gz
qemu-3a55fa4796a09e94e81294eb1920c56b046f4e57.tar.bz2
target-mips: gen_bshfl()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6934 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--target-mips/translate.c74
1 files changed, 45 insertions, 29 deletions
diff --git a/target-mips/translate.c b/target-mips/translate.c
index b023120..286eb7d 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -2619,56 +2619,72 @@ fail:
static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
{
- TCGv t0 = tcg_temp_new();
- TCGv t1 = tcg_temp_new();
+ TCGv t0;
- gen_load_gpr(t1, rt);
+ if (rd == 0) {
+ /* If no destination, treat it as a NOP. */
+ MIPS_DEBUG("NOP");
+ return;
+ }
+
+ t0 = tcg_temp_new();
+ gen_load_gpr(t0, rt);
switch (op2) {
case OPC_WSBH:
- tcg_gen_shri_tl(t0, t1, 8);
- tcg_gen_andi_tl(t0, t0, 0x00FF00FF);
- tcg_gen_shli_tl(t1, t1, 8);
- tcg_gen_andi_tl(t1, t1, ~0x00FF00FF);
- tcg_gen_or_tl(t0, t0, t1);
- tcg_gen_ext32s_tl(t0, t0);
+ {
+ TCGv t1 = tcg_temp_new();
+
+ tcg_gen_shri_tl(t1, t0, 8);
+ tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
+ tcg_gen_shli_tl(t0, t0, 8);
+ tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
+ tcg_gen_or_tl(t0, t0, t1);
+ tcg_temp_free(t1);
+ tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
+ }
break;
case OPC_SEB:
- tcg_gen_ext8s_tl(t0, t1);
+ tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
break;
case OPC_SEH:
- tcg_gen_ext16s_tl(t0, t1);
+ tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
break;
#if defined(TARGET_MIPS64)
case OPC_DSBH:
- gen_load_gpr(t1, rt);
- tcg_gen_shri_tl(t0, t1, 8);
- tcg_gen_andi_tl(t0, t0, 0x00FF00FF00FF00FFULL);
- tcg_gen_shli_tl(t1, t1, 8);
- tcg_gen_andi_tl(t1, t1, ~0x00FF00FF00FF00FFULL);
- tcg_gen_or_tl(t0, t0, t1);
+ {
+ TCGv t1 = tcg_temp_new();
+
+ tcg_gen_shri_tl(t1, t0, 8);
+ tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
+ tcg_gen_shli_tl(t0, t0, 8);
+ tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
+ tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
+ tcg_temp_free(t1);
+ }
break;
case OPC_DSHD:
- gen_load_gpr(t1, rt);
- tcg_gen_shri_tl(t0, t1, 16);
- tcg_gen_andi_tl(t0, t0, 0x0000FFFF0000FFFFULL);
- tcg_gen_shli_tl(t1, t1, 16);
- tcg_gen_andi_tl(t1, t1, ~0x0000FFFF0000FFFFULL);
- tcg_gen_or_tl(t1, t0, t1);
- tcg_gen_shri_tl(t0, t1, 32);
- tcg_gen_shli_tl(t1, t1, 32);
- tcg_gen_or_tl(t0, t0, t1);
+ {
+ TCGv t1 = tcg_temp_new();
+
+ tcg_gen_shri_tl(t1, t0, 16);
+ tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
+ tcg_gen_shli_tl(t0, t0, 16);
+ tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
+ tcg_gen_or_tl(t0, t0, t1);
+ tcg_gen_shri_tl(t1, t0, 32);
+ tcg_gen_shli_tl(t0, t0, 32);
+ tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
+ tcg_temp_free(t1);
+ }
break;
#endif
default:
MIPS_INVAL("bsfhl");
generate_exception(ctx, EXCP_RI);
tcg_temp_free(t0);
- tcg_temp_free(t1);
return;
}
- gen_store_gpr(t0, rd);
tcg_temp_free(t0);
- tcg_temp_free(t1);
}
#ifndef CONFIG_USER_ONLY