Commit 8bb6e981e09c914783c0a7d43c711de4e4f36ad4
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
Showing
9 changed files
with
349 additions
and
536 deletions
configure
@@ -1425,10 +1425,8 @@ case "$target_cpu" in | @@ -1425,10 +1425,8 @@ case "$target_cpu" in | ||
1425 | ;; | 1425 | ;; |
1426 | alpha) | 1426 | alpha) |
1427 | echo "TARGET_ARCH=alpha" >> $config_mak | 1427 | echo "TARGET_ARCH=alpha" >> $config_mak |
1428 | - echo "CONFIG_DYNGEN_OP=yes" >> $config_mak | ||
1429 | echo "#define TARGET_ARCH \"alpha\"" >> $config_h | 1428 | echo "#define TARGET_ARCH \"alpha\"" >> $config_h |
1430 | echo "#define TARGET_ALPHA 1" >> $config_h | 1429 | echo "#define TARGET_ALPHA 1" >> $config_h |
1431 | - echo "#define CONFIG_DYNGEN_OP 1" >> $config_h | ||
1432 | ;; | 1430 | ;; |
1433 | arm|armeb) | 1431 | arm|armeb) |
1434 | echo "TARGET_ARCH=arm" >> $config_mak | 1432 | echo "TARGET_ARCH=arm" >> $config_mak |
target-alpha/exec.h
@@ -29,29 +29,10 @@ | @@ -29,29 +29,10 @@ | ||
29 | 29 | ||
30 | register struct CPUAlphaState *env asm(AREG0); | 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 | #define PARAM(n) ((uint64_t)PARAM##n) | 32 | #define PARAM(n) ((uint64_t)PARAM##n) |
46 | #define SPARAM(n) ((int32_t)PARAM##n) | 33 | #define SPARAM(n) ((int32_t)PARAM##n) |
47 | #define FP_STATUS (env->fp_status) | 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 | #include "cpu.h" | 36 | #include "cpu.h" |
56 | #include "exec-all.h" | 37 | #include "exec-all.h" |
57 | 38 |
target-alpha/helper.c
@@ -436,13 +436,3 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -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,3 +108,26 @@ DEF_HELPER(uint64_t, helper_cvtql, (uint64_t)) | ||
108 | DEF_HELPER(uint64_t, helper_cvtqlv, (uint64_t)) | 108 | DEF_HELPER(uint64_t, helper_cvtqlv, (uint64_t)) |
109 | DEF_HELPER(uint64_t, helper_cvtqlsv, (uint64_t)) | 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,19 +22,11 @@ | ||
22 | #include "host-utils.h" | 22 | #include "host-utils.h" |
23 | #include "softfloat.h" | 23 | #include "softfloat.h" |
24 | 24 | ||
25 | -#include "op_helper.h" | ||
26 | - | ||
27 | void helper_tb_flush (void) | 25 | void helper_tb_flush (void) |
28 | { | 26 | { |
29 | tlb_flush(env, 1); | 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 | /* Exceptions processing helpers */ | 31 | /* Exceptions processing helpers */ |
40 | void helper_excp (int excp, int error) | 32 | void helper_excp (int excp, int error) |
@@ -990,19 +982,48 @@ uint64_t helper_cvtqlsv (uint64_t a) | @@ -990,19 +982,48 @@ uint64_t helper_cvtqlsv (uint64_t a) | ||
990 | return __helper_cvtql(a, 1, 1); | 982 | return __helper_cvtql(a, 1, 1); |
991 | } | 983 | } |
992 | 984 | ||
985 | +/* PALcode support special instructions */ | ||
993 | #if !defined (CONFIG_USER_ONLY) | 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 | #endif | 1027 | #endif |
1007 | 1028 | ||
1008 | /*****************************************************************************/ | 1029 | /*****************************************************************************/ |
@@ -1013,48 +1034,130 @@ void helper_mtpr (int iprn) | @@ -1013,48 +1034,130 @@ void helper_mtpr (int iprn) | ||
1013 | * Hopefully, we emulate the PALcode, then we should never see | 1034 | * Hopefully, we emulate the PALcode, then we should never see |
1014 | * HW_LD / HW_ST instructions. | 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 | uint64_t tlb_addr, physaddr; | 1039 | uint64_t tlb_addr, physaddr; |
1019 | int index, mmu_idx; | 1040 | int index, mmu_idx; |
1020 | void *retaddr; | 1041 | void *retaddr; |
1021 | 1042 | ||
1022 | mmu_idx = cpu_mmu_index(env); | 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 | redo: | 1045 | redo: |
1025 | tlb_addr = env->tlb_table[mmu_idx][index].addr_read; | 1046 | tlb_addr = env->tlb_table[mmu_idx][index].addr_read; |
1026 | - if ((T0 & TARGET_PAGE_MASK) == | 1047 | + if ((virtaddr & TARGET_PAGE_MASK) == |
1027 | (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { | 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 | } else { | 1050 | } else { |
1030 | /* the page is not in the TLB : fill it */ | 1051 | /* the page is not in the TLB : fill it */ |
1031 | retaddr = GETPC(); | 1052 | retaddr = GETPC(); |
1032 | - tlb_fill(T0, 0, mmu_idx, retaddr); | 1053 | + tlb_fill(virtaddr, 0, mmu_idx, retaddr); |
1033 | goto redo; | 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 | uint64_t tlb_addr, physaddr; | 1061 | uint64_t tlb_addr, physaddr; |
1041 | int index, mmu_idx; | 1062 | int index, mmu_idx; |
1042 | void *retaddr; | 1063 | void *retaddr; |
1043 | 1064 | ||
1044 | mmu_idx = cpu_mmu_index(env); | 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 | redo: | 1067 | redo: |
1047 | tlb_addr = env->tlb_table[mmu_idx][index].addr_write; | 1068 | tlb_addr = env->tlb_table[mmu_idx][index].addr_write; |
1048 | - if ((T0 & TARGET_PAGE_MASK) == | 1069 | + if ((virtaddr & TARGET_PAGE_MASK) == |
1049 | (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { | 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 | } else { | 1072 | } else { |
1052 | /* the page is not in the TLB : fill it */ | 1073 | /* the page is not in the TLB : fill it */ |
1053 | retaddr = GETPC(); | 1074 | retaddr = GETPC(); |
1054 | - tlb_fill(T0, 1, mmu_idx, retaddr); | 1075 | + tlb_fill(virtaddr, 1, mmu_idx, retaddr); |
1055 | goto redo; | 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 | #define MMUSUFFIX _mmu | 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,9 +51,6 @@ static TCGv cpu_fir[31]; | ||
51 | static TCGv cpu_pc; | 51 | static TCGv cpu_pc; |
52 | static TCGv cpu_lock; | 52 | static TCGv cpu_lock; |
53 | 53 | ||
54 | -/* dyngen register indexes */ | ||
55 | -static TCGv cpu_T[2]; | ||
56 | - | ||
57 | /* register names */ | 54 | /* register names */ |
58 | static char cpu_reg_names[10*4+21*5 + 10*5+21*6]; | 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,16 +67,6 @@ static void alpha_translate_init(void) | ||
70 | 67 | ||
71 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); | 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 | p = cpu_reg_names; | 70 | p = cpu_reg_names; |
84 | for (i = 0; i < 31; i++) { | 71 | for (i = 0; i < 31; i++) { |
85 | sprintf(p, "ir%d", i); | 72 | sprintf(p, "ir%d", i); |
@@ -107,56 +94,6 @@ static void alpha_translate_init(void) | @@ -107,56 +94,6 @@ static void alpha_translate_init(void) | ||
107 | done_init = 1; | 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 | static always_inline void gen_excp (DisasContext *ctx, | 97 | static always_inline void gen_excp (DisasContext *ctx, |
161 | int exception, int error_code) | 98 | int exception, int error_code) |
162 | { | 99 | { |
@@ -1027,7 +964,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1027,7 +964,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1027 | if (ra != 31) { | 964 | if (ra != 31) { |
1028 | if (islit) | 965 | if (islit) |
1029 | tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit); | 966 | tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit); |
1030 | - else | 967 | + else |
1031 | tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); | 968 | tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); |
1032 | } else { | 969 | } else { |
1033 | if (islit) | 970 | if (islit) |
@@ -1701,9 +1638,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1701,9 +1638,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1701 | #else | 1638 | #else |
1702 | if (!ctx->pal_mode) | 1639 | if (!ctx->pal_mode) |
1703 | goto invalid_opc; | 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 | break; | 1646 | break; |
1708 | #endif | 1647 | #endif |
1709 | case 0x1A: | 1648 | case 0x1A: |
@@ -1737,94 +1676,94 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1737,94 +1676,94 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1737 | #else | 1676 | #else |
1738 | if (!ctx->pal_mode) | 1677 | if (!ctx->pal_mode) |
1739 | goto invalid_opc; | 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 | break; | 1767 | break; |
1829 | #endif | 1768 | #endif |
1830 | case 0x1C: | 1769 | case 0x1C: |
@@ -2014,12 +1953,18 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -2014,12 +1953,18 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
2014 | #else | 1953 | #else |
2015 | if (!ctx->pal_mode) | 1954 | if (!ctx->pal_mode) |
2016 | goto invalid_opc; | 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 | break; | 1968 | break; |
2024 | #endif | 1969 | #endif |
2025 | case 0x1E: | 1970 | case 0x1E: |
@@ -2031,15 +1976,17 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -2031,15 +1976,17 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
2031 | goto invalid_opc; | 1976 | goto invalid_opc; |
2032 | if (rb == 31) { | 1977 | if (rb == 31) { |
2033 | /* "Old" alpha */ | 1978 | /* "Old" alpha */ |
2034 | - gen_op_hw_rei(); | 1979 | + tcg_gen_helper_0_0(helper_hw_rei); |
2035 | } else { | 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 | ret = 2; | 1991 | ret = 2; |
2045 | break; | 1992 | break; |
@@ -2051,79 +1998,88 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -2051,79 +1998,88 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
2051 | #else | 1998 | #else |
2052 | if (!ctx->pal_mode) | 1999 | if (!ctx->pal_mode) |
2053 | goto invalid_opc; | 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 | ret = 2; | 2084 | ret = 2; |
2129 | break; | 2085 | break; |