comparison src/cpu/x86/vm/x86_64.ad @ 3839:3d42f82cd811

7063628: Use cbcond on T4 Summary: Add new short branch instruction to Hotspot sparc assembler. Reviewed-by: never, twisti, jrose
author kvn
date Thu, 21 Jul 2011 11:25:07 -0700
parents de6a837d75cf
children c7b60b601eb4
comparison
equal deleted inserted replaced
3838:6a991dcb52bb 3839:3d42f82cd811
2426 } 2426 }
2427 %} 2427 %}
2428 2428
2429 enc_class Lbl(label labl) 2429 enc_class Lbl(label labl)
2430 %{ 2430 %{
2431 // JMP, CALL 2431 // GOTO
2432 Label* l = $labl$$label; 2432 Label* l = $labl$$label;
2433 emit_d32(cbuf, l ? (l->loc_pos() - (cbuf.insts_size() + 4)) : 0); 2433 emit_d32(cbuf, (l->loc_pos() - (cbuf.insts_size() + 4)));
2434 %} 2434 %}
2435 2435
2436 enc_class LblShort(label labl) 2436 enc_class LblShort(label labl)
2437 %{ 2437 %{
2438 // JMP, CALL 2438 // GOTO
2439 Label* l = $labl$$label; 2439 Label* l = $labl$$label;
2440 int disp = l ? (l->loc_pos() - (cbuf.insts_size() + 1)) : 0; 2440 int disp = l->loc_pos() - (cbuf.insts_size() + 1);
2441 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp"); 2441 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp");
2442 emit_d8(cbuf, disp); 2442 emit_d8(cbuf, disp);
2443 %} 2443 %}
2444 2444
2445 enc_class opc2_reg(rRegI dst) 2445 enc_class opc2_reg(rRegI dst)
2464 %{ 2464 %{
2465 // JCC 2465 // JCC
2466 Label* l = $labl$$label; 2466 Label* l = $labl$$label;
2467 $$$emit8$primary; 2467 $$$emit8$primary;
2468 emit_cc(cbuf, $secondary, $cop$$cmpcode); 2468 emit_cc(cbuf, $secondary, $cop$$cmpcode);
2469 emit_d32(cbuf, l ? (l->loc_pos() - (cbuf.insts_size() + 4)) : 0); 2469 emit_d32(cbuf, (l->loc_pos() - (cbuf.insts_size() + 4)));
2470 %} 2470 %}
2471 2471
2472 enc_class JccShort (cmpOp cop, label labl) 2472 enc_class JccShort (cmpOp cop, label labl)
2473 %{ 2473 %{
2474 // JCC 2474 // JCC
2475 Label *l = $labl$$label; 2475 Label *l = $labl$$label;
2476 emit_cc(cbuf, $primary, $cop$$cmpcode); 2476 emit_cc(cbuf, $primary, $cop$$cmpcode);
2477 int disp = l ? (l->loc_pos() - (cbuf.insts_size() + 1)) : 0; 2477 int disp = l->loc_pos() - (cbuf.insts_size() + 1);
2478 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp"); 2478 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp");
2479 emit_d8(cbuf, disp); 2479 emit_d8(cbuf, disp);
2480 %} 2480 %}
2481 2481
2482 enc_class enc_cmov(cmpOp cop) 2482 enc_class enc_cmov(cmpOp cop)
12129 $$$emit8$primary; 12129 $$$emit8$primary;
12130 emit_cc(cbuf, $secondary, Assembler::parity); 12130 emit_cc(cbuf, $secondary, Assembler::parity);
12131 int parity_disp = -1; 12131 int parity_disp = -1;
12132 if ($cop$$cmpcode == Assembler::notEqual) { 12132 if ($cop$$cmpcode == Assembler::notEqual) {
12133 // the two jumps 6 bytes apart so the jump distances are too 12133 // the two jumps 6 bytes apart so the jump distances are too
12134 parity_disp = l ? (l->loc_pos() - (cbuf.insts_size() + 4)) : 0; 12134 parity_disp = l->loc_pos() - (cbuf.insts_size() + 4);
12135 } else if ($cop$$cmpcode == Assembler::equal) { 12135 } else if ($cop$$cmpcode == Assembler::equal) {
12136 parity_disp = 6; 12136 parity_disp = 6;
12137 } else { 12137 } else {
12138 ShouldNotReachHere(); 12138 ShouldNotReachHere();
12139 } 12139 }
12140 emit_d32(cbuf, parity_disp); 12140 emit_d32(cbuf, parity_disp);
12141 $$$emit8$primary; 12141 $$$emit8$primary;
12142 emit_cc(cbuf, $secondary, $cop$$cmpcode); 12142 emit_cc(cbuf, $secondary, $cop$$cmpcode);
12143 int disp = l ? (l->loc_pos() - (cbuf.insts_size() + 4)) : 0; 12143 int disp = l->loc_pos() - (cbuf.insts_size() + 4);
12144 emit_d32(cbuf, disp); 12144 emit_d32(cbuf, disp);
12145 %} 12145 %}
12146 ins_pipe(pipe_jcc); 12146 ins_pipe(pipe_jcc);
12147 ins_pc_relative(1); 12147 ins_pc_relative(1);
12148 %} 12148 %}
12333 ins_encode %{ 12333 ins_encode %{
12334 Label* l = $labl$$label; 12334 Label* l = $labl$$label;
12335 emit_cc(cbuf, $primary, Assembler::parity); 12335 emit_cc(cbuf, $primary, Assembler::parity);
12336 int parity_disp = -1; 12336 int parity_disp = -1;
12337 if ($cop$$cmpcode == Assembler::notEqual) { 12337 if ($cop$$cmpcode == Assembler::notEqual) {
12338 parity_disp = l ? (l->loc_pos() - (cbuf.insts_size() + 1)) : 0; 12338 parity_disp = l->loc_pos() - (cbuf.insts_size() + 1);
12339 } else if ($cop$$cmpcode == Assembler::equal) { 12339 } else if ($cop$$cmpcode == Assembler::equal) {
12340 parity_disp = 2; 12340 parity_disp = 2;
12341 } else { 12341 } else {
12342 ShouldNotReachHere(); 12342 ShouldNotReachHere();
12343 } 12343 }
12344 emit_d8(cbuf, parity_disp); 12344 emit_d8(cbuf, parity_disp);
12345 emit_cc(cbuf, $primary, $cop$$cmpcode); 12345 emit_cc(cbuf, $primary, $cop$$cmpcode);
12346 int disp = l ? (l->loc_pos() - (cbuf.insts_size() + 1)) : 0; 12346 int disp = l->loc_pos() - (cbuf.insts_size() + 1);
12347 emit_d8(cbuf, disp); 12347 emit_d8(cbuf, disp);
12348 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp"); 12348 assert(-128 <= disp && disp <= 127, "Displacement too large for short jmp");
12349 assert(-128 <= parity_disp && parity_disp <= 127, "Displacement too large for short jmp"); 12349 assert(-128 <= parity_disp && parity_disp <= 127, "Displacement too large for short jmp");
12350 %} 12350 %}
12351 ins_pipe(pipe_jcc); 12351 ins_pipe(pipe_jcc);