translate.c (7c9f70386d1aae67055a9a278880cde6c278217c) translate.c (e5d8053e76bda79744710e5b59e70f9fcbce7df7)
1/*
2 * SH4 translation
3 *
4 * Copyright (c) 2005 Samuel Tardieu
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 317 unchanged lines hidden (view full) ---

326 }
327
328 tcg_gen_brcondi_i32(TCG_COND_NE, ds, 0, l1);
329 gen_goto_tb(ctx, 1, ctx->pc + 2);
330 gen_set_label(l1);
331 gen_jump(ctx);
332}
333
1/*
2 * SH4 translation
3 *
4 * Copyright (c) 2005 Samuel Tardieu
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 317 unchanged lines hidden (view full) ---

326 }
327
328 tcg_gen_brcondi_i32(TCG_COND_NE, ds, 0, l1);
329 gen_goto_tb(ctx, 1, ctx->pc + 2);
330 gen_set_label(l1);
331 gen_jump(ctx);
332}
333
334static inline void gen_load_fpr64(TCGv_i64 t, int reg)
334static inline void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
335{
336 tcg_gen_concat_i32_i64(t, cpu_fregs[reg + 1], cpu_fregs[reg]);
337}
338
335{
336 tcg_gen_concat_i32_i64(t, cpu_fregs[reg + 1], cpu_fregs[reg]);
337}
338
339static inline void gen_store_fpr64 (TCGv_i64 t, int reg)
339static inline void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
340{
341 tcg_gen_extr_i64_i32(cpu_fregs[reg + 1], cpu_fregs[reg], t);
342}
343
344#define B3_0 (ctx->opcode & 0xf)
345#define B6_4 ((ctx->opcode >> 4) & 0x7)
346#define B7_4 ((ctx->opcode >> 4) & 0xf)
347#define B7_0 (ctx->opcode & 0xff)

--- 625 unchanged lines hidden (view full) ---

973 return;
974 case 0x200a: /* xor Rm,Rn */
975 tcg_gen_xor_i32(REG(B11_8), REG(B11_8), REG(B7_4));
976 return;
977 case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
978 CHECK_FPU_ENABLED
979 if (ctx->tbflags & FPSCR_SZ) {
980 TCGv_i64 fp = tcg_temp_new_i64();
340{
341 tcg_gen_extr_i64_i32(cpu_fregs[reg + 1], cpu_fregs[reg], t);
342}
343
344#define B3_0 (ctx->opcode & 0xf)
345#define B6_4 ((ctx->opcode >> 4) & 0x7)
346#define B7_4 ((ctx->opcode >> 4) & 0xf)
347#define B7_0 (ctx->opcode & 0xff)

--- 625 unchanged lines hidden (view full) ---

973 return;
974 case 0x200a: /* xor Rm,Rn */
975 tcg_gen_xor_i32(REG(B11_8), REG(B11_8), REG(B7_4));
976 return;
977 case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
978 CHECK_FPU_ENABLED
979 if (ctx->tbflags & FPSCR_SZ) {
980 TCGv_i64 fp = tcg_temp_new_i64();
981 gen_load_fpr64(fp, XHACK(B7_4));
982 gen_store_fpr64(fp, XHACK(B11_8));
981 gen_load_fpr64(ctx, fp, XHACK(B7_4));
982 gen_store_fpr64(ctx, fp, XHACK(B11_8));
983 tcg_temp_free_i64(fp);
984 } else {
985 tcg_gen_mov_i32(FREG(B11_8), FREG(B7_4));
986 }
987 return;
988 case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
989 CHECK_FPU_ENABLED
990 if (ctx->tbflags & FPSCR_SZ) {

--- 92 unchanged lines hidden (view full) ---

1083 CHECK_FPU_ENABLED
1084 if (ctx->tbflags & FPSCR_PR) {
1085 TCGv_i64 fp0, fp1;
1086
1087 if (ctx->opcode & 0x0110)
1088 break; /* illegal instruction */
1089 fp0 = tcg_temp_new_i64();
1090 fp1 = tcg_temp_new_i64();
983 tcg_temp_free_i64(fp);
984 } else {
985 tcg_gen_mov_i32(FREG(B11_8), FREG(B7_4));
986 }
987 return;
988 case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
989 CHECK_FPU_ENABLED
990 if (ctx->tbflags & FPSCR_SZ) {

--- 92 unchanged lines hidden (view full) ---

1083 CHECK_FPU_ENABLED
1084 if (ctx->tbflags & FPSCR_PR) {
1085 TCGv_i64 fp0, fp1;
1086
1087 if (ctx->opcode & 0x0110)
1088 break; /* illegal instruction */
1089 fp0 = tcg_temp_new_i64();
1090 fp1 = tcg_temp_new_i64();
1091 gen_load_fpr64(fp0, DREG(B11_8));
1092 gen_load_fpr64(fp1, DREG(B7_4));
1091 gen_load_fpr64(ctx, fp0, DREG(B11_8));
1092 gen_load_fpr64(ctx, fp1, DREG(B7_4));
1093 switch (ctx->opcode & 0xf00f) {
1094 case 0xf000: /* fadd Rm,Rn */
1095 gen_helper_fadd_DT(fp0, cpu_env, fp0, fp1);
1096 break;
1097 case 0xf001: /* fsub Rm,Rn */
1098 gen_helper_fsub_DT(fp0, cpu_env, fp0, fp1);
1099 break;
1100 case 0xf002: /* fmul Rm,Rn */

--- 4 unchanged lines hidden (view full) ---

1105 break;
1106 case 0xf004: /* fcmp/eq Rm,Rn */
1107 gen_helper_fcmp_eq_DT(cpu_sr_t, cpu_env, fp0, fp1);
1108 return;
1109 case 0xf005: /* fcmp/gt Rm,Rn */
1110 gen_helper_fcmp_gt_DT(cpu_sr_t, cpu_env, fp0, fp1);
1111 return;
1112 }
1093 switch (ctx->opcode & 0xf00f) {
1094 case 0xf000: /* fadd Rm,Rn */
1095 gen_helper_fadd_DT(fp0, cpu_env, fp0, fp1);
1096 break;
1097 case 0xf001: /* fsub Rm,Rn */
1098 gen_helper_fsub_DT(fp0, cpu_env, fp0, fp1);
1099 break;
1100 case 0xf002: /* fmul Rm,Rn */

--- 4 unchanged lines hidden (view full) ---

1105 break;
1106 case 0xf004: /* fcmp/eq Rm,Rn */
1107 gen_helper_fcmp_eq_DT(cpu_sr_t, cpu_env, fp0, fp1);
1108 return;
1109 case 0xf005: /* fcmp/gt Rm,Rn */
1110 gen_helper_fcmp_gt_DT(cpu_sr_t, cpu_env, fp0, fp1);
1111 return;
1112 }
1113 gen_store_fpr64(fp0, DREG(B11_8));
1113 gen_store_fpr64(ctx, fp0, DREG(B11_8));
1114 tcg_temp_free_i64(fp0);
1115 tcg_temp_free_i64(fp1);
1116 } else {
1117 switch (ctx->opcode & 0xf00f) {
1118 case 0xf000: /* fadd Rm,Rn */
1119 gen_helper_fadd_FT(FREG(B11_8), cpu_env,
1120 FREG(B11_8), FREG(B7_4));
1121 break;

--- 562 unchanged lines hidden (view full) ---

1684 case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1685 CHECK_FPU_ENABLED
1686 if (ctx->tbflags & FPSCR_PR) {
1687 TCGv_i64 fp;
1688 if (ctx->opcode & 0x0100)
1689 break; /* illegal instruction */
1690 fp = tcg_temp_new_i64();
1691 gen_helper_float_DT(fp, cpu_env, cpu_fpul);
1114 tcg_temp_free_i64(fp0);
1115 tcg_temp_free_i64(fp1);
1116 } else {
1117 switch (ctx->opcode & 0xf00f) {
1118 case 0xf000: /* fadd Rm,Rn */
1119 gen_helper_fadd_FT(FREG(B11_8), cpu_env,
1120 FREG(B11_8), FREG(B7_4));
1121 break;

--- 562 unchanged lines hidden (view full) ---

1684 case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1685 CHECK_FPU_ENABLED
1686 if (ctx->tbflags & FPSCR_PR) {
1687 TCGv_i64 fp;
1688 if (ctx->opcode & 0x0100)
1689 break; /* illegal instruction */
1690 fp = tcg_temp_new_i64();
1691 gen_helper_float_DT(fp, cpu_env, cpu_fpul);
1692 gen_store_fpr64(fp, DREG(B11_8));
1692 gen_store_fpr64(ctx, fp, DREG(B11_8));
1693 tcg_temp_free_i64(fp);
1694 }
1695 else {
1696 gen_helper_float_FT(FREG(B11_8), cpu_env, cpu_fpul);
1697 }
1698 return;
1699 case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1700 CHECK_FPU_ENABLED
1701 if (ctx->tbflags & FPSCR_PR) {
1702 TCGv_i64 fp;
1703 if (ctx->opcode & 0x0100)
1704 break; /* illegal instruction */
1705 fp = tcg_temp_new_i64();
1693 tcg_temp_free_i64(fp);
1694 }
1695 else {
1696 gen_helper_float_FT(FREG(B11_8), cpu_env, cpu_fpul);
1697 }
1698 return;
1699 case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1700 CHECK_FPU_ENABLED
1701 if (ctx->tbflags & FPSCR_PR) {
1702 TCGv_i64 fp;
1703 if (ctx->opcode & 0x0100)
1704 break; /* illegal instruction */
1705 fp = tcg_temp_new_i64();
1706 gen_load_fpr64(fp, DREG(B11_8));
1706 gen_load_fpr64(ctx, fp, DREG(B11_8));
1707 gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp);
1708 tcg_temp_free_i64(fp);
1709 }
1710 else {
1711 gen_helper_ftrc_FT(cpu_fpul, cpu_env, FREG(B11_8));
1712 }
1713 return;
1714 case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */

--- 5 unchanged lines hidden (view full) ---

1720 tcg_gen_andi_i32(FREG(B11_8), FREG(B11_8), 0x7fffffff);
1721 return;
1722 case 0xf06d: /* fsqrt FRn */
1723 CHECK_FPU_ENABLED
1724 if (ctx->tbflags & FPSCR_PR) {
1725 if (ctx->opcode & 0x0100)
1726 break; /* illegal instruction */
1727 TCGv_i64 fp = tcg_temp_new_i64();
1707 gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp);
1708 tcg_temp_free_i64(fp);
1709 }
1710 else {
1711 gen_helper_ftrc_FT(cpu_fpul, cpu_env, FREG(B11_8));
1712 }
1713 return;
1714 case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */

--- 5 unchanged lines hidden (view full) ---

1720 tcg_gen_andi_i32(FREG(B11_8), FREG(B11_8), 0x7fffffff);
1721 return;
1722 case 0xf06d: /* fsqrt FRn */
1723 CHECK_FPU_ENABLED
1724 if (ctx->tbflags & FPSCR_PR) {
1725 if (ctx->opcode & 0x0100)
1726 break; /* illegal instruction */
1727 TCGv_i64 fp = tcg_temp_new_i64();
1728 gen_load_fpr64(fp, DREG(B11_8));
1728 gen_load_fpr64(ctx, fp, DREG(B11_8));
1729 gen_helper_fsqrt_DT(fp, cpu_env, fp);
1729 gen_helper_fsqrt_DT(fp, cpu_env, fp);
1730 gen_store_fpr64(fp, DREG(B11_8));
1730 gen_store_fpr64(ctx, fp, DREG(B11_8));
1731 tcg_temp_free_i64(fp);
1732 } else {
1733 gen_helper_fsqrt_FT(FREG(B11_8), cpu_env, FREG(B11_8));
1734 }
1735 return;
1736 case 0xf07d: /* fsrra FRn */
1737 CHECK_FPU_ENABLED
1738 break;

--- 9 unchanged lines hidden (view full) ---

1748 tcg_gen_movi_i32(FREG(B11_8), 0x3f800000);
1749 }
1750 return;
1751 case 0xf0ad: /* fcnvsd FPUL,DRn */
1752 CHECK_FPU_ENABLED
1753 {
1754 TCGv_i64 fp = tcg_temp_new_i64();
1755 gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul);
1731 tcg_temp_free_i64(fp);
1732 } else {
1733 gen_helper_fsqrt_FT(FREG(B11_8), cpu_env, FREG(B11_8));
1734 }
1735 return;
1736 case 0xf07d: /* fsrra FRn */
1737 CHECK_FPU_ENABLED
1738 break;

--- 9 unchanged lines hidden (view full) ---

1748 tcg_gen_movi_i32(FREG(B11_8), 0x3f800000);
1749 }
1750 return;
1751 case 0xf0ad: /* fcnvsd FPUL,DRn */
1752 CHECK_FPU_ENABLED
1753 {
1754 TCGv_i64 fp = tcg_temp_new_i64();
1755 gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul);
1756 gen_store_fpr64(fp, DREG(B11_8));
1756 gen_store_fpr64(ctx, fp, DREG(B11_8));
1757 tcg_temp_free_i64(fp);
1758 }
1759 return;
1760 case 0xf0bd: /* fcnvds DRn,FPUL */
1761 CHECK_FPU_ENABLED
1762 {
1763 TCGv_i64 fp = tcg_temp_new_i64();
1757 tcg_temp_free_i64(fp);
1758 }
1759 return;
1760 case 0xf0bd: /* fcnvds DRn,FPUL */
1761 CHECK_FPU_ENABLED
1762 {
1763 TCGv_i64 fp = tcg_temp_new_i64();
1764 gen_load_fpr64(fp, DREG(B11_8));
1764 gen_load_fpr64(ctx, fp, DREG(B11_8));
1765 gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp);
1766 tcg_temp_free_i64(fp);
1767 }
1768 return;
1769 case 0xf0ed: /* fipr FVm,FVn */
1770 CHECK_FPU_ENABLED
1771 if ((ctx->tbflags & FPSCR_PR) == 0) {
1772 TCGv m, n;

--- 571 unchanged lines hidden ---
1765 gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp);
1766 tcg_temp_free_i64(fp);
1767 }
1768 return;
1769 case 0xf0ed: /* fipr FVm,FVn */
1770 CHECK_FPU_ENABLED
1771 if ((ctx->tbflags & FPSCR_PR) == 0) {
1772 TCGv m, n;

--- 571 unchanged lines hidden ---