Commit 3157a0a93b65aac3113ba1338221c262663ebd50
1 parent
87e92502
More TCG conversions for CRIS.
* Bit swap insn (bitwise not, endian swap and bit reverse). * Muls and mulu. * Extended arithmetics. * Parts of the condition code handling. * Use tcg_const_tl. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4069 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
259 additions
and
73 deletions
target-cris/translate.c
| @@ -153,9 +153,9 @@ int preg_sizes[] = { | @@ -153,9 +153,9 @@ int preg_sizes[] = { | ||
| 153 | }; | 153 | }; |
| 154 | 154 | ||
| 155 | #define t_gen_mov_TN_env(tn, member) \ | 155 | #define t_gen_mov_TN_env(tn, member) \ |
| 156 | - _t_gen_mov_TN_env((tn), offsetof(CPUState, (member))) | 156 | + _t_gen_mov_TN_env((tn), offsetof(CPUState, member)) |
| 157 | #define t_gen_mov_env_TN(member, tn) \ | 157 | #define t_gen_mov_env_TN(member, tn) \ |
| 158 | - _t_gen_mov_env_TN(offsetof(CPUState, (member)), (tn)) | 158 | + _t_gen_mov_env_TN(offsetof(CPUState, member), (tn)) |
| 159 | 159 | ||
| 160 | #define t_gen_mov_TN_reg(tn, regno) \ | 160 | #define t_gen_mov_TN_reg(tn, regno) \ |
| 161 | _t_gen_mov_TN_env((tn), offsetof(CPUState, regs[regno])) | 161 | _t_gen_mov_TN_env((tn), offsetof(CPUState, regs[regno])) |
| @@ -174,9 +174,9 @@ static inline void _t_gen_mov_env_TN(int offset, TCGv tn) | @@ -174,9 +174,9 @@ static inline void _t_gen_mov_env_TN(int offset, TCGv tn) | ||
| 174 | static inline void t_gen_mov_TN_preg(TCGv tn, int r) | 174 | static inline void t_gen_mov_TN_preg(TCGv tn, int r) |
| 175 | { | 175 | { |
| 176 | if (r == PR_BZ || r == PR_WZ || r == PR_DZ) | 176 | if (r == PR_BZ || r == PR_WZ || r == PR_DZ) |
| 177 | - tcg_gen_mov_tl(tn, tcg_const_i32(0)); | 177 | + tcg_gen_mov_tl(tn, tcg_const_tl(0)); |
| 178 | else if (r == PR_VR) | 178 | else if (r == PR_VR) |
| 179 | - tcg_gen_mov_tl(tn, tcg_const_i32(32)); | 179 | + tcg_gen_mov_tl(tn, tcg_const_tl(32)); |
| 180 | else | 180 | else |
| 181 | tcg_gen_ld_tl(tn, cpu_env, offsetof(CPUState, pregs[r])); | 181 | tcg_gen_ld_tl(tn, cpu_env, offsetof(CPUState, pregs[r])); |
| 182 | } | 182 | } |
| @@ -200,7 +200,7 @@ static void t_gen_lsl(TCGv d, TCGv a, TCGv b) | @@ -200,7 +200,7 @@ static void t_gen_lsl(TCGv d, TCGv a, TCGv b) | ||
| 200 | l1 = gen_new_label(); | 200 | l1 = gen_new_label(); |
| 201 | /* Speculative shift. */ | 201 | /* Speculative shift. */ |
| 202 | tcg_gen_shl_tl(d, a, b); | 202 | tcg_gen_shl_tl(d, a, b); |
| 203 | - tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_i32(31), l1); | 203 | + tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_tl(31), l1); |
| 204 | /* Clear dst if shift operands were to large. */ | 204 | /* Clear dst if shift operands were to large. */ |
| 205 | tcg_gen_movi_tl(d, 0); | 205 | tcg_gen_movi_tl(d, 0); |
| 206 | gen_set_label(l1); | 206 | gen_set_label(l1); |
| @@ -213,7 +213,7 @@ static void t_gen_lsr(TCGv d, TCGv a, TCGv b) | @@ -213,7 +213,7 @@ static void t_gen_lsr(TCGv d, TCGv a, TCGv b) | ||
| 213 | l1 = gen_new_label(); | 213 | l1 = gen_new_label(); |
| 214 | /* Speculative shift. */ | 214 | /* Speculative shift. */ |
| 215 | tcg_gen_shr_tl(d, a, b); | 215 | tcg_gen_shr_tl(d, a, b); |
| 216 | - tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_i32(31), l1); | 216 | + tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_tl(31), l1); |
| 217 | /* Clear dst if shift operands were to large. */ | 217 | /* Clear dst if shift operands were to large. */ |
| 218 | tcg_gen_movi_tl(d, 0); | 218 | tcg_gen_movi_tl(d, 0); |
| 219 | gen_set_label(l1); | 219 | gen_set_label(l1); |
| @@ -226,14 +226,174 @@ static void t_gen_asr(TCGv d, TCGv a, TCGv b) | @@ -226,14 +226,174 @@ static void t_gen_asr(TCGv d, TCGv a, TCGv b) | ||
| 226 | l1 = gen_new_label(); | 226 | l1 = gen_new_label(); |
| 227 | /* Speculative shift. */ | 227 | /* Speculative shift. */ |
| 228 | tcg_gen_sar_tl(d, a, b); | 228 | tcg_gen_sar_tl(d, a, b); |
| 229 | - tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_i32(31), l1); | 229 | + tcg_gen_brcond_tl(TCG_COND_LE, b, tcg_const_tl(31), l1); |
| 230 | /* Clear dst if shift operands were to large. */ | 230 | /* Clear dst if shift operands were to large. */ |
| 231 | tcg_gen_movi_tl(d, 0); | 231 | tcg_gen_movi_tl(d, 0); |
| 232 | - tcg_gen_brcond_tl(TCG_COND_LT, b, tcg_const_i32(0x80000000), l1); | 232 | + tcg_gen_brcond_tl(TCG_COND_LT, b, tcg_const_tl(0x80000000), l1); |
| 233 | tcg_gen_movi_tl(d, 0xffffffff); | 233 | tcg_gen_movi_tl(d, 0xffffffff); |
| 234 | gen_set_label(l1); | 234 | gen_set_label(l1); |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | +/* 64-bit signed mul, lower result in d and upper in d2. */ | ||
| 238 | +static void t_gen_muls(TCGv d, TCGv d2, TCGv a, TCGv b) | ||
| 239 | +{ | ||
| 240 | + TCGv t0, t1; | ||
| 241 | + | ||
| 242 | + t0 = tcg_temp_new(TCG_TYPE_I64); | ||
| 243 | + t1 = tcg_temp_new(TCG_TYPE_I64); | ||
| 244 | + | ||
| 245 | + tcg_gen_ext32s_i64(t0, a); | ||
| 246 | + tcg_gen_ext32s_i64(t1, b); | ||
| 247 | + tcg_gen_mul_i64(t0, t0, t1); | ||
| 248 | + | ||
| 249 | + tcg_gen_trunc_i64_i32(d, t0); | ||
| 250 | + tcg_gen_shri_i64(t0, t0, 32); | ||
| 251 | + tcg_gen_trunc_i64_i32(d2, t0); | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +/* 64-bit unsigned muls, lower result in d and upper in d2. */ | ||
| 255 | +static void t_gen_mulu(TCGv d, TCGv d2, TCGv a, TCGv b) | ||
| 256 | +{ | ||
| 257 | + TCGv t0, t1; | ||
| 258 | + | ||
| 259 | + t0 = tcg_temp_new(TCG_TYPE_I64); | ||
| 260 | + t1 = tcg_temp_new(TCG_TYPE_I64); | ||
| 261 | + | ||
| 262 | + tcg_gen_extu_i32_i64(t0, a); | ||
| 263 | + tcg_gen_extu_i32_i64(t1, b); | ||
| 264 | + tcg_gen_mul_i64(t0, t0, t1); | ||
| 265 | + | ||
| 266 | + tcg_gen_trunc_i64_i32(d, t0); | ||
| 267 | + tcg_gen_shri_i64(t0, t0, 32); | ||
| 268 | + tcg_gen_trunc_i64_i32(d2, t0); | ||
| 269 | +} | ||
| 270 | + | ||
| 271 | +/* Extended arithmetics on CRIS. */ | ||
| 272 | +static inline void t_gen_add_flag(TCGv d, int flag) | ||
| 273 | +{ | ||
| 274 | + TCGv c; | ||
| 275 | + | ||
| 276 | + c = tcg_temp_new(TCG_TYPE_TL); | ||
| 277 | + t_gen_mov_TN_preg(c, PR_CCS); | ||
| 278 | + /* Propagate carry into d. */ | ||
| 279 | + tcg_gen_andi_tl(c, c, 1 << flag); | ||
| 280 | + if (flag) | ||
| 281 | + tcg_gen_shri_tl(c, c, flag); | ||
| 282 | + tcg_gen_add_tl(d, d, c); | ||
| 283 | +} | ||
| 284 | + | ||
| 285 | +static inline void t_gen_addx_carry(TCGv d) | ||
| 286 | +{ | ||
| 287 | + TCGv x, c; | ||
| 288 | + | ||
| 289 | + x = tcg_temp_new(TCG_TYPE_TL); | ||
| 290 | + c = tcg_temp_new(TCG_TYPE_TL); | ||
| 291 | + t_gen_mov_TN_preg(x, PR_CCS); | ||
| 292 | + tcg_gen_mov_tl(c, x); | ||
| 293 | + | ||
| 294 | + /* Propagate carry into d if X is set. Branch free. */ | ||
| 295 | + tcg_gen_andi_tl(c, c, C_FLAG); | ||
| 296 | + tcg_gen_andi_tl(x, x, X_FLAG); | ||
| 297 | + tcg_gen_shri_tl(x, x, 4); | ||
| 298 | + | ||
| 299 | + tcg_gen_and_tl(x, x, c); | ||
| 300 | + tcg_gen_add_tl(d, d, x); | ||
| 301 | +} | ||
| 302 | + | ||
| 303 | +static inline void t_gen_subx_carry(TCGv d) | ||
| 304 | +{ | ||
| 305 | + TCGv x, c; | ||
| 306 | + | ||
| 307 | + x = tcg_temp_new(TCG_TYPE_TL); | ||
| 308 | + c = tcg_temp_new(TCG_TYPE_TL); | ||
| 309 | + t_gen_mov_TN_preg(x, PR_CCS); | ||
| 310 | + tcg_gen_mov_tl(c, x); | ||
| 311 | + | ||
| 312 | + /* Propagate carry into d if X is set. Branch free. */ | ||
| 313 | + tcg_gen_andi_tl(c, c, C_FLAG); | ||
| 314 | + tcg_gen_andi_tl(x, x, X_FLAG); | ||
| 315 | + tcg_gen_shri_tl(x, x, 4); | ||
| 316 | + | ||
| 317 | + tcg_gen_and_tl(x, x, c); | ||
| 318 | + tcg_gen_sub_tl(d, d, x); | ||
| 319 | +} | ||
| 320 | + | ||
| 321 | +/* Swap the two bytes within each half word of the s operand. | ||
| 322 | + T0 = ((T0 << 8) & 0xff00ff00) | ((T0 >> 8) & 0x00ff00ff) */ | ||
| 323 | +static inline void t_gen_swapb(TCGv d, TCGv s) | ||
| 324 | +{ | ||
| 325 | + TCGv t, org_s; | ||
| 326 | + | ||
| 327 | + t = tcg_temp_new(TCG_TYPE_TL); | ||
| 328 | + org_s = tcg_temp_new(TCG_TYPE_TL); | ||
| 329 | + | ||
| 330 | + /* d and s may refer to the same object. */ | ||
| 331 | + tcg_gen_mov_tl(org_s, s); | ||
| 332 | + tcg_gen_shli_tl(t, org_s, 8); | ||
| 333 | + tcg_gen_andi_tl(d, t, 0xff00ff00); | ||
| 334 | + tcg_gen_shri_tl(t, org_s, 8); | ||
| 335 | + tcg_gen_andi_tl(t, t, 0x00ff00ff); | ||
| 336 | + tcg_gen_or_tl(d, d, t); | ||
| 337 | +} | ||
| 338 | + | ||
| 339 | +/* Swap the halfwords of the s operand. */ | ||
| 340 | +static inline void t_gen_swapw(TCGv d, TCGv s) | ||
| 341 | +{ | ||
| 342 | + TCGv t; | ||
| 343 | + /* d and s refer the same object. */ | ||
| 344 | + t = tcg_temp_new(TCG_TYPE_TL); | ||
| 345 | + tcg_gen_mov_tl(t, s); | ||
| 346 | + tcg_gen_shli_tl(d, t, 16); | ||
| 347 | + tcg_gen_shri_tl(t, t, 16); | ||
| 348 | + tcg_gen_or_tl(d, d, t); | ||
| 349 | +} | ||
| 350 | + | ||
| 351 | +/* Reverse the within each byte. | ||
| 352 | + T0 = (((T0 << 7) & 0x80808080) | | ||
| 353 | + ((T0 << 5) & 0x40404040) | | ||
| 354 | + ((T0 << 3) & 0x20202020) | | ||
| 355 | + ((T0 << 1) & 0x10101010) | | ||
| 356 | + ((T0 >> 1) & 0x08080808) | | ||
| 357 | + ((T0 >> 3) & 0x04040404) | | ||
| 358 | + ((T0 >> 5) & 0x02020202) | | ||
| 359 | + ((T0 >> 7) & 0x01010101)); | ||
| 360 | + */ | ||
| 361 | +static inline void t_gen_swapr(TCGv d, TCGv s) | ||
| 362 | +{ | ||
| 363 | + struct { | ||
| 364 | + int shift; /* LSL when positive, LSR when negative. */ | ||
| 365 | + uint32_t mask; | ||
| 366 | + } bitrev [] = { | ||
| 367 | + {7, 0x80808080}, | ||
| 368 | + {5, 0x40404040}, | ||
| 369 | + {3, 0x20202020}, | ||
| 370 | + {1, 0x10101010}, | ||
| 371 | + {-1, 0x08080808}, | ||
| 372 | + {-3, 0x04040404}, | ||
| 373 | + {-5, 0x02020202}, | ||
| 374 | + {-7, 0x01010101} | ||
| 375 | + }; | ||
| 376 | + int i; | ||
| 377 | + TCGv t, org_s; | ||
| 378 | + | ||
| 379 | + /* d and s refer the same object. */ | ||
| 380 | + t = tcg_temp_new(TCG_TYPE_TL); | ||
| 381 | + org_s = tcg_temp_new(TCG_TYPE_TL); | ||
| 382 | + tcg_gen_mov_tl(org_s, s); | ||
| 383 | + | ||
| 384 | + tcg_gen_shli_tl(t, org_s, bitrev[0].shift); | ||
| 385 | + tcg_gen_andi_tl(d, t, bitrev[0].mask); | ||
| 386 | + for (i = 1; i < sizeof bitrev / sizeof bitrev[0]; i++) { | ||
| 387 | + if (bitrev[i].shift >= 0) { | ||
| 388 | + tcg_gen_shli_tl(t, org_s, bitrev[i].shift); | ||
| 389 | + } else { | ||
| 390 | + tcg_gen_shri_tl(t, org_s, -bitrev[i].shift); | ||
| 391 | + } | ||
| 392 | + tcg_gen_andi_tl(t, t, bitrev[i].mask); | ||
| 393 | + tcg_gen_or_tl(d, d, t); | ||
| 394 | + } | ||
| 395 | +} | ||
| 396 | + | ||
| 237 | static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) | 397 | static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) |
| 238 | { | 398 | { |
| 239 | TranslationBlock *tb; | 399 | TranslationBlock *tb; |
| @@ -241,10 +401,10 @@ static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) | @@ -241,10 +401,10 @@ static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) | ||
| 241 | if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { | 401 | if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { |
| 242 | tcg_gen_goto_tb(n); | 402 | tcg_gen_goto_tb(n); |
| 243 | tcg_gen_movi_tl(cpu_T[0], dest); | 403 | tcg_gen_movi_tl(cpu_T[0], dest); |
| 244 | - gen_op_movl_pc_T0(); | 404 | + t_gen_mov_env_TN(pc, cpu_T[0]); |
| 245 | tcg_gen_exit_tb((long)tb + n); | 405 | tcg_gen_exit_tb((long)tb + n); |
| 246 | } else { | 406 | } else { |
| 247 | - gen_op_movl_pc_T0(); | 407 | + t_gen_mov_env_TN(pc, cpu_T[0]); |
| 248 | tcg_gen_exit_tb(0); | 408 | tcg_gen_exit_tb(0); |
| 249 | } | 409 | } |
| 250 | } | 410 | } |
| @@ -264,13 +424,9 @@ static int sign_extend(unsigned int val, unsigned int width) | @@ -264,13 +424,9 @@ static int sign_extend(unsigned int val, unsigned int width) | ||
| 264 | 424 | ||
| 265 | static inline void cris_clear_x_flag(DisasContext *dc) | 425 | static inline void cris_clear_x_flag(DisasContext *dc) |
| 266 | { | 426 | { |
| 267 | - TCGv ccs; | ||
| 268 | - | ||
| 269 | - ccs = tcg_temp_new(TCG_TYPE_TL); | ||
| 270 | - | ||
| 271 | - t_gen_mov_TN_preg(ccs, PR_CCS); | ||
| 272 | - tcg_gen_andi_i32(ccs, ccs, ~X_FLAG); | ||
| 273 | - t_gen_mov_preg_TN(PR_CCS, ccs); | 427 | + t_gen_mov_TN_preg(cpu_T[0], PR_CCS); |
| 428 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], ~X_FLAG); | ||
| 429 | + t_gen_mov_preg_TN(PR_CCS, cpu_T[0]); | ||
| 274 | dc->flagx_live = 1; | 430 | dc->flagx_live = 1; |
| 275 | dc->flags_x = 0; | 431 | dc->flags_x = 0; |
| 276 | } | 432 | } |
| @@ -339,7 +495,7 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask) | @@ -339,7 +495,7 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask) | ||
| 339 | if (mask == 0) | 495 | if (mask == 0) |
| 340 | dc->update_cc = 0; | 496 | dc->update_cc = 0; |
| 341 | else { | 497 | else { |
| 342 | - gen_op_update_cc_mask(mask); | 498 | + t_gen_mov_env_TN(cc_mask, tcg_const_tl(mask)); |
| 343 | dc->flags_live = 0; | 499 | dc->flags_live = 0; |
| 344 | } | 500 | } |
| 345 | } | 501 | } |
| @@ -347,13 +503,13 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask) | @@ -347,13 +503,13 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask) | ||
| 347 | static void cris_update_cc_op(DisasContext *dc, int op) | 503 | static void cris_update_cc_op(DisasContext *dc, int op) |
| 348 | { | 504 | { |
| 349 | dc->cc_op = op; | 505 | dc->cc_op = op; |
| 350 | - gen_op_update_cc_op(op); | ||
| 351 | dc->flags_live = 0; | 506 | dc->flags_live = 0; |
| 507 | + t_gen_mov_env_TN(cc_op, tcg_const_tl(op)); | ||
| 352 | } | 508 | } |
| 353 | static void cris_update_cc_size(DisasContext *dc, int size) | 509 | static void cris_update_cc_size(DisasContext *dc, int size) |
| 354 | { | 510 | { |
| 355 | dc->cc_size = size; | 511 | dc->cc_size = size; |
| 356 | - gen_op_update_cc_size_im(size); | 512 | + t_gen_mov_env_TN(cc_size, tcg_const_tl(size)); |
| 357 | } | 513 | } |
| 358 | 514 | ||
| 359 | /* op is the operation. | 515 | /* op is the operation. |
| @@ -364,10 +520,15 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -364,10 +520,15 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 364 | { | 520 | { |
| 365 | int writeback = 1; | 521 | int writeback = 1; |
| 366 | if (dc->update_cc) { | 522 | if (dc->update_cc) { |
| 523 | + | ||
| 367 | cris_update_cc_op(dc, op); | 524 | cris_update_cc_op(dc, op); |
| 368 | cris_update_cc_size(dc, size); | 525 | cris_update_cc_size(dc, size); |
| 369 | - gen_op_update_cc_x(dc->flagx_live, dc->flags_x); | ||
| 370 | - gen_op_update_cc_dest_T0(); | 526 | + t_gen_mov_env_TN(cc_dest, cpu_T[0]); |
| 527 | + | ||
| 528 | + /* FIXME: This shouldn't be needed. But we don't pass the | ||
| 529 | + tests without it. Investigate. */ | ||
| 530 | + t_gen_mov_env_TN(cc_x_live, tcg_const_tl(dc->flagx_live)); | ||
| 531 | + t_gen_mov_env_TN(cc_x, tcg_const_tl(dc->flags_x)); | ||
| 371 | } | 532 | } |
| 372 | 533 | ||
| 373 | /* Emit the ALU insns. */ | 534 | /* Emit the ALU insns. */ |
| @@ -376,25 +537,25 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -376,25 +537,25 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 376 | case CC_OP_ADD: | 537 | case CC_OP_ADD: |
| 377 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 538 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 378 | /* Extended arithmetics. */ | 539 | /* Extended arithmetics. */ |
| 379 | - gen_op_addxl_T0_C(); | 540 | + t_gen_addx_carry(cpu_T[0]); |
| 380 | break; | 541 | break; |
| 381 | case CC_OP_ADDC: | 542 | case CC_OP_ADDC: |
| 382 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 543 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 383 | - gen_op_addl_T0_C(); | 544 | + t_gen_add_flag(cpu_T[0], 0); /* C_FLAG. */ |
| 384 | break; | 545 | break; |
| 385 | case CC_OP_MCP: | 546 | case CC_OP_MCP: |
| 386 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 547 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 387 | - gen_op_addl_T0_R(); | 548 | + t_gen_add_flag(cpu_T[0], 8); /* R_FLAG. */ |
| 388 | break; | 549 | break; |
| 389 | case CC_OP_SUB: | 550 | case CC_OP_SUB: |
| 390 | - tcg_gen_sub_tl(cpu_T[1], tcg_const_i32(0), cpu_T[1]); | 551 | + tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]); |
| 391 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 552 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 553 | + tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]); | ||
| 392 | /* CRIS flag evaluation needs ~src. */ | 554 | /* CRIS flag evaluation needs ~src. */ |
| 393 | - tcg_gen_sub_tl(cpu_T[1], tcg_const_i32(0), cpu_T[1]); | ||
| 394 | - gen_op_not_T1_T1(); | 555 | + tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); |
| 395 | 556 | ||
| 396 | /* Extended arithmetics. */ | 557 | /* Extended arithmetics. */ |
| 397 | - gen_op_subxl_T0_C(); | 558 | + t_gen_subx_carry(cpu_T[0]); |
| 398 | break; | 559 | break; |
| 399 | case CC_OP_MOVE: | 560 | case CC_OP_MOVE: |
| 400 | tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); | 561 | tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); |
| @@ -418,11 +579,11 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -418,11 +579,11 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 418 | t_gen_asr(cpu_T[0], cpu_T[0], cpu_T[1]); | 579 | t_gen_asr(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 419 | break; | 580 | break; |
| 420 | case CC_OP_NEG: | 581 | case CC_OP_NEG: |
| 421 | - /* TCG-FIXME: this is not optimal. Many archs have | ||
| 422 | - fast neg insns. */ | ||
| 423 | - tcg_gen_sub_tl(cpu_T[0], tcg_const_i32(0), cpu_T[1]); | 582 | + /* Hopefully the TCG backend recognizes this pattern |
| 583 | + and makes a real neg out of it. */ | ||
| 584 | + tcg_gen_sub_tl(cpu_T[0], tcg_const_tl(0), cpu_T[1]); | ||
| 424 | /* Extended arithmetics. */ | 585 | /* Extended arithmetics. */ |
| 425 | - gen_op_subxl_T0_C(); | 586 | + t_gen_subx_carry(cpu_T[0]); |
| 426 | break; | 587 | break; |
| 427 | case CC_OP_LZ: | 588 | case CC_OP_LZ: |
| 428 | gen_op_lz_T0_T1(); | 589 | gen_op_lz_T0_T1(); |
| @@ -432,27 +593,44 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -432,27 +593,44 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 432 | writeback = 0; | 593 | writeback = 0; |
| 433 | break; | 594 | break; |
| 434 | case CC_OP_MULS: | 595 | case CC_OP_MULS: |
| 435 | - gen_op_muls_T0_T1(); | ||
| 436 | - break; | 596 | + { |
| 597 | + TCGv mof; | ||
| 598 | + mof = tcg_temp_new(TCG_TYPE_TL); | ||
| 599 | + t_gen_muls(cpu_T[0], mof, cpu_T[0], cpu_T[1]); | ||
| 600 | + t_gen_mov_preg_TN(PR_MOF, mof); | ||
| 601 | + } | ||
| 602 | + break; | ||
| 437 | case CC_OP_MULU: | 603 | case CC_OP_MULU: |
| 438 | - gen_op_mulu_T0_T1(); | ||
| 439 | - break; | 604 | + { |
| 605 | + TCGv mof; | ||
| 606 | + mof = tcg_temp_new(TCG_TYPE_TL); | ||
| 607 | + t_gen_mulu(cpu_T[0], mof, cpu_T[0], cpu_T[1]); | ||
| 608 | + t_gen_mov_preg_TN(PR_MOF, mof); | ||
| 609 | + } | ||
| 610 | + break; | ||
| 440 | case CC_OP_DSTEP: | 611 | case CC_OP_DSTEP: |
| 441 | gen_op_dstep_T0_T1(); | 612 | gen_op_dstep_T0_T1(); |
| 442 | break; | 613 | break; |
| 443 | case CC_OP_BOUND: | 614 | case CC_OP_BOUND: |
| 444 | - gen_op_bound_T0_T1(); | ||
| 445 | - break; | 615 | + { |
| 616 | + int l1; | ||
| 617 | + l1 = gen_new_label(); | ||
| 618 | + tcg_gen_brcond_tl(TCG_COND_LEU, | ||
| 619 | + cpu_T[0], cpu_T[1], l1); | ||
| 620 | + tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); | ||
| 621 | + gen_set_label(l1); | ||
| 622 | + } | ||
| 623 | + break; | ||
| 446 | case CC_OP_CMP: | 624 | case CC_OP_CMP: |
| 447 | - tcg_gen_sub_tl(cpu_T[1], tcg_const_i32(0), cpu_T[1]); | 625 | + tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]); |
| 448 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 626 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 449 | /* CRIS flag evaluation needs ~src. */ | 627 | /* CRIS flag evaluation needs ~src. */ |
| 450 | - tcg_gen_sub_tl(cpu_T[1], tcg_const_i32(0), cpu_T[1]); | 628 | + tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]); |
| 451 | /* CRIS flag evaluation needs ~src. */ | 629 | /* CRIS flag evaluation needs ~src. */ |
| 452 | - gen_op_not_T1_T1(); | 630 | + tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); |
| 453 | 631 | ||
| 454 | /* Extended arithmetics. */ | 632 | /* Extended arithmetics. */ |
| 455 | - gen_op_subxl_T0_C(); | 633 | + t_gen_subx_carry(cpu_T[0]); |
| 456 | writeback = 0; | 634 | writeback = 0; |
| 457 | break; | 635 | break; |
| 458 | default: | 636 | default: |
| @@ -462,7 +640,7 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -462,7 +640,7 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 462 | } | 640 | } |
| 463 | 641 | ||
| 464 | if (dc->update_cc) | 642 | if (dc->update_cc) |
| 465 | - gen_op_update_cc_src_T1(); | 643 | + t_gen_mov_env_TN(cc_src, cpu_T[1]); |
| 466 | 644 | ||
| 467 | if (size == 1) | 645 | if (size == 1) |
| 468 | tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xff); | 646 | tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xff); |
| @@ -486,7 +664,7 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | @@ -486,7 +664,7 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) | ||
| 486 | } | 664 | } |
| 487 | } | 665 | } |
| 488 | if (dc->update_cc) | 666 | if (dc->update_cc) |
| 489 | - gen_op_update_cc_result_T0(); | 667 | + t_gen_mov_env_TN(cc_result, cpu_T[0]); |
| 490 | 668 | ||
| 491 | { | 669 | { |
| 492 | /* TODO: Optimize this. */ | 670 | /* TODO: Optimize this. */ |
| @@ -617,8 +795,8 @@ static void cris_prepare_cc_branch (DisasContext *dc, int offset, int cond) | @@ -617,8 +795,8 @@ static void cris_prepare_cc_branch (DisasContext *dc, int offset, int cond) | ||
| 617 | gen_tst_cc (dc, cond); | 795 | gen_tst_cc (dc, cond); |
| 618 | gen_op_evaluate_bcc (); | 796 | gen_op_evaluate_bcc (); |
| 619 | } | 797 | } |
| 620 | - gen_op_movl_T0_im (dc->delayed_pc); | ||
| 621 | - gen_op_movl_btarget_T0 (); | 798 | + tcg_gen_movi_tl(cpu_T[0], dc->delayed_pc); |
| 799 | + t_gen_mov_env_TN(btarget, cpu_T[0]); | ||
| 622 | } | 800 | } |
| 623 | 801 | ||
| 624 | /* Dynamic jumps, when the dest is in a live reg for example. */ | 802 | /* Dynamic jumps, when the dest is in a live reg for example. */ |
| @@ -726,7 +904,7 @@ static void do_postinc (DisasContext *dc, int size) | @@ -726,7 +904,7 @@ static void do_postinc (DisasContext *dc, int size) | ||
| 726 | if (!dc->postinc) | 904 | if (!dc->postinc) |
| 727 | return; | 905 | return; |
| 728 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); | 906 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); |
| 729 | - gen_op_addl_T0_im(size); | 907 | + tcg_gen_addi_tl(cpu_T[0], cpu_T[0], size); |
| 730 | t_gen_mov_reg_TN(dc->op1, cpu_T[0]); | 908 | t_gen_mov_reg_TN(dc->op1, cpu_T[0]); |
| 731 | } | 909 | } |
| 732 | 910 | ||
| @@ -874,7 +1052,7 @@ static unsigned int dec_moveq(DisasContext *dc) | @@ -874,7 +1052,7 @@ static unsigned int dec_moveq(DisasContext *dc) | ||
| 874 | imm = sign_extend(dc->op1, 5); | 1052 | imm = sign_extend(dc->op1, 5); |
| 875 | DIS(fprintf (logfile, "moveq %d, $r%u\n", imm, dc->op2)); | 1053 | DIS(fprintf (logfile, "moveq %d, $r%u\n", imm, dc->op2)); |
| 876 | 1054 | ||
| 877 | - t_gen_mov_reg_TN(dc->op2, tcg_const_i32(imm)); | 1055 | + t_gen_mov_reg_TN(dc->op2, tcg_const_tl(imm)); |
| 878 | if (!dc->flagx_live || dc->flags_x) | 1056 | if (!dc->flagx_live || dc->flags_x) |
| 879 | cris_clear_x_flag(dc); | 1057 | cris_clear_x_flag(dc); |
| 880 | return 2; | 1058 | return 2; |
| @@ -940,7 +1118,7 @@ static unsigned int dec_btstq(DisasContext *dc) | @@ -940,7 +1118,7 @@ static unsigned int dec_btstq(DisasContext *dc) | ||
| 940 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); | 1118 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); |
| 941 | 1119 | ||
| 942 | cris_update_cc_op(dc, CC_OP_FLAGS); | 1120 | cris_update_cc_op(dc, CC_OP_FLAGS); |
| 943 | - gen_op_movl_flags_T0(); | 1121 | + t_gen_mov_preg_TN(PR_CCS, cpu_T[0]); |
| 944 | dc->flags_live = 1; | 1122 | dc->flags_live = 1; |
| 945 | return 2; | 1123 | return 2; |
| 946 | } | 1124 | } |
| @@ -1000,10 +1178,10 @@ static unsigned int dec_scc_r(DisasContext *dc) | @@ -1000,10 +1178,10 @@ static unsigned int dec_scc_r(DisasContext *dc) | ||
| 1000 | if (cond != CC_A) | 1178 | if (cond != CC_A) |
| 1001 | { | 1179 | { |
| 1002 | gen_tst_cc (dc, cond); | 1180 | gen_tst_cc (dc, cond); |
| 1003 | - gen_op_movl_T1_T0(); | 1181 | + tcg_gen_mov_tl(cpu_T[1], cpu_T[0]); |
| 1004 | } | 1182 | } |
| 1005 | else | 1183 | else |
| 1006 | - gen_op_movl_T1_im(1); | 1184 | + tcg_gen_movi_tl(cpu_T[1], 1); |
| 1007 | 1185 | ||
| 1008 | cris_cc_mask(dc, 0); | 1186 | cris_cc_mask(dc, 0); |
| 1009 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); | 1187 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); |
| @@ -1147,11 +1325,18 @@ static unsigned int dec_cmp_r(DisasContext *dc) | @@ -1147,11 +1325,18 @@ static unsigned int dec_cmp_r(DisasContext *dc) | ||
| 1147 | 1325 | ||
| 1148 | static unsigned int dec_abs_r(DisasContext *dc) | 1326 | static unsigned int dec_abs_r(DisasContext *dc) |
| 1149 | { | 1327 | { |
| 1328 | + int l1; | ||
| 1329 | + | ||
| 1150 | DIS(fprintf (logfile, "abs $r%u, $r%u\n", | 1330 | DIS(fprintf (logfile, "abs $r%u, $r%u\n", |
| 1151 | dc->op1, dc->op2)); | 1331 | dc->op1, dc->op2)); |
| 1152 | cris_cc_mask(dc, CC_MASK_NZ); | 1332 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1153 | dec_prep_move_r(dc, dc->op1, dc->op2, 4, 0); | 1333 | dec_prep_move_r(dc, dc->op1, dc->op2, 4, 0); |
| 1154 | - gen_op_absl_T1_T1(); | 1334 | + |
| 1335 | + /* TODO: consider a branch free approach. */ | ||
| 1336 | + l1 = gen_new_label(); | ||
| 1337 | + tcg_gen_brcond_tl(TCG_COND_GE, cpu_T[1], tcg_const_tl(0), l1); | ||
| 1338 | + tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]); | ||
| 1339 | + gen_set_label(l1); | ||
| 1155 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); | 1340 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); |
| 1156 | return 2; | 1341 | return 2; |
| 1157 | } | 1342 | } |
| @@ -1215,14 +1400,14 @@ static unsigned int dec_swap_r(DisasContext *dc) | @@ -1215,14 +1400,14 @@ static unsigned int dec_swap_r(DisasContext *dc) | ||
| 1215 | cris_cc_mask(dc, CC_MASK_NZ); | 1400 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1216 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); | 1401 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); |
| 1217 | if (dc->op2 & 8) | 1402 | if (dc->op2 & 8) |
| 1218 | - gen_op_not_T0_T0(); | 1403 | + tcg_gen_xori_tl(cpu_T[0], cpu_T[0], -1); |
| 1219 | if (dc->op2 & 4) | 1404 | if (dc->op2 & 4) |
| 1220 | - gen_op_swapw_T0_T0(); | 1405 | + t_gen_swapw(cpu_T[0], cpu_T[0]); |
| 1221 | if (dc->op2 & 2) | 1406 | if (dc->op2 & 2) |
| 1222 | - gen_op_swapb_T0_T0(); | 1407 | + t_gen_swapb(cpu_T[0], cpu_T[0]); |
| 1223 | if (dc->op2 & 1) | 1408 | if (dc->op2 & 1) |
| 1224 | - gen_op_swapr_T0_T0(); | ||
| 1225 | - gen_op_movl_T1_T0(); | 1409 | + t_gen_swapr(cpu_T[0], cpu_T[0]); |
| 1410 | + tcg_gen_mov_tl(cpu_T[1], cpu_T[0]); | ||
| 1226 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); | 1411 | crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); |
| 1227 | return 2; | 1412 | return 2; |
| 1228 | } | 1413 | } |
| @@ -1244,7 +1429,7 @@ static unsigned int dec_addi_r(DisasContext *dc) | @@ -1244,7 +1429,7 @@ static unsigned int dec_addi_r(DisasContext *dc) | ||
| 1244 | memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); | 1429 | memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); |
| 1245 | cris_cc_mask(dc, 0); | 1430 | cris_cc_mask(dc, 0); |
| 1246 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); | 1431 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); |
| 1247 | - t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_i32(dc->zzsize)); | 1432 | + t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_tl(dc->zzsize)); |
| 1248 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 1433 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 1249 | t_gen_mov_reg_TN(dc->op1, cpu_T[0]); | 1434 | t_gen_mov_reg_TN(dc->op1, cpu_T[0]); |
| 1250 | return 2; | 1435 | return 2; |
| @@ -1256,7 +1441,7 @@ static unsigned int dec_addi_acr(DisasContext *dc) | @@ -1256,7 +1441,7 @@ static unsigned int dec_addi_acr(DisasContext *dc) | ||
| 1256 | memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); | 1441 | memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); |
| 1257 | cris_cc_mask(dc, 0); | 1442 | cris_cc_mask(dc, 0); |
| 1258 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); | 1443 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); |
| 1259 | - t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_i32(dc->zzsize)); | 1444 | + t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_tl(dc->zzsize)); |
| 1260 | 1445 | ||
| 1261 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | 1446 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 1262 | t_gen_mov_reg_TN(R_ACR, cpu_T[0]); | 1447 | t_gen_mov_reg_TN(R_ACR, cpu_T[0]); |
| @@ -1283,7 +1468,7 @@ static unsigned int dec_btst_r(DisasContext *dc) | @@ -1283,7 +1468,7 @@ static unsigned int dec_btst_r(DisasContext *dc) | ||
| 1283 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); | 1468 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); |
| 1284 | 1469 | ||
| 1285 | cris_update_cc_op(dc, CC_OP_FLAGS); | 1470 | cris_update_cc_op(dc, CC_OP_FLAGS); |
| 1286 | - gen_op_movl_flags_T0(); | 1471 | + t_gen_mov_preg_TN(PR_CCS, cpu_T[0]); |
| 1287 | dc->flags_live = 1; | 1472 | dc->flags_live = 1; |
| 1288 | return 2; | 1473 | return 2; |
| 1289 | } | 1474 | } |
| @@ -1910,7 +2095,7 @@ static unsigned int dec_lapc_im(DisasContext *dc) | @@ -1910,7 +2095,7 @@ static unsigned int dec_lapc_im(DisasContext *dc) | ||
| 1910 | cris_cc_mask(dc, 0); | 2095 | cris_cc_mask(dc, 0); |
| 1911 | imm = ldl_code(dc->pc + 2); | 2096 | imm = ldl_code(dc->pc + 2); |
| 1912 | DIS(fprintf (logfile, "lapc 0x%x, $r%u\n", imm + dc->pc, dc->op2)); | 2097 | DIS(fprintf (logfile, "lapc 0x%x, $r%u\n", imm + dc->pc, dc->op2)); |
| 1913 | - t_gen_mov_reg_TN(rd, tcg_const_i32(dc->pc + imm)); | 2098 | + t_gen_mov_reg_TN(rd, tcg_const_tl(dc->pc + imm)); |
| 1914 | return 6; | 2099 | return 6; |
| 1915 | } | 2100 | } |
| 1916 | 2101 | ||
| @@ -1921,7 +2106,7 @@ static unsigned int dec_jump_p(DisasContext *dc) | @@ -1921,7 +2106,7 @@ static unsigned int dec_jump_p(DisasContext *dc) | ||
| 1921 | cris_cc_mask(dc, 0); | 2106 | cris_cc_mask(dc, 0); |
| 1922 | /* Store the return address in Pd. */ | 2107 | /* Store the return address in Pd. */ |
| 1923 | t_gen_mov_TN_preg(cpu_T[0], dc->op2); | 2108 | t_gen_mov_TN_preg(cpu_T[0], dc->op2); |
| 1924 | - gen_op_movl_btarget_T0(); | 2109 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 1925 | cris_prepare_dyn_jmp(dc); | 2110 | cris_prepare_dyn_jmp(dc); |
| 1926 | return 2; | 2111 | return 2; |
| 1927 | } | 2112 | } |
| @@ -1933,7 +2118,7 @@ static unsigned int dec_jas_r(DisasContext *dc) | @@ -1933,7 +2118,7 @@ static unsigned int dec_jas_r(DisasContext *dc) | ||
| 1933 | cris_cc_mask(dc, 0); | 2118 | cris_cc_mask(dc, 0); |
| 1934 | /* Stor the return address in Pd. */ | 2119 | /* Stor the return address in Pd. */ |
| 1935 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); | 2120 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); |
| 1936 | - gen_op_movl_btarget_T0(); | 2121 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 1937 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 4); | 2122 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 4); |
| 1938 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2123 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 1939 | cris_prepare_dyn_jmp(dc); | 2124 | cris_prepare_dyn_jmp(dc); |
| @@ -1950,7 +2135,7 @@ static unsigned int dec_jas_im(DisasContext *dc) | @@ -1950,7 +2135,7 @@ static unsigned int dec_jas_im(DisasContext *dc) | ||
| 1950 | cris_cc_mask(dc, 0); | 2135 | cris_cc_mask(dc, 0); |
| 1951 | /* Stor the return address in Pd. */ | 2136 | /* Stor the return address in Pd. */ |
| 1952 | tcg_gen_movi_tl(cpu_T[0], imm); | 2137 | tcg_gen_movi_tl(cpu_T[0], imm); |
| 1953 | - gen_op_movl_btarget_T0(); | 2138 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 1954 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8); | 2139 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8); |
| 1955 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2140 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 1956 | cris_prepare_dyn_jmp(dc); | 2141 | cris_prepare_dyn_jmp(dc); |
| @@ -1967,7 +2152,7 @@ static unsigned int dec_jasc_im(DisasContext *dc) | @@ -1967,7 +2152,7 @@ static unsigned int dec_jasc_im(DisasContext *dc) | ||
| 1967 | cris_cc_mask(dc, 0); | 2152 | cris_cc_mask(dc, 0); |
| 1968 | /* Stor the return address in Pd. */ | 2153 | /* Stor the return address in Pd. */ |
| 1969 | tcg_gen_movi_tl(cpu_T[0], imm); | 2154 | tcg_gen_movi_tl(cpu_T[0], imm); |
| 1970 | - gen_op_movl_btarget_T0(); | 2155 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 1971 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8 + 4); | 2156 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8 + 4); |
| 1972 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2157 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 1973 | cris_prepare_dyn_jmp(dc); | 2158 | cris_prepare_dyn_jmp(dc); |
| @@ -1980,7 +2165,7 @@ static unsigned int dec_jasc_r(DisasContext *dc) | @@ -1980,7 +2165,7 @@ static unsigned int dec_jasc_r(DisasContext *dc) | ||
| 1980 | cris_cc_mask(dc, 0); | 2165 | cris_cc_mask(dc, 0); |
| 1981 | /* Stor the return address in Pd. */ | 2166 | /* Stor the return address in Pd. */ |
| 1982 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); | 2167 | t_gen_mov_TN_reg(cpu_T[0], dc->op1); |
| 1983 | - gen_op_movl_btarget_T0(); | 2168 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 1984 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 4 + 4); | 2169 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 4 + 4); |
| 1985 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2170 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 1986 | cris_prepare_dyn_jmp(dc); | 2171 | cris_prepare_dyn_jmp(dc); |
| @@ -2016,7 +2201,7 @@ static unsigned int dec_bas_im(DisasContext *dc) | @@ -2016,7 +2201,7 @@ static unsigned int dec_bas_im(DisasContext *dc) | ||
| 2016 | cris_cc_mask(dc, 0); | 2201 | cris_cc_mask(dc, 0); |
| 2017 | /* Stor the return address in Pd. */ | 2202 | /* Stor the return address in Pd. */ |
| 2018 | tcg_gen_movi_tl(cpu_T[0], dc->pc + simm); | 2203 | tcg_gen_movi_tl(cpu_T[0], dc->pc + simm); |
| 2019 | - gen_op_movl_btarget_T0(); | 2204 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 2020 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8); | 2205 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 8); |
| 2021 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2206 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 2022 | cris_prepare_dyn_jmp(dc); | 2207 | cris_prepare_dyn_jmp(dc); |
| @@ -2032,7 +2217,7 @@ static unsigned int dec_basc_im(DisasContext *dc) | @@ -2032,7 +2217,7 @@ static unsigned int dec_basc_im(DisasContext *dc) | ||
| 2032 | cris_cc_mask(dc, 0); | 2217 | cris_cc_mask(dc, 0); |
| 2033 | /* Stor the return address in Pd. */ | 2218 | /* Stor the return address in Pd. */ |
| 2034 | tcg_gen_movi_tl(cpu_T[0], dc->pc + simm); | 2219 | tcg_gen_movi_tl(cpu_T[0], dc->pc + simm); |
| 2035 | - gen_op_movl_btarget_T0(); | 2220 | + t_gen_mov_env_TN(btarget, cpu_T[0]); |
| 2036 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 12); | 2221 | tcg_gen_movi_tl(cpu_T[0], dc->pc + 12); |
| 2037 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); | 2222 | t_gen_mov_preg_TN(dc->op2, cpu_T[0]); |
| 2038 | cris_prepare_dyn_jmp(dc); | 2223 | cris_prepare_dyn_jmp(dc); |
| @@ -2062,7 +2247,7 @@ static unsigned int dec_rfe_etc(DisasContext *dc) | @@ -2062,7 +2247,7 @@ static unsigned int dec_rfe_etc(DisasContext *dc) | ||
| 2062 | case 6: | 2247 | case 6: |
| 2063 | /* break. */ | 2248 | /* break. */ |
| 2064 | tcg_gen_movi_tl(cpu_T[0], dc->pc); | 2249 | tcg_gen_movi_tl(cpu_T[0], dc->pc); |
| 2065 | - gen_op_movl_pc_T0(); | 2250 | + t_gen_mov_env_TN(pc, cpu_T[0]); |
| 2066 | /* Breaks start at 16 in the exception vector. */ | 2251 | /* Breaks start at 16 in the exception vector. */ |
| 2067 | gen_op_break_im(dc->op1 + 16); | 2252 | gen_op_break_im(dc->op1 + 16); |
| 2068 | dc->is_jmp = DISAS_SWI; | 2253 | dc->is_jmp = DISAS_SWI; |
| @@ -2247,7 +2432,7 @@ static void check_breakpoint(CPUState *env, DisasContext *dc) | @@ -2247,7 +2432,7 @@ static void check_breakpoint(CPUState *env, DisasContext *dc) | ||
| 2247 | if (env->breakpoints[j] == dc->pc) { | 2432 | if (env->breakpoints[j] == dc->pc) { |
| 2248 | cris_evaluate_flags (dc); | 2433 | cris_evaluate_flags (dc); |
| 2249 | tcg_gen_movi_tl(cpu_T[0], dc->pc); | 2434 | tcg_gen_movi_tl(cpu_T[0], dc->pc); |
| 2250 | - gen_op_movl_pc_T0(); | 2435 | + t_gen_mov_env_TN(pc, cpu_T[0]); |
| 2251 | gen_op_debug(); | 2436 | gen_op_debug(); |
| 2252 | dc->is_jmp = DISAS_UPDATE; | 2437 | dc->is_jmp = DISAS_UPDATE; |
| 2253 | } | 2438 | } |
| @@ -2279,6 +2464,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, | @@ -2279,6 +2464,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, | ||
| 2279 | dc->singlestep_enabled = env->singlestep_enabled; | 2464 | dc->singlestep_enabled = env->singlestep_enabled; |
| 2280 | dc->flagx_live = 0; | 2465 | dc->flagx_live = 0; |
| 2281 | dc->flags_x = 0; | 2466 | dc->flags_x = 0; |
| 2467 | + | ||
| 2282 | next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; | 2468 | next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; |
| 2283 | lj = -1; | 2469 | lj = -1; |
| 2284 | do | 2470 | do |
| @@ -2333,8 +2519,8 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, | @@ -2333,8 +2519,8 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, | ||
| 2333 | && dc->pc < next_page_start); | 2519 | && dc->pc < next_page_start); |
| 2334 | 2520 | ||
| 2335 | if (!dc->is_jmp) { | 2521 | if (!dc->is_jmp) { |
| 2336 | - gen_op_movl_T0_im((long)dc->pc); | ||
| 2337 | - gen_op_movl_pc_T0(); | 2522 | + tcg_gen_movi_tl(cpu_T[0], dc->pc); |
| 2523 | + t_gen_mov_env_TN(pc, cpu_T[0]); | ||
| 2338 | } | 2524 | } |
| 2339 | 2525 | ||
| 2340 | cris_evaluate_flags (dc); | 2526 | cris_evaluate_flags (dc); |