Commit affa3264db0fa0508d3fe9755592a21f48cc077e

Authored by bellard
1 parent 0a6b7b78

jump optimizations

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4582 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 9 additions and 31 deletions
tcg/i386/tcg-target.c
@@ -40,7 +40,6 @@ int tcg_target_reg_alloc_order[] = { @@ -40,7 +40,6 @@ int tcg_target_reg_alloc_order[] = {
40 TCG_REG_ESI, 40 TCG_REG_ESI,
41 TCG_REG_EDI, 41 TCG_REG_EDI,
42 TCG_REG_EBP, 42 TCG_REG_EBP,
43 - TCG_REG_ESP,  
44 }; 43 };
45 44
46 const int tcg_target_call_iarg_regs[3] = { TCG_REG_EAX, TCG_REG_EDX, TCG_REG_ECX }; 45 const int tcg_target_call_iarg_regs[3] = { TCG_REG_EAX, TCG_REG_EDX, TCG_REG_ECX };
@@ -329,38 +328,17 @@ static void tcg_out_brcond(TCGContext *s, int cond, @@ -329,38 +328,17 @@ static void tcg_out_brcond(TCGContext *s, int cond,
329 TCGArg arg1, TCGArg arg2, int const_arg2, 328 TCGArg arg1, TCGArg arg2, int const_arg2,
330 int label_index) 329 int label_index)
331 { 330 {
332 - int c;  
333 if (const_arg2) { 331 if (const_arg2) {
334 if (arg2 == 0) { 332 if (arg2 == 0) {
335 - /* use test */  
336 - switch(cond) {  
337 - case TCG_COND_EQ:  
338 - c = JCC_JE;  
339 - break;  
340 - case TCG_COND_NE:  
341 - c = JCC_JNE;  
342 - break;  
343 - case TCG_COND_LT:  
344 - c = JCC_JS;  
345 - break;  
346 - case TCG_COND_GE:  
347 - c = JCC_JNS;  
348 - break;  
349 - default:  
350 - goto do_cmpi;  
351 - }  
352 /* test r, r */ 333 /* test r, r */
353 tcg_out_modrm(s, 0x85, arg1, arg1); 334 tcg_out_modrm(s, 0x85, arg1, arg1);
354 - tcg_out_jxx(s, c, label_index);  
355 } else { 335 } else {
356 - do_cmpi:  
357 tgen_arithi(s, ARITH_CMP, arg1, arg2); 336 tgen_arithi(s, ARITH_CMP, arg1, arg2);
358 - tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index);  
359 } 337 }
360 } else { 338 } else {
361 tcg_out_modrm(s, 0x01 | (ARITH_CMP << 3), arg2, arg1); 339 tcg_out_modrm(s, 0x01 | (ARITH_CMP << 3), arg2, arg1);
362 - tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index);  
363 } 340 }
  341 + tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index);
364 } 342 }
365 343
366 /* XXX: we implement it at the target level to avoid having to 344 /* XXX: we implement it at the target level to avoid having to
@@ -381,42 +359,42 @@ static void tcg_out_brcond2(TCGContext *s, @@ -381,42 +359,42 @@ static void tcg_out_brcond2(TCGContext *s,
381 break; 359 break;
382 case TCG_COND_LT: 360 case TCG_COND_LT:
383 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]); 361 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]);
384 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 362 + tcg_out_jxx(s, JCC_JNE, label_next);
385 tcg_out_brcond(s, TCG_COND_LT, args[0], args[2], const_args[2], args[5]); 363 tcg_out_brcond(s, TCG_COND_LT, args[0], args[2], const_args[2], args[5]);
386 break; 364 break;
387 case TCG_COND_LE: 365 case TCG_COND_LE:
388 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]); 366 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]);
389 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 367 + tcg_out_jxx(s, JCC_JNE, label_next);
390 tcg_out_brcond(s, TCG_COND_LE, args[0], args[2], const_args[2], args[5]); 368 tcg_out_brcond(s, TCG_COND_LE, args[0], args[2], const_args[2], args[5]);
391 break; 369 break;
392 case TCG_COND_GT: 370 case TCG_COND_GT:
393 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]); 371 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]);
394 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 372 + tcg_out_jxx(s, JCC_JNE, label_next);
395 tcg_out_brcond(s, TCG_COND_GT, args[0], args[2], const_args[2], args[5]); 373 tcg_out_brcond(s, TCG_COND_GT, args[0], args[2], const_args[2], args[5]);
396 break; 374 break;
397 case TCG_COND_GE: 375 case TCG_COND_GE:
398 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]); 376 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]);
399 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 377 + tcg_out_jxx(s, JCC_JNE, label_next);
400 tcg_out_brcond(s, TCG_COND_GE, args[0], args[2], const_args[2], args[5]); 378 tcg_out_brcond(s, TCG_COND_GE, args[0], args[2], const_args[2], args[5]);
401 break; 379 break;
402 case TCG_COND_LTU: 380 case TCG_COND_LTU:
403 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]); 381 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]);
404 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 382 + tcg_out_jxx(s, JCC_JNE, label_next);
405 tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2], args[5]); 383 tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2], args[5]);
406 break; 384 break;
407 case TCG_COND_LEU: 385 case TCG_COND_LEU:
408 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]); 386 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]);
409 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 387 + tcg_out_jxx(s, JCC_JNE, label_next);
410 tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2], args[5]); 388 tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2], args[5]);
411 break; 389 break;
412 case TCG_COND_GTU: 390 case TCG_COND_GTU:
413 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]); 391 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]);
414 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 392 + tcg_out_jxx(s, JCC_JNE, label_next);
415 tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2], args[5]); 393 tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2], args[5]);
416 break; 394 break;
417 case TCG_COND_GEU: 395 case TCG_COND_GEU:
418 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]); 396 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]);
419 - tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], label_next); 397 + tcg_out_jxx(s, JCC_JNE, label_next);
420 tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2], args[5]); 398 tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2], args[5]);
421 break; 399 break;
422 default: 400 default: