Commit 8bb6e981e09c914783c0a7d43c711de4e4f36ad4

Authored by aurel32
1 parent f4ed8679

target-alpha: convert palcode ops to TCG

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5360 c046a42c-6fe2-441c-8c8c-71466251a162
configure
... ... @@ -1425,10 +1425,8 @@ case &quot;$target_cpu&quot; in
1425 1425 ;;
1426 1426 alpha)
1427 1427 echo "TARGET_ARCH=alpha" >> $config_mak
1428   - echo "CONFIG_DYNGEN_OP=yes" >> $config_mak
1429 1428 echo "#define TARGET_ARCH \"alpha\"" >> $config_h
1430 1429 echo "#define TARGET_ALPHA 1" >> $config_h
1431   - echo "#define CONFIG_DYNGEN_OP 1" >> $config_h
1432 1430 ;;
1433 1431 arm|armeb)
1434 1432 echo "TARGET_ARCH=arm" >> $config_mak
... ...
target-alpha/exec.h
... ... @@ -29,29 +29,10 @@
29 29  
30 30 register struct CPUAlphaState *env asm(AREG0);
31 31  
32   -#if TARGET_LONG_BITS > HOST_LONG_BITS
33   -
34   -/* no registers can be used */
35   -#define T0 (env->t0)
36   -#define T1 (env->t1)
37   -
38   -#else
39   -
40   -register uint64_t T0 asm(AREG1);
41   -register uint64_t T1 asm(AREG2);
42   -
43   -#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */
44   -
45 32 #define PARAM(n) ((uint64_t)PARAM##n)
46 33 #define SPARAM(n) ((int32_t)PARAM##n)
47 34 #define FP_STATUS (env->fp_status)
48 35  
49   -#if defined (DEBUG_OP)
50   -#define RETURN() __asm__ __volatile__("nop" : : : "memory");
51   -#else
52   -#define RETURN() __asm__ __volatile__("" : : : "memory");
53   -#endif
54   -
55 36 #include "cpu.h"
56 37 #include "exec-all.h"
57 38  
... ...
target-alpha/helper.c
... ... @@ -436,13 +436,3 @@ void cpu_dump_state (CPUState *env, FILE *f,
436 436 }
437 437 }
438 438  
439   -void cpu_dump_EA (target_ulong EA)
440   -{
441   - FILE *f;
442   -
443   - if (logfile)
444   - f = logfile;
445   - else
446   - f = stdout;
447   - fprintf(f, "Memory access at address " TARGET_FMT_lx "\n", EA);
448   -}
... ...
target-alpha/helper.h
... ... @@ -108,3 +108,26 @@ DEF_HELPER(uint64_t, helper_cvtql, (uint64_t))
108 108 DEF_HELPER(uint64_t, helper_cvtqlv, (uint64_t))
109 109 DEF_HELPER(uint64_t, helper_cvtqlsv, (uint64_t))
110 110  
  111 +#if !defined (CONFIG_USER_ONLY)
  112 +DEF_HELPER(void, helper_hw_rei, (void))
  113 +DEF_HELPER(void, helper_hw_ret, (uint64_t))
  114 +DEF_HELPER(uint64_t, helper_mfpr, (int, uint64_t))
  115 +DEF_HELPER(void, helper_mtpr, (int, uint64_t))
  116 +DEF_HELPER(void, helper_set_alt_mode, (void))
  117 +DEF_HELPER(void, helper_restore_mode, (void))
  118 +
  119 +DEF_HELPER(uint64_t, helper_ld_virt_to_phys, (uint64_t))
  120 +DEF_HELPER(uint64_t, helper_st_virt_to_phys, (uint64_t))
  121 +DEF_HELPER(void, helper_ldl_raw, (uint64_t, uint64_t))
  122 +DEF_HELPER(void, helper_ldq_raw, (uint64_t, uint64_t))
  123 +DEF_HELPER(void, helper_ldl_l_raw, (uint64_t, uint64_t))
  124 +DEF_HELPER(void, helper_ldq_l_raw, (uint64_t, uint64_t))
  125 +DEF_HELPER(void, helper_ldl_kernel, (uint64_t, uint64_t))
  126 +DEF_HELPER(void, helper_ldq_kernel, (uint64_t, uint64_t))
  127 +DEF_HELPER(void, helper_ldl_data, (uint64_t, uint64_t))
  128 +DEF_HELPER(void, helper_ldq_data, (uint64_t, uint64_t))
  129 +DEF_HELPER(void, helper_stl_raw, (uint64_t, uint64_t))
  130 +DEF_HELPER(void, helper_stq_raw, (uint64_t, uint64_t))
  131 +DEF_HELPER(uint64_t, helper_stl_c_raw, (uint64_t, uint64_t))
  132 +DEF_HELPER(uint64_t, helper_stq_c_raw, (uint64_t, uint64_t))
  133 +#endif
