Commit cdc0faa66ac5c5452e215eb9e07d3909ff796ba1
1 parent
1ba74fb8
target-mips: optimize gen_trap()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6937 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
12 additions
and
26 deletions
target-mips/translate.c
@@ -2166,7 +2166,7 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | @@ -2166,7 +2166,7 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | ||
2166 | int rs, int rt, int16_t imm) | 2166 | int rs, int rt, int16_t imm) |
2167 | { | 2167 | { |
2168 | int cond; | 2168 | int cond; |
2169 | - TCGv t0 = tcg_temp_local_new(); | 2169 | + TCGv t0 = tcg_temp_new(); |
2170 | TCGv t1 = tcg_temp_new(); | 2170 | TCGv t1 = tcg_temp_new(); |
2171 | 2171 | ||
2172 | cond = 0; | 2172 | cond = 0; |
@@ -2208,7 +2208,7 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | @@ -2208,7 +2208,7 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | ||
2208 | case OPC_TGEU: /* rs >= rs unsigned */ | 2208 | case OPC_TGEU: /* rs >= rs unsigned */ |
2209 | case OPC_TGEIU: /* r0 >= 0 unsigned */ | 2209 | case OPC_TGEIU: /* r0 >= 0 unsigned */ |
2210 | /* Always trap */ | 2210 | /* Always trap */ |
2211 | - tcg_gen_movi_tl(t0, 1); | 2211 | + generate_exception(ctx, EXCP_TRAP); |
2212 | break; | 2212 | break; |
2213 | case OPC_TLT: /* rs < rs */ | 2213 | case OPC_TLT: /* rs < rs */ |
2214 | case OPC_TLTI: /* r0 < 0 */ | 2214 | case OPC_TLTI: /* r0 < 0 */ |
@@ -2217,54 +2217,40 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | @@ -2217,54 +2217,40 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, | ||
2217 | case OPC_TNE: /* rs != rs */ | 2217 | case OPC_TNE: /* rs != rs */ |
2218 | case OPC_TNEI: /* r0 != 0 */ | 2218 | case OPC_TNEI: /* r0 != 0 */ |
2219 | /* Never trap: treat as NOP. */ | 2219 | /* Never trap: treat as NOP. */ |
2220 | - goto out; | ||
2221 | - default: | ||
2222 | - MIPS_INVAL("trap"); | ||
2223 | - generate_exception(ctx, EXCP_RI); | ||
2224 | - goto out; | 2220 | + break; |
2225 | } | 2221 | } |
2226 | } else { | 2222 | } else { |
2223 | + int l1 = gen_new_label(); | ||
2224 | + | ||
2227 | switch (opc) { | 2225 | switch (opc) { |
2228 | case OPC_TEQ: | 2226 | case OPC_TEQ: |
2229 | case OPC_TEQI: | 2227 | case OPC_TEQI: |
2230 | - gen_op_eq(t0, t0, t1); | 2228 | + tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1); |
2231 | break; | 2229 | break; |
2232 | case OPC_TGE: | 2230 | case OPC_TGE: |
2233 | case OPC_TGEI: | 2231 | case OPC_TGEI: |
2234 | - gen_op_ge(t0, t0, t1); | 2232 | + tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1); |
2235 | break; | 2233 | break; |
2236 | case OPC_TGEU: | 2234 | case OPC_TGEU: |
2237 | case OPC_TGEIU: | 2235 | case OPC_TGEIU: |
2238 | - gen_op_geu(t0, t0, t1); | 2236 | + tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1); |
2239 | break; | 2237 | break; |
2240 | case OPC_TLT: | 2238 | case OPC_TLT: |
2241 | case OPC_TLTI: | 2239 | case OPC_TLTI: |
2242 | - gen_op_lt(t0, t0, t1); | 2240 | + tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1); |
2243 | break; | 2241 | break; |
2244 | case OPC_TLTU: | 2242 | case OPC_TLTU: |
2245 | case OPC_TLTIU: | 2243 | case OPC_TLTIU: |
2246 | - gen_op_ltu(t0, t0, t1); | 2244 | + tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1); |
2247 | break; | 2245 | break; |
2248 | case OPC_TNE: | 2246 | case OPC_TNE: |
2249 | case OPC_TNEI: | 2247 | case OPC_TNEI: |
2250 | - gen_op_ne(t0, t0, t1); | 2248 | + tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1); |
2251 | break; | 2249 | break; |
2252 | - default: | ||
2253 | - MIPS_INVAL("trap"); | ||
2254 | - generate_exception(ctx, EXCP_RI); | ||
2255 | - goto out; | ||
2256 | } | 2250 | } |
2257 | - } | ||
2258 | - save_cpu_state(ctx, 1); | ||
2259 | - { | ||
2260 | - int l1 = gen_new_label(); | ||
2261 | - | ||
2262 | - tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1); | ||
2263 | - gen_helper_0i(raise_exception, EXCP_TRAP); | 2251 | + generate_exception(ctx, EXCP_TRAP); |
2264 | gen_set_label(l1); | 2252 | gen_set_label(l1); |
2265 | } | 2253 | } |
2266 | - ctx->bstate = BS_STOP; | ||
2267 | - out: | ||
2268 | tcg_temp_free(t0); | 2254 | tcg_temp_free(t0); |
2269 | tcg_temp_free(t1); | 2255 | tcg_temp_free(t1); |
2270 | } | 2256 | } |