Commit 6ad025921c4d6e63e7065ba084ffe6ddf709c4de
1 parent
b3249f63
target-alpha: switch a few helpers to TCG
Switch a few helpers to TCG and implement RC and RS instructions Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5247 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
41 additions
and
67 deletions
target-alpha/cpu.h
target-alpha/helper.h
| ... | ... | @@ -4,7 +4,12 @@ |
| 4 | 4 | |
| 5 | 5 | DEF_HELPER(void, helper_tb_flush, (void)) |
| 6 | 6 | |
| 7 | +DEF_HELPER(void, helper_excp, (int, int)) | |
| 7 | 8 | DEF_HELPER(uint64_t, helper_amask, (uint64_t)) |
| 9 | +DEF_HELPER(uint64_t, helper_load_pcc, (void)) | |
| 10 | +DEF_HELPER(uint64_t, helper_load_implver, (void)) | |
| 11 | +DEF_HELPER(uint64_t, helper_rc, (void)) | |
| 12 | +DEF_HELPER(uint64_t, helper_rs, (void)) | |
| 8 | 13 | |
| 9 | 14 | DEF_HELPER(uint64_t, helper_ctpop, (uint64_t)) |
| 10 | 15 | DEF_HELPER(uint64_t, helper_ctlz, (uint64_t)) | ... | ... |
target-alpha/op.c
| ... | ... | @@ -149,24 +149,6 @@ void OPPROTO op_no_op (void) |
| 149 | 149 | #endif |
| 150 | 150 | |
| 151 | 151 | /* Misc */ |
| 152 | -void OPPROTO op_excp (void) | |
| 153 | -{ | |
| 154 | - helper_excp(PARAM(1), PARAM(2)); | |
| 155 | - RETURN(); | |
| 156 | -} | |
| 157 | - | |
| 158 | -void OPPROTO op_load_pcc (void) | |
| 159 | -{ | |
| 160 | - helper_load_pcc(); | |
| 161 | - RETURN(); | |
| 162 | -} | |
| 163 | - | |
| 164 | -void OPPROTO op_load_implver (void) | |
| 165 | -{ | |
| 166 | - helper_load_implver(); | |
| 167 | - RETURN(); | |
| 168 | -} | |
| 169 | - | |
| 170 | 152 | void OPPROTO op_load_fpcr (void) |
| 171 | 153 | { |
| 172 | 154 | helper_load_fpcr(); |
| ... | ... | @@ -179,24 +161,6 @@ void OPPROTO op_store_fpcr (void) |
| 179 | 161 | RETURN(); |
| 180 | 162 | } |
| 181 | 163 | |
| 182 | -void OPPROTO op_load_irf (void) | |
| 183 | -{ | |
| 184 | - helper_load_irf(); | |
| 185 | - RETURN(); | |
| 186 | -} | |
| 187 | - | |
| 188 | -void OPPROTO op_set_irf (void) | |
| 189 | -{ | |
| 190 | - helper_set_irf(); | |
| 191 | - RETURN(); | |
| 192 | -} | |
| 193 | - | |
| 194 | -void OPPROTO op_clear_irf (void) | |
| 195 | -{ | |
| 196 | - helper_clear_irf(); | |
| 197 | - RETURN(); | |
| 198 | -} | |
| 199 | - | |
| 200 | 164 | /* Arithmetic */ |
| 201 | 165 | void OPPROTO op_addqv (void) |
| 202 | 166 | { | ... | ... |
target-alpha/op_helper.c
| ... | ... | @@ -58,7 +58,7 @@ void helper_print_mem_EA (target_ulong EA) |
| 58 | 58 | |
| 59 | 59 | /*****************************************************************************/ |
| 60 | 60 | /* Exceptions processing helpers */ |
| 61 | -void helper_excp (uint32_t excp, uint32_t error) | |
| 61 | +void helper_excp (int excp, int error) | |
| 62 | 62 | { |
| 63 | 63 | env->exception_index = excp; |
| 64 | 64 | env->error_code = error; |
| ... | ... | @@ -80,15 +80,15 @@ uint64_t helper_amask (uint64_t arg) |
| 80 | 80 | return arg; |
| 81 | 81 | } |
| 82 | 82 | |
| 83 | -void helper_load_pcc (void) | |
| 83 | +uint64_t helper_load_pcc (void) | |
| 84 | 84 | { |
| 85 | 85 | /* XXX: TODO */ |
| 86 | - T0 = 0; | |
| 86 | + return 0; | |
| 87 | 87 | } |
| 88 | 88 | |
| 89 | -void helper_load_implver (void) | |
| 89 | +uint64_t helper_load_implver (void) | |
| 90 | 90 | { |
| 91 | - T0 = env->implver; | |
| 91 | + return env->implver; | |
| 92 | 92 | } |
| 93 | 93 | |
| 94 | 94 | void helper_load_fpcr (void) |
| ... | ... | @@ -137,20 +137,30 @@ void helper_store_fpcr (void) |
| 137 | 137 | } |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | -void helper_load_irf (void) | |
| 141 | -{ | |
| 142 | - /* XXX: TODO */ | |
| 143 | - T0 = 0; | |
| 144 | -} | |
| 140 | +spinlock_t intr_cpu_lock = SPIN_LOCK_UNLOCKED; | |
| 145 | 141 | |
| 146 | -void helper_set_irf (void) | |
| 142 | +uint64_t helper_rs(void) | |
| 147 | 143 | { |
| 148 | - /* XXX: TODO */ | |
| 144 | + uint64_t tmp; | |
| 145 | + | |
| 146 | + spin_lock(&intr_cpu_lock); | |
| 147 | + tmp = env->intr_flag; | |
| 148 | + env->intr_flag = 1; | |
| 149 | + spin_unlock(&intr_cpu_lock); | |
| 150 | + | |
| 151 | + return tmp; | |
| 149 | 152 | } |
| 150 | 153 | |
| 151 | -void helper_clear_irf (void) | |
| 154 | +uint64_t helper_rc(void) | |
| 152 | 155 | { |
| 153 | - /* XXX: TODO */ | |
| 156 | + uint64_t tmp; | |
| 157 | + | |
| 158 | + spin_lock(&intr_cpu_lock); | |
| 159 | + tmp = env->intr_flag; | |
| 160 | + env->intr_flag = 0; | |
| 161 | + spin_unlock(&intr_cpu_lock); | |
| 162 | + | |
| 163 | + return tmp; | |
| 154 | 164 | } |
| 155 | 165 | |
| 156 | 166 | void helper_addqv (void) | ... | ... |
target-alpha/op_helper.h
| ... | ... | @@ -19,14 +19,8 @@ |
| 19 | 19 | */ |
| 20 | 20 | |
| 21 | 21 | void helper_call_pal (uint32_t palcode); |
| 22 | -void helper_excp (uint32_t excp, uint32_t error); | |
| 23 | -void helper_load_pcc (void); | |
| 24 | -void helper_load_implver (void); | |
| 25 | 22 | void helper_load_fpcr (void); |
| 26 | 23 | void helper_store_fpcr (void); |
| 27 | -void helper_load_irf (void); | |
| 28 | -void helper_set_irf (void); | |
| 29 | -void helper_clear_irf (void); | |
| 30 | 24 | void helper_addqv (void); |
| 31 | 25 | void helper_addlv (void); |
| 32 | 26 | void helper_subqv (void); | ... | ... |
target-alpha/translate.c
| ... | ... | @@ -250,8 +250,14 @@ static always_inline void _gen_op_bcond (DisasContext *ctx) |
| 250 | 250 | static always_inline void gen_excp (DisasContext *ctx, |
| 251 | 251 | int exception, int error_code) |
| 252 | 252 | { |
| 253 | + TCGv tmp1, tmp2; | |
| 254 | + | |
| 253 | 255 | tcg_gen_movi_i64(cpu_pc, ctx->pc); |
| 254 | - gen_op_excp(exception, error_code); | |
| 256 | + tmp1 = tcg_const_i32(exception); | |
| 257 | + tmp2 = tcg_const_i32(error_code); | |
| 258 | + tcg_gen_helper_0_2(helper_excp, tmp1, tmp2); | |
| 259 | + tcg_temp_free(tmp2); | |
| 260 | + tcg_temp_free(tmp1); | |
| 255 | 261 | } |
| 256 | 262 | |
| 257 | 263 | static always_inline void gen_invalid (DisasContext *ctx) |
| ... | ... | @@ -1176,9 +1182,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1176 | 1182 | break; |
| 1177 | 1183 | case 0x6C: |
| 1178 | 1184 | /* IMPLVER */ |
| 1179 | - gen_op_load_implver(); | |
| 1180 | 1185 | if (rc != 31) |
| 1181 | - tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]); | |
| 1186 | + tcg_gen_helper_1_0(helper_load_implver, cpu_ir[rc]); | |
| 1182 | 1187 | break; |
| 1183 | 1188 | default: |
| 1184 | 1189 | goto invalid_opc; |
| ... | ... | @@ -1699,16 +1704,13 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1699 | 1704 | break; |
| 1700 | 1705 | case 0xC000: |
| 1701 | 1706 | /* RPCC */ |
| 1702 | - gen_op_load_pcc(); | |
| 1703 | 1707 | if (ra != 31) |
| 1704 | - tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]); | |
| 1708 | + tcg_gen_helper_1_0(helper_load_pcc, cpu_ir[ra]); | |
| 1705 | 1709 | break; |
| 1706 | 1710 | case 0xE000: |
| 1707 | 1711 | /* RC */ |
| 1708 | - gen_op_load_irf(); | |
| 1709 | 1712 | if (ra != 31) |
| 1710 | - tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]); | |
| 1711 | - gen_op_clear_irf(); | |
| 1713 | + tcg_gen_helper_1_0(helper_rc, cpu_ir[ra]); | |
| 1712 | 1714 | break; |
| 1713 | 1715 | case 0xE800: |
| 1714 | 1716 | /* ECB */ |
| ... | ... | @@ -1721,10 +1723,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1721 | 1723 | break; |
| 1722 | 1724 | case 0xF000: |
| 1723 | 1725 | /* RS */ |
| 1724 | - gen_op_load_irf(); | |
| 1725 | 1726 | if (ra != 31) |
| 1726 | - tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]); | |
| 1727 | - gen_op_set_irf(); | |
| 1727 | + tcg_gen_helper_1_0(helper_rs, cpu_ir[ra]); | |
| 1728 | 1728 | break; |
| 1729 | 1729 | case 0xF800: |
| 1730 | 1730 | /* WH64 */ | ... | ... |