... ...
target-alpha/op.c deleted 100644 → 0
1   -/*
2   - * Alpha emulation cpu micro-operations for qemu.
3   - *
4   - * Copyright (c) 2007 Jocelyn Mayer
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
9   - * version 2 of the License, or (at your option) any later version.
10   - *
11   - * This library is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   - * Lesser General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public
17   - * License along with this library; if not, write to the Free Software
18   - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19   - */
20   -
21   -#define DEBUG_OP
22   -
23   -#include "config.h"
24   -#include "exec.h"
25   -#include "host-utils.h"
26   -#include "op_helper.h"
27   -
28   -/* Load and stores */
29   -#define MEMSUFFIX _raw
30   -#include "op_mem.h"
31   -#if !defined(CONFIG_USER_ONLY)
32   -#define MEMSUFFIX _kernel
33   -#include "op_mem.h"
34   -#define MEMSUFFIX _executive
35   -#include "op_mem.h"
36   -#define MEMSUFFIX _supervisor
37   -#include "op_mem.h"
38   -#define MEMSUFFIX _user
39   -#include "op_mem.h"
40   -/* This is used for pal modes */
41   -#define MEMSUFFIX _data
42   -#include "op_mem.h"
43   -#endif
44   -
45   -/* PALcode support special instructions */
46   -#if !defined (CONFIG_USER_ONLY)
47   -void OPPROTO op_hw_rei (void)
48   -{
49   - env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
50   - env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
51   - /* XXX: re-enable interrupts and memory mapping */
52   - RETURN();
53   -}
54   -
55   -void OPPROTO op_hw_ret (void)
56   -{
57   - env->pc = T0 & ~3;
58   - env->ipr[IPR_EXC_ADDR] = T0 & 1;
59   - /* XXX: re-enable interrupts and memory mapping */
60   - RETURN();
61   -}
62   -
63   -void OPPROTO op_mfpr (void)
64   -{
65   - helper_mfpr(PARAM(1));
66   - RETURN();
67   -}
68   -
69   -void OPPROTO op_mtpr (void)
70   -{
71   - helper_mtpr(PARAM(1));
72   - RETURN();
73   -}
74   -
75   -void OPPROTO op_set_alt_mode (void)
76   -{
77   - env->saved_mode = env->ps & 0xC;
78   - env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
79   - RETURN();
80   -}
81   -
82   -void OPPROTO op_restore_mode (void)
83   -{
84   - env->ps = (env->ps & ~0xC) | env->saved_mode;
85   - RETURN();
86   -}
87   -
88   -void OPPROTO op_ld_phys_to_virt (void)
89   -{
90   - helper_ld_phys_to_virt();
91   - RETURN();
92   -}
93   -
94   -void OPPROTO op_st_phys_to_virt (void)
95   -{
96   - helper_st_phys_to_virt();
97   - RETURN();
98   -}
99   -#endif /* !defined (CONFIG_USER_ONLY) */
target-alpha/op_helper.c
... ... @@ -22,19 +22,11 @@
22 22 #include "host-utils.h"
23 23 #include "softfloat.h"
24 24  
25   -#include "op_helper.h"
26   -
27 25 void helper_tb_flush (void)
28 26 {
29 27 tlb_flush(env, 1);
30 28 }
31 29  
32   -void cpu_dump_EA (target_ulong EA);
33   -void helper_print_mem_EA (target_ulong EA)
34   -{
35   - cpu_dump_EA(EA);
36   -}
37   -
38 30 /*****************************************************************************/
39 31 /* Exceptions processing helpers */
40 32 void helper_excp (int excp, int error)
... ... @@ -990,19 +982,48 @@ uint64_t helper_cvtqlsv (uint64_t a)
990 982 return __helper_cvtql(a, 1, 1);
991 983 }
992 984  
  985 +/* PALcode support special instructions */
993 986 #if !defined (CONFIG_USER_ONLY)
994   -void helper_mfpr (int iprn)
  987 +void helper_hw_rei (void)
  988 +{
  989 + env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
  990 + env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
  991 + /* XXX: re-enable interrupts and memory mapping */
  992 +}
  993 +
  994 +void helper_hw_ret (uint64_t a)
  995 +{
  996 + env->pc = a & ~3;
  997 + env->ipr[IPR_EXC_ADDR] = a & 1;
  998 + /* XXX: re-enable interrupts and memory mapping */
  999 +}
  1000 +
  1001 +uint64_t helper_mfpr (int iprn, uint64_t val)
  1002 +{
  1003 + uint64_t tmp;
  1004 +
  1005 + if (cpu_alpha_mfpr(env, iprn, &tmp) == 0)
  1006 + val = tmp;
  1007 +
  1008 + return val;
  1009 +}
  1010 +
  1011 +void helper_mtpr (int iprn, uint64_t val)
995 1012 {
996   - uint64_t val;
  1013 + cpu_alpha_mtpr(env, iprn, val, NULL);
  1014 +}
997 1015  
998   - if (cpu_alpha_mfpr(env, iprn, &val) == 0)
999   - T0 = val;
  1016 +void helper_set_alt_mode (void)
  1017 +{
  1018 + env->saved_mode = env->ps & 0xC;
  1019 + env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1000 1020 }
1001 1021  
1002   -void helper_mtpr (int iprn)
  1022 +void helper_restore_mode (void)
