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,10 +1425,8 @@ case &quot;$target_cpu&quot; 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;