1003 1023 {
1004   - cpu_alpha_mtpr(env, iprn, T0, NULL);
  1024 + env->ps = (env->ps & ~0xC) | env->saved_mode;
1005 1025 }
  1026 +
1006 1027 #endif
1007 1028  
1008 1029 /*****************************************************************************/
... ... @@ -1013,48 +1034,130 @@ void helper_mtpr (int iprn)
1013 1034 * Hopefully, we emulate the PALcode, then we should never see
1014 1035 * HW_LD / HW_ST instructions.
1015 1036 */
1016   -void helper_ld_phys_to_virt (void)
  1037 +uint64_t helper_ld_virt_to_phys (uint64_t virtaddr)
1017 1038 {
1018 1039 uint64_t tlb_addr, physaddr;
1019 1040 int index, mmu_idx;
1020 1041 void *retaddr;
1021 1042  
1022 1043 mmu_idx = cpu_mmu_index(env);
1023   - index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
  1044 + index = (virtaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1024 1045 redo:
1025 1046 tlb_addr = env->tlb_table[mmu_idx][index].addr_read;
1026   - if ((T0 & TARGET_PAGE_MASK) ==
  1047 + if ((virtaddr & TARGET_PAGE_MASK) ==
1027 1048 (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1028   - physaddr = T0 + env->tlb_table[mmu_idx][index].addend;
  1049 + physaddr = virtaddr + env->tlb_table[mmu_idx][index].addend;
1029 1050 } else {
1030 1051 /* the page is not in the TLB : fill it */
1031 1052 retaddr = GETPC();
1032   - tlb_fill(T0, 0, mmu_idx, retaddr);
  1053 + tlb_fill(virtaddr, 0, mmu_idx, retaddr);
1033 1054 goto redo;
1034 1055 }
1035   - T0 = physaddr;
  1056 + return physaddr;
1036 1057 }
1037 1058  
1038   -void helper_st_phys_to_virt (void)
  1059 +uint64_t helper_st_virt_to_phys (uint64_t virtaddr)
1039 1060 {
1040 1061 uint64_t tlb_addr, physaddr;
1041 1062 int index, mmu_idx;
1042 1063 void *retaddr;
1043 1064  
1044 1065 mmu_idx = cpu_mmu_index(env);
1045   - index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
  1066 + index = (virtaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1046 1067 redo:
1047 1068 tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
1048   - if ((T0 & TARGET_PAGE_MASK) ==
  1069 + if ((virtaddr & TARGET_PAGE_MASK) ==
1049 1070 (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1050   - physaddr = T0 + env->tlb_table[mmu_idx][index].addend;
  1071 + physaddr = virtaddr + env->tlb_table[mmu_idx][index].addend;
1051 1072 } else {
1052 1073 /* the page is not in the TLB : fill it */
1053 1074 retaddr = GETPC();
1054   - tlb_fill(T0, 1, mmu_idx, retaddr);
  1075 + tlb_fill(virtaddr, 1, mmu_idx, retaddr);
1055 1076 goto redo;
1056 1077 }
1057   - T0 = physaddr;
  1078 + return physaddr;
  1079 +}
  1080 +
  1081 +void helper_ldl_raw(uint64_t t0, uint64_t t1)
  1082 +{
  1083 + ldl_raw(t1, t0);
  1084 +}
  1085 +
  1086 +void helper_ldq_raw(uint64_t t0, uint64_t t1)
  1087 +{
  1088 + ldq_raw(t1, t0);
  1089 +}
  1090 +
  1091 +void helper_ldl_l_raw(uint64_t t0, uint64_t t1)
  1092 +{
  1093 + env->lock = t1;
  1094 + ldl_raw(t1, t0);
  1095 +}
  1096 +
  1097 +void helper_ldq_l_raw(uint64_t t0, uint64_t t1)
  1098 +{
  1099 + env->lock = t1;
  1100 + ldl_raw(t1, t0);
  1101 +}
  1102 +
  1103 +void helper_ldl_kernel(uint64_t t0, uint64_t t1)
  1104 +{
  1105 + ldl_kernel(t1, t0);
  1106 +}
  1107 +
  1108 +void helper_ldq_kernel(uint64_t t0, uint64_t t1)
  1109 +{
  1110 + ldq_kernel(t1, t0);
  1111 +}
  1112 +
  1113 +void helper_ldl_data(uint64_t t0, uint64_t t1)
  1114 +{
  1115 + ldl_data(t1, t0);
  1116 +}
  1117 +
  1118 +void helper_ldq_data(uint64_t t0, uint64_t t1)
  1119 +{
  1120 + ldq_data(t1, t0);
  1121 +}
  1122 +
  1123 +void helper_stl_raw(uint64_t t0, uint64_t t1)
  1124 +{
  1125 + stl_raw(t1, t0);
  1126 +}
  1127 +
  1128 +void helper_stq_raw(uint64_t t0, uint64_t t1)
  1129 +{
  1130 + stq_raw(t1, t0);
  1131 +}
  1132 +
  1133 +uint64_t helper_stl_c_raw(uint64_t t0, uint64_t t1)
  1134 +{
  1135 + uint64_t ret;
  1136 +
  1137 + if (t1 == env->lock) {
  1138 + stl_raw(t1, t0);
  1139 + ret = 0;
  1140 + } else
  1141 + ret = 1;
  1142 +
  1143 + env->lock = 1;
  1144 +
  1145 + return ret;
  1146 +}
  1147 +
  1148 +uint64_t helper_stq_c_raw(uint64_t t0, uint64_t t1)
  1149 +{
  1150 + uint64_t ret;
  1151 +
  1152 + if (t1 == env->lock) {
  1153 + stq_raw(t1, t0);
  1154 + ret = 0;
  1155 + } else
  1156 + ret = 1;
  1157 +
  1158 + env->lock = 1;
  1159 +
  1160 + return ret;
1058 1161 }
1059 1162  
1060 1163 #define MMUSUFFIX _mmu
... ...
target-alpha/op_helper.h deleted 100644 → 0
1   -/*
2   - * Alpha emulation cpu micro-operations helpers definitions for qemu.
3   - *
4   - * Copyright (c) 2007 Jocelyn Mayer
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
9   - * version 2 of the License, or (at your option) any later version.
10   - *
11   - * This library is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   - * Lesser General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public
17   - * License along with this library; if not, write to the Free Software
18   - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19   - */
20   -
21   -void helper_call_pal (uint32_t palcode);
22   -
23   -double helper_ldff_raw (target_ulong ea);
24   -void helper_stff_raw (target_ulong ea, double op);
25   -double helper_ldfg_raw (target_ulong ea);
26   -void helper_stfg_raw (target_ulong ea, double op);
27   -#if !defined(CONFIG_USER_ONLY)
28   -double helper_ldff_user (target_ulong ea);
29   -void helper_stff_user (target_ulong ea, double op);
30   -double helper_ldff_kernel (target_ulong ea);
31   -void helper_stff_kernel (target_ulong ea, double op);
32   -double helper_ldff_data (target_ulong ea);
33   -void helper_stff_data (target_ulong ea, double op);
34   -double helper_ldfg_user (target_ulong ea);
35   -void helper_stfg_user (target_ulong ea, double op);
36   -double helper_ldfg_kernel (target_ulong ea);
37   -void helper_stfg_kernel (target_ulong ea, double op);
38   -double helper_ldfg_data (target_ulong ea);
39   -void helper_stfg_data (target_ulong ea, double op);
40   -#endif
41   -
42   -void helper_mfpr (int iprn);
43   -void helper_mtpr (int iprn);
44   -void helper_ld_phys_to_virt (void);
45   -void helper_st_phys_to_virt (void);
46   -
target-alpha/op_mem.h deleted 100644 → 0
1   -/*
2   - * Alpha emulation cpu micro-operations for memory accesses for qemu.
3   - *
4   - * Copyright (c) 2007 Jocelyn Mayer
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
9   - * version 2 of the License, or (at your option) any later version.
10   - *
11   - * This library is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   - * Lesser General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public
17   - * License along with this library; if not, write to the Free Software
18   - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19   - */
20   -
21   -//#define DEBUG_MEM_ACCESSES
22   -#if defined (DEBUG_MEM_ACCESSES)
23   -void helper_print_mem_EA (target_ulong EA);
24   -#define print_mem_EA(EA) do { helper_print_mem_EA(EA); } while (0)
25   -#else
26   -#define print_mem_EA(EA) do { } while (0)
27   -#endif
28   -
29   -static always_inline uint32_t glue(ldl_l, MEMSUFFIX) (target_ulong EA)
30   -{
31   - env->lock = EA;
32   -
33   - return glue(ldl, MEMSUFFIX)(EA);
34   -}
35   -
36   -static always_inline uint32_t glue(ldq_l, MEMSUFFIX) (target_ulong EA)
37   -{
38   - env->lock = EA;
39   -
40   - return glue(ldq, MEMSUFFIX)(EA);
41   -}
42   -
43   -static always_inline void glue(stl_c, MEMSUFFIX) (target_ulong EA,
44   - uint32_t data)
45   -{
46   - if (EA == env->lock) {
47   - glue(stl, MEMSUFFIX)(EA, data);
48   - T0 = 0;
49   - } else {
50   - T0 = 1;
51   - }
52   - env->lock = -1;
53   -}
54   -
55   -static always_inline void glue(stq_c, MEMSUFFIX) (target_ulong EA,
56   - uint64_t data)
57   -{
58   - if (EA == env->lock) {
59   - glue(stq, MEMSUFFIX)(EA, data);
60   - T0 = 0;
61   - } else {
62   - T0 = 1;
63   - }
64   - env->lock = -1;
65   -}
66   -
67   -#define ALPHA_LD_OP(name, op) \
68   -void OPPROTO glue(glue(op_ld, name), MEMSUFFIX) (void) \
69   -{ \
70   - print_mem_EA(T0); \
71   - T1 = glue(op, MEMSUFFIX)(T0); \
72   - RETURN(); \
73   -}
74   -
75   -#define ALPHA_ST_OP(name, op) \
76   -void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \
77   -{ \
78   - print_mem_EA(T0); \
79   - glue(op, MEMSUFFIX)(T0, T1); \
80   - RETURN(); \
81   -}
82   -
83   -ALPHA_LD_OP(l, ldl);
84   -ALPHA_ST_OP(l, stl);
85   -ALPHA_LD_OP(q, ldq);
86   -ALPHA_ST_OP(q, stq);
87   -
88   -ALPHA_LD_OP(l_l, ldl_l);
89   -ALPHA_LD_OP(q_l, ldq_l);
90   -ALPHA_ST_OP(l_c, stl_c);
91   -ALPHA_ST_OP(q_c, stq_c);
92   -
93   -#undef MEMSUFFIX
target-alpha/translate.c
... ... @@ -51,9 +51,6 @@ static TCGv cpu_fir[31];
51 51 static TCGv cpu_pc;
52 52 static TCGv cpu_lock;
53 53  
54   -/* dyngen register indexes */
55   -static TCGv cpu_T[2];
56   -
57 54 /* register names */
58 55 static char cpu_reg_names[10*4+21*5 + 10*5+21*6];
59 56  
... ... @@ -70,16 +67,6 @@ static void alpha_translate_init(void)
70 67  
71 68 cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
72 69  
73   -#if TARGET_LONG_BITS > HOST_LONG_BITS
74   - cpu_T[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
75   - offsetof(CPUState, t0), "T0");
76   - cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
77   - offsetof(CPUState, t1), "T1");
78   -#else
79   - cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
80   - cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
81   -#endif
82   -
83 70 p = cpu_reg_names;
84 71 for (i = 0; i < 31; i++) {
85 72 sprintf(p, "ir%d", i);
... ... @@ -107,56 +94,6 @@ static void alpha_translate_init(void)
107 94 done_init = 1;
108 95 }
109 96  
110   -/* Memory moves */
111   -#if defined(CONFIG_USER_ONLY)
112   -#define OP_LD_TABLE(width) \
113   -static GenOpFunc *gen_op_ld##width[] = { \
114   - &gen_op_ld##width##_raw, \
115   -}
116   -#define OP_ST_TABLE(width) \
117   -static GenOpFunc *gen_op_st##width[] = { \
118   - &gen_op_st##width##_raw, \
119   -}
120   -#else
121   -#define OP_LD_TABLE(width) \
122   -static GenOpFunc *gen_op_ld##width[] = { \
123   - &gen_op_ld##width##_kernel, \
124   - &gen_op_ld##width##_executive, \
125   - &gen_op_ld##width##_supervisor, \
126   - &gen_op_ld##width##_user, \
127   -}
128   -#define OP_ST_TABLE(width) \
129   -static GenOpFunc *gen_op_st##width[] = { \
130   - &gen_op_st##width##_kernel, \
131   - &gen_op_st##width##_executive, \
132   - &gen_op_st##width##_supervisor, \
133   - &gen_op_st##width##_user, \
134   -}
135   -#endif
136   -
137   -#define GEN_LD(width) \
138   -OP_LD_TABLE(width); \
139   -static always_inline void gen_ld##width (DisasContext *ctx) \
140   -{ \
141   - (*gen_op_ld##width[ctx->mem_idx])(); \
142   -}
143   -
144   -#define GEN_ST(width) \
145   -OP_ST_TABLE(width); \
146   -static always_inline void gen_st##width (DisasContext *ctx) \
147   -{ \
148   - (*gen_op_st##width[ctx->mem_idx])(); \
149   -}
150   -
151   -GEN_LD(l);
152   -GEN_ST(l);
153   -GEN_LD(q);
154   -GEN_ST(q);
155   -GEN_LD(l_l);
156   -GEN_ST(l_c);
157   -GEN_LD(q_l);
158   -GEN_ST(q_c);
159   -
160 97 static always_inline void gen_excp (DisasContext *ctx,
161 98 int exception, int error_code)
162 99 {
... ... @@ -1027,7 +964,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1027 964 if (ra != 31) {
1028 965 if (islit)
1029 966 tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1030   - else
  967 + else
1031 968 tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1032 969 } else {
1033 970 if (islit)
... ... @@ -1701,9 +1638,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1701 1638 #else
1702 1639 if (!ctx->pal_mode)
1703 1640 goto invalid_opc;
1704   - gen_op_mfpr(insn & 0xFF);
1705   - if (ra != 31)
1706   - tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
  1641 + if (ra != 31) {
  1642 + TCGv tmp = tcg_const_i32(insn & 0xFF);
  1643 + tcg_gen_helper_1_2(helper_mfpr, cpu_ir[ra], tmp, cpu_ir[ra]);
  1644 + tcg_temp_free(tmp);
  1645 + }
1707 1646 break;
1708 1647 #endif
1709 1648 case 0x1A:
... ... @@ -1737,94 +1676,94 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1737 1676 #else
1738 1677 if (!ctx->pal_mode)
1739 1678 goto invalid_opc;
1740   - if (rb != 31)
1741   - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1742   - else
1743   - tcg_gen_movi_i64(cpu_T[0], 0);
1744   - tcg_gen_movi_i64(cpu_T[1], disp12);
1745   - tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
1746   - switch ((insn >> 12) & 0xF) {
1747   - case 0x0:
1748   - /* Longword physical access */
1749   - gen_op_ldl_raw();
1750   - break;
1751   - case 0x1:
1752   - /* Quadword physical access */
1753   - gen_op_ldq_raw();
1754   - break;
1755   - case 0x2:
1756   - /* Longword physical access with lock */
1757   - gen_op_ldl_l_raw();
1758   - break;
1759   - case 0x3:
1760   - /* Quadword physical access with lock */
1761   - gen_op_ldq_l_raw();
1762   - break;
1763   - case 0x4:
1764   - /* Longword virtual PTE fetch */
1765   - gen_op_ldl_kernel();
1766   - break;
1767   - case 0x5:
1768   - /* Quadword virtual PTE fetch */
1769   - gen_op_ldq_kernel();
1770   - break;
1771   - case 0x6:
1772   - /* Invalid */
1773   - goto invalid_opc;
1774   - case 0x7:
1775   - /* Invalid */
1776   - goto invalid_opc;
1777   - case 0x8:
1778   - /* Longword virtual access */
1779   - gen_op_ld_phys_to_virt();
1780   - gen_op_ldl_raw();
1781   - break;
1782   - case 0x9:
1783   - /* Quadword virtual access */
1784   - gen_op_ld_phys_to_virt();
1785   - gen_op_ldq_raw();
1786   - break;
1787   - case 0xA:
1788   - /* Longword virtual access with protection check */
1789   - gen_ldl(ctx);
1790   - break;
1791   - case 0xB:
1792   - /* Quadword virtual access with protection check */
1793   - gen_ldq(ctx);
1794   - break;
1795   - case 0xC:
1796   - /* Longword virtual access with altenate access mode */
1797   - gen_op_set_alt_mode();
1798   - gen_op_ld_phys_to_virt();
1799   - gen_op_ldl_raw();
1800   - gen_op_restore_mode();
1801   - break;
1802   - case 0xD:
1803   - /* Quadword virtual access with altenate access mode */
1804   - gen_op_set_alt_mode();
1805   - gen_op_ld_phys_to_virt();
1806   - gen_op_ldq_raw();
1807   - gen_op_restore_mode();
1808   - break;
1809   - case 0xE:
1810   - /* Longword virtual access with alternate access mode and
1811   - * protection checks
1812   - */
1813   - gen_op_set_alt_mode();
1814   - gen_op_ldl_data();
1815   - gen_op_restore_mode();
1816   - break;
1817   - case 0xF:
1818   - /* Quadword virtual access with alternate access mode and
1819   - * protection checks
1820   - */
1821   - gen_op_set_alt_mode();
1822   - gen_op_ldq_data();
1823   - gen_op_restore_mode();
1824   - break;
  1679 + if (ra != 31) {
  1680 + TCGv addr = tcg_temp_new(TCG_TYPE_I64);
  1681 + if (rb != 31)
  1682 + tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
  1683 + else
  1684 + tcg_gen_movi_i64(addr, disp12);
  1685 + switch ((insn >> 12) & 0xF) {
  1686 + case 0x0:
  1687 + /* Longword physical access */
  1688 + tcg_gen_helper_0_2(helper_ldl_raw, cpu_ir[ra], addr);
  1689 + break;
  1690 + case 0x1:
  1691 + /* Quadword physical access */
  1692 + tcg_gen_helper_0_2(helper_ldq_raw, cpu_ir[ra], addr);
  1693 + break;
  1694 + case 0x2:
  1695 + /* Longword physical access with lock */
  1696 + tcg_gen_helper_0_2(helper_ldl_l_raw, cpu_ir[ra], addr);
  1697 + break;
  1698 + case 0x3:
  1699 + /* Quadword physical access with lock */
  1700 + tcg_gen_helper_0_2(helper_ldq_l_raw, cpu_ir[ra], addr);
  1701 + break;
  1702 + case 0x4:
  1703 + /* Longword virtual PTE fetch */
  1704 + tcg_gen_helper_0_2(helper_ldl_kernel, cpu_ir[ra], addr);
  1705 + break;
  1706 + case 0x5:
  1707 + /* Quadword virtual PTE fetch */
  1708 + tcg_gen_helper_0_2(helper_ldq_kernel, cpu_ir[ra], addr);
  1709 + break;
  1710 + case 0x6:
  1711 + /* Incpu_ir[ra]id */
  1712 + goto incpu_ir[ra]id_opc;
  1713 + case 0x7:
  1714 + /* Incpu_ir[ra]id */
  1715 + goto incpu_ir[ra]id_opc;
  1716 + case 0x8:
  1717 + /* Longword virtual access */
  1718 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  1719 + tcg_gen_helper_0_2(helper_ldl_raw, cpu_ir[ra], addr);
  1720 + break;
  1721 + case 0x9:
  1722 + /* Quadword virtual access */
  1723 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  1724 + tcg_gen_helper_0_2(helper_ldq_raw, cpu_ir[ra], addr);
  1725 + break;
  1726 + case 0xA:
  1727 + /* Longword virtual access with protection check */
  1728 + tcg_gen_qemu_ld32s(cpu_ir[ra], addr, ctx->flags);
  1729 + break;
  1730 + case 0xB:
  1731 + /* Quadword virtual access with protection check */
  1732 + tcg_gen_qemu_ld64(cpu_ir[ra], addr, ctx->flags);
  1733 + break;
  1734 + case 0xC:
  1735 + /* Longword virtual access with altenate access mode */
  1736 + tcg_gen_helper_0_0(helper_set_alt_mode);
  1737 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  1738 + tcg_gen_helper_0_2(helper_ldl_raw, cpu_ir[ra], addr);
  1739 + tcg_gen_helper_0_0(helper_restore_mode);
  1740 + break;
  1741 + case 0xD:
  1742 + /* Quadword virtual access with altenate access mode */
  1743 + tcg_gen_helper_0_0(helper_set_alt_mode);
  1744 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  1745 + tcg_gen_helper_0_2(helper_ldq_raw, cpu_ir[ra], addr);
  1746 + tcg_gen_helper_0_0(helper_restore_mode);
  1747 + break;
  1748 + case 0xE:
  1749 + /* Longword virtual access with alternate access mode and
  1750 + * protection checks
  1751 + */
  1752 + tcg_gen_helper_0_0(helper_set_alt_mode);
  1753 + tcg_gen_helper_0_2(helper_ldl_data, cpu_ir[ra], addr);
  1754 + tcg_gen_helper_0_0(helper_restore_mode);
  1755 + break;
  1756 + case 0xF:
  1757 + /* Quadword virtual access with alternate access mode and
  1758 + * protection checks
  1759 + */
  1760 + tcg_gen_helper_0_0(helper_set_alt_mode);
  1761 + tcg_gen_helper_0_2(helper_ldq_data, cpu_ir[ra], addr);
  1762 + tcg_gen_helper_0_0(helper_restore_mode);
  1763 + break;
  1764 + }
  1765 + tcg_temp_free(addr);
1825 1766 }
1826   - if (ra != 31)
1827   - tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1828 1767 break;
1829 1768 #endif
1830 1769 case 0x1C:
... ... @@ -2014,12 +1953,18 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
2014 1953 #else
2015 1954 if (!ctx->pal_mode)
2016 1955 goto invalid_opc;
2017   - if (ra != 31)
2018   - tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
2019   - else
2020   - tcg_gen_movi_i64(cpu_T[0], 0);
2021   - gen_op_mtpr(insn & 0xFF);
2022   - ret = 2;
  1956 + else {
  1957 + TCGv tmp1 = tcg_const_i32(insn & 0xFF);
  1958 + if (ra != 31)
  1959 + tcg_gen_helper(helper_mtpr, tmp1, cpu_ir[ra]);
  1960 + else {
  1961 + TCGv tmp2 = tcg_const_i64(0);
  1962 + tcg_gen_helper(helper_mtpr, tmp1, tmp2);
  1963 + tcg_temp_free(tmp2);
  1964 + }
  1965 + tcg_temp_free(tmp1);
  1966 + ret = 2;
  1967 + }
2023 1968 break;
2024 1969 #endif
2025 1970 case 0x1E:
... ... @@ -2031,15 +1976,17 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
2031 1976 goto invalid_opc;
2032 1977 if (rb == 31) {
2033 1978 /* "Old" alpha */
2034   - gen_op_hw_rei();
  1979 + tcg_gen_helper_0_0(helper_hw_rei);
2035 1980 } else {
2036   - if (ra != 31)
2037   - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
2038   - else
2039   - tcg_gen_movi_i64(cpu_T[0], 0);
2040   - tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
2041   - tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
2042   - gen_op_hw_ret();
  1981 + TCGv tmp;
  1982 +
  1983 + if (ra != 31) {
  1984 + tmp = tcg_temp_new(TCG_TYPE_I64);
  1985 + tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51));
  1986 + } else
  1987 + tmp = tcg_const_i64(((int64_t)insn << 51) >> 51);
  1988 + tcg_gen_helper_0_1(helper_hw_ret, tmp);
  1989 + tcg_temp_free(tmp);
2043 1990 }
2044 1991 ret = 2;
2045 1992 break;
... ... @@ -2051,79 +1998,88 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
2051 1998 #else
2052 1999 if (!ctx->pal_mode)
2053 2000 goto invalid_opc;
2054   - if (ra != 31)
2055   - tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp12);
2056   - else
2057   - tcg_gen_movi_i64(cpu_T[0], disp12);
2058   - if (ra != 31)
2059   - tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
2060   - else
2061   - tcg_gen_movi_i64(cpu_T[1], 0);
2062   - switch ((insn >> 12) & 0xF) {
2063   - case 0x0:
2064   - /* Longword physical access */
2065   - gen_op_stl_raw();
2066   - break;
2067   - case 0x1:
2068   - /* Quadword physical access */
2069   - gen_op_stq_raw();
2070   - break;
2071   - case 0x2:
2072   - /* Longword physical access with lock */
2073   - gen_op_stl_c_raw();
2074   - break;
2075   - case 0x3:
2076   - /* Quadword physical access with lock */
2077   - gen_op_stq_c_raw();
2078   - break;
2079   - case 0x4:
2080   - /* Longword virtual access */
2081   - gen_op_st_phys_to_virt();
2082   - gen_op_stl_raw();
2083   - break;
2084   - case 0x5:
2085   - /* Quadword virtual access */
2086   - gen_op_st_phys_to_virt();
2087   - gen_op_stq_raw();
2088   - break;
2089   - case 0x6:
2090   - /* Invalid */
2091   - goto invalid_opc;
2092   - case 0x7:
2093   - /* Invalid */
2094   - goto invalid_opc;
2095   - case 0x8:
2096   - /* Invalid */
2097   - goto invalid_opc;
2098   - case 0x9:
2099   - /* Invalid */
2100   - goto invalid_opc;
2101   - case 0xA:
2102   - /* Invalid */
2103   - goto invalid_opc;
2104   - case 0xB:
2105   - /* Invalid */
2106   - goto invalid_opc;
2107   - case 0xC:
2108   - /* Longword virtual access with alternate access mode */
2109   - gen_op_set_alt_mode();
2110   - gen_op_st_phys_to_virt();
2111   - gen_op_ldl_raw();
2112   - gen_op_restore_mode();
2113   - break;
2114   - case 0xD:
2115   - /* Quadword virtual access with alternate access mode */
2116   - gen_op_set_alt_mode();
2117   - gen_op_st_phys_to_virt();
2118   - gen_op_ldq_raw();
2119   - gen_op_restore_mode();
2120   - break;
2121   - case 0xE:
2122   - /* Invalid */
2123   - goto invalid_opc;
2124   - case 0xF:
2125   - /* Invalid */
2126   - goto invalid_opc;
  2001 + else {
  2002 + TCGv addr, val;
  2003 + addr = tcg_temp_new(TCG_TYPE_I64);
  2004 + if (rb != 31)
  2005 + tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
  2006 + else
  2007 + tcg_gen_movi_i64(addr, disp12);
  2008 + if (ra != 31)
  2009 + val = cpu_ir[ra];
  2010 + else {
  2011 + val = tcg_temp_new(TCG_TYPE_I64);
  2012 + tcg_gen_movi_i64(val, 0);
  2013 + }
  2014 + switch ((insn >> 12) & 0xF) {
  2015 + case 0x0:
  2016 + /* Longword physical access */
  2017 + tcg_gen_helper_0_2(helper_stl_raw, val, addr);
  2018 + break;
  2019 + case 0x1:
  2020 + /* Quadword physical access */
  2021 + tcg_gen_helper_0_2(helper_stq_raw, val, addr);
  2022 + break;
  2023 + case 0x2:
  2024 + /* Longword physical access with lock */
  2025 + tcg_gen_helper_1_2(helper_stl_c_raw, val, val, addr);
  2026 + break;
  2027 + case 0x3:
  2028 + /* Quadword physical access with lock */
  2029 + tcg_gen_helper_1_2(helper_stq_c_raw, val, val, addr);
  2030 + break;
  2031 + case 0x4:
  2032 + /* Longword virtual access */
  2033 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  2034 + tcg_gen_helper_0_2(helper_stl_raw, val, addr);
  2035 + break;
  2036 + case 0x5:
  2037 + /* Quadword virtual access */
  2038 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  2039 + tcg_gen_helper_0_2(helper_stq_raw, val, addr);
  2040 + break;
  2041 + case 0x6:
  2042 + /* Invalid */
  2043 + goto invalid_opc;
  2044 + case 0x7:
  2045 + /* Invalid */
  2046 + goto invalid_opc;
  2047 + case 0x8:
  2048 + /* Invalid */
  2049 + goto invalid_opc;
  2050 + case 0x9:
  2051 + /* Invalid */
  2052 + goto invalid_opc;
  2053 + case 0xA:
  2054 + /* Invalid */
  2055 + goto invalid_opc;
  2056 + case 0xB:
  2057 + /* Invalid */
  2058 + goto invalid_opc;
  2059 + case 0xC:
  2060 + /* Longword virtual access with alternate access mode */
  2061 + tcg_gen_helper_0_0(helper_set_alt_mode);
  2062 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  2063 + tcg_gen_helper_0_2(helper_stl_raw, val, addr);
  2064 + tcg_gen_helper_0_0(helper_restore_mode);
  2065 + break;
  2066 + case 0xD:
  2067 + /* Quadword virtual access with alternate access mode */
  2068 + tcg_gen_helper_0_0(helper_set_alt_mode);
  2069 + tcg_gen_helper_1_1(helper_st_virt_to_phys, addr, addr);
  2070 + tcg_gen_helper_0_2(helper_stl_raw, val, addr);
  2071 + tcg_gen_helper_0_0(helper_restore_mode);
  2072 + break;
  2073 + case 0xE:
  2074 + /* Invalid */
  2075 + goto invalid_opc;
  2076 + case 0xF:
  2077 + /* Invalid */
  2078 + goto invalid_opc;
  2079 + }
  2080 + if (ra != 31)
  2081 + tcg_temp_free(val);
  2082 + tcg_temp_free(addr);
2127 2083 }
2128 2084 ret = 2;
2129 2085 break;
... ...