comparison src/cpu/x86/vm/x86_64.ad @ 14495:cd5d10655495

8027754: Enable loop optimizations for loops with MathExact inside Reviewed-by: kvn, iveresov
author rbackman
date Thu, 23 Jan 2014 12:08:28 +0100
parents 5292439ef895
children 9e9af3aa4278 4ca6dc0799b6
comparison
equal deleted inserted replaced
14494:5292439ef895 14495:cd5d10655495
1655 1655
1656 const RegMask Matcher::method_handle_invoke_SP_save_mask() { 1656 const RegMask Matcher::method_handle_invoke_SP_save_mask() {
1657 return PTR_RBP_REG_mask(); 1657 return PTR_RBP_REG_mask();
1658 } 1658 }
1659 1659
1660 const RegMask Matcher::mathExactI_result_proj_mask() {
1661 return INT_RAX_REG_mask();
1662 }
1663
1664 const RegMask Matcher::mathExactL_result_proj_mask() {
1665 return LONG_RAX_REG_mask();
1666 }
1667
1668 const RegMask Matcher::mathExactI_flags_proj_mask() {
1669 return INT_FLAGS_mask();
1670 }
1671
1672 %} 1660 %}
1673 1661
1674 //----------ENCODING BLOCK----------------------------------------------------- 1662 //----------ENCODING BLOCK-----------------------------------------------------
1675 // This block specifies the encoding classes used by the compiler to 1663 // This block specifies the encoding classes used by the compiler to
1676 // output byte streams. Encoding classes are parameterized macros 1664 // output byte streams. Encoding classes are parameterized macros
6736 %} 6724 %}
6737 6725
6738 //----------Arithmetic Instructions-------------------------------------------- 6726 //----------Arithmetic Instructions--------------------------------------------
6739 //----------Addition Instructions---------------------------------------------- 6727 //----------Addition Instructions----------------------------------------------
6740 6728
6741 instruct addExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
6742 %{
6743 match(AddExactI dst src);
6744 effect(DEF cr);
6745
6746 format %{ "addl $dst, $src\t# addExact int" %}
6747 ins_encode %{
6748 __ addl($dst$$Register, $src$$Register);
6749 %}
6750 ins_pipe(ialu_reg_reg);
6751 %}
6752
6753 instruct addExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr)
6754 %{
6755 match(AddExactI dst src);
6756 effect(DEF cr);
6757
6758 format %{ "addl $dst, $src\t# addExact int" %}
6759 ins_encode %{
6760 __ addl($dst$$Register, $src$$constant);
6761 %}
6762 ins_pipe(ialu_reg_reg);
6763 %}
6764
6765 instruct addExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
6766 %{
6767 match(AddExactI dst (LoadI src));
6768 effect(DEF cr);
6769
6770 ins_cost(125); // XXX
6771 format %{ "addl $dst, $src\t# addExact int" %}
6772 ins_encode %{
6773 __ addl($dst$$Register, $src$$Address);
6774 %}
6775
6776 ins_pipe(ialu_reg_mem);
6777 %}
6778
6779 instruct addExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
6780 %{
6781 match(AddExactL dst src);
6782 effect(DEF cr);
6783
6784 format %{ "addq $dst, $src\t# addExact long" %}
6785 ins_encode %{
6786 __ addq($dst$$Register, $src$$Register);
6787 %}
6788 ins_pipe(ialu_reg_reg);
6789 %}
6790
6791 instruct addExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr)
6792 %{
6793 match(AddExactL dst src);
6794 effect(DEF cr);
6795
6796 format %{ "addq $dst, $src\t# addExact long" %}
6797 ins_encode %{
6798 __ addq($dst$$Register, $src$$constant);
6799 %}
6800 ins_pipe(ialu_reg_reg);
6801 %}
6802
6803 instruct addExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr)
6804 %{
6805 match(AddExactL dst (LoadL src));
6806 effect(DEF cr);
6807
6808 ins_cost(125); // XXX
6809 format %{ "addq $dst, $src\t# addExact long" %}
6810 ins_encode %{
6811 __ addq($dst$$Register, $src$$Address);
6812 %}
6813
6814 ins_pipe(ialu_reg_mem);
6815 %}
6816
6817 instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr) 6729 instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr)
6818 %{ 6730 %{
6819 match(Set dst (AddI dst src)); 6731 match(Set dst (AddI dst src));
6820 effect(KILL cr); 6732 effect(KILL cr);
6821 6733
7424 opcode(0x81); /* Opcode 81 /5 id */ 7336 opcode(0x81); /* Opcode 81 /5 id */
7425 ins_encode(REX_mem(dst), OpcSE(src), RM_opc_mem(0x05, dst), Con8or32(src)); 7337 ins_encode(REX_mem(dst), OpcSE(src), RM_opc_mem(0x05, dst), Con8or32(src));
7426 ins_pipe(ialu_mem_imm); 7338 ins_pipe(ialu_mem_imm);
7427 %} 7339 %}
7428 7340
7429 instruct subExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
7430 %{
7431 match(SubExactI dst src);
7432 effect(DEF cr);
7433
7434 format %{ "subl $dst, $src\t# subExact int" %}
7435 ins_encode %{
7436 __ subl($dst$$Register, $src$$Register);
7437 %}
7438 ins_pipe(ialu_reg_reg);
7439 %}
7440
7441 instruct subExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr)
7442 %{
7443 match(SubExactI dst src);
7444 effect(DEF cr);
7445
7446 format %{ "subl $dst, $src\t# subExact int" %}
7447 ins_encode %{
7448 __ subl($dst$$Register, $src$$constant);
7449 %}
7450 ins_pipe(ialu_reg_reg);
7451 %}
7452
7453 instruct subExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
7454 %{
7455 match(SubExactI dst (LoadI src));
7456 effect(DEF cr);
7457
7458 ins_cost(125);
7459 format %{ "subl $dst, $src\t# subExact int" %}
7460 ins_encode %{
7461 __ subl($dst$$Register, $src$$Address);
7462 %}
7463 ins_pipe(ialu_reg_mem);
7464 %}
7465
7466 instruct subExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
7467 %{
7468 match(SubExactL dst src);
7469 effect(DEF cr);
7470
7471 format %{ "subq $dst, $src\t# subExact long" %}
7472 ins_encode %{
7473 __ subq($dst$$Register, $src$$Register);
7474 %}
7475 ins_pipe(ialu_reg_reg);
7476 %}
7477
7478 instruct subExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr)
7479 %{
7480 match(SubExactL dst (LoadL src));
7481 effect(DEF cr);
7482
7483 format %{ "subq $dst, $src\t# subExact long" %}
7484 ins_encode %{
7485 __ subq($dst$$Register, $src$$constant);
7486 %}
7487 ins_pipe(ialu_reg_reg);
7488 %}
7489
7490 instruct subExactL_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
7491 %{
7492 match(SubExactI dst src);
7493 effect(DEF cr);
7494
7495 ins_cost(125);
7496 format %{ "subq $dst, $src\t# subExact long" %}
7497 ins_encode %{
7498 __ subq($dst$$Register, $src$$Address);
7499 %}
7500 ins_pipe(ialu_reg_mem);
7501 %}
7502
7503 instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr) 7341 instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr)
7504 %{ 7342 %{
7505 match(Set dst (SubL dst src)); 7343 match(Set dst (SubL dst src));
7506 effect(KILL cr); 7344 effect(KILL cr);
7507 7345
7614 opcode(0xF7, 0x03); // Opcode F7 /3 7452 opcode(0xF7, 0x03); // Opcode F7 /3
7615 ins_encode(REX_mem_wide(dst), OpcP, RM_opc_mem(secondary, dst)); 7453 ins_encode(REX_mem_wide(dst), OpcP, RM_opc_mem(secondary, dst));
7616 ins_pipe(ialu_reg); 7454 ins_pipe(ialu_reg);
7617 %} 7455 %}
7618 7456
7619 instruct negExactI_rReg(rax_RegI dst, rFlagsReg cr)
7620 %{
7621 match(NegExactI dst);
7622 effect(KILL cr);
7623
7624 format %{ "negl $dst\t# negExact int" %}
7625 ins_encode %{
7626 __ negl($dst$$Register);
7627 %}
7628 ins_pipe(ialu_reg);
7629 %}
7630
7631 instruct negExactL_rReg(rax_RegL dst, rFlagsReg cr)
7632 %{
7633 match(NegExactL dst);
7634 effect(KILL cr);
7635
7636 format %{ "negq $dst\t# negExact long" %}
7637 ins_encode %{
7638 __ negq($dst$$Register);
7639 %}
7640 ins_pipe(ialu_reg);
7641 %}
7642
7643
7644 //----------Multiplication/Division Instructions------------------------------- 7457 //----------Multiplication/Division Instructions-------------------------------
7645 // Integer Multiplication Instructions 7458 // Integer Multiplication Instructions
7646 // Multiply Register 7459 // Multiply Register
7647 7460
7648 instruct mulI_rReg(rRegI dst, rRegI src, rFlagsReg cr) 7461 instruct mulI_rReg(rRegI dst, rRegI src, rFlagsReg cr)
7753 ins_cost(300); 7566 ins_cost(300);
7754 format %{ "imulq RDX:RAX, RAX, $src\t# mulhi" %} 7567 format %{ "imulq RDX:RAX, RAX, $src\t# mulhi" %}
7755 opcode(0xF7, 0x5); /* Opcode F7 /5 */ 7568 opcode(0xF7, 0x5); /* Opcode F7 /5 */
7756 ins_encode(REX_reg_wide(src), OpcP, reg_opc(src)); 7569 ins_encode(REX_reg_wide(src), OpcP, reg_opc(src));
7757 ins_pipe(ialu_reg_reg_alu0); 7570 ins_pipe(ialu_reg_reg_alu0);
7758 %}
7759
7760
7761 instruct mulExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
7762 %{
7763 match(MulExactI dst src);
7764 effect(DEF cr);
7765
7766 ins_cost(300);
7767 format %{ "imull $dst, $src\t# mulExact int" %}
7768 ins_encode %{
7769 __ imull($dst$$Register, $src$$Register);
7770 %}
7771 ins_pipe(ialu_reg_reg_alu0);
7772 %}
7773
7774
7775 instruct mulExactI_rReg_imm(rax_RegI dst, rRegI src, immI imm, rFlagsReg cr)
7776 %{
7777 match(MulExactI src imm);
7778 effect(DEF cr);
7779
7780 ins_cost(300);
7781 format %{ "imull $dst, $src, $imm\t# mulExact int" %}
7782 ins_encode %{
7783 __ imull($dst$$Register, $src$$Register, $imm$$constant);
7784 %}
7785 ins_pipe(ialu_reg_reg_alu0);
7786 %}
7787
7788 instruct mulExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
7789 %{
7790 match(MulExactI dst (LoadI src));
7791 effect(DEF cr);
7792
7793 ins_cost(350);
7794 format %{ "imull $dst, $src\t# mulExact int" %}
7795 ins_encode %{
7796 __ imull($dst$$Register, $src$$Address);
7797 %}
7798 ins_pipe(ialu_reg_mem_alu0);
7799 %}
7800
7801 instruct mulExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
7802 %{
7803 match(MulExactL dst src);
7804 effect(DEF cr);
7805
7806 ins_cost(300);
7807 format %{ "imulq $dst, $src\t# mulExact long" %}
7808 ins_encode %{
7809 __ imulq($dst$$Register, $src$$Register);
7810 %}
7811 ins_pipe(ialu_reg_reg_alu0);
7812 %}
7813
7814 instruct mulExactL_rReg_imm(rax_RegL dst, rRegL src, immL32 imm, rFlagsReg cr)
7815 %{
7816 match(MulExactL src imm);
7817 effect(DEF cr);
7818
7819 ins_cost(300);
7820 format %{ "imulq $dst, $src, $imm\t# mulExact long" %}
7821 ins_encode %{
7822 __ imulq($dst$$Register, $src$$Register, $imm$$constant);
7823 %}
7824 ins_pipe(ialu_reg_reg_alu0);
7825 %}
7826
7827 instruct mulExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr)
7828 %{
7829 match(MulExactL dst (LoadL src));
7830 effect(DEF cr);
7831
7832 ins_cost(350);
7833 format %{ "imulq $dst, $src\t# mulExact long" %}
7834 ins_encode %{
7835 __ imulq($dst$$Register, $src$$Address);
7836 %}
7837 ins_pipe(ialu_reg_mem_alu0);
7838 %} 7571 %}
7839 7572
7840 instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, 7573 instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div,
7841 rFlagsReg cr) 7574 rFlagsReg cr)
7842 %{ 7575 %{
10441 __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, 10174 __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register,
10442 $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, 10175 $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister,
10443 $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register); 10176 $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register);
10444 %} 10177 %}
10445 ins_pipe( pipe_slow ); 10178 ins_pipe( pipe_slow );
10179 %}
10180
10181 //----------Overflow Math Instructions-----------------------------------------
10182
10183 instruct overflowAddI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2)
10184 %{
10185 match(Set cr (OverflowAddI op1 op2));
10186 effect(DEF cr, USE_KILL op1, USE op2);
10187
10188 format %{ "addl $op1, $op2\t# overflow check int" %}
10189
10190 ins_encode %{
10191 __ addl($op1$$Register, $op2$$Register);
10192 %}
10193 ins_pipe(ialu_reg_reg);
10194 %}
10195
10196 instruct overflowAddI_rReg_imm(rFlagsReg cr, rax_RegI op1, immI op2)
10197 %{
10198 match(Set cr (OverflowAddI op1 op2));
10199 effect(DEF cr, USE_KILL op1, USE op2);
10200
10201 format %{ "addl $op1, $op2\t# overflow check int" %}
10202
10203 ins_encode %{
10204 __ addl($op1$$Register, $op2$$constant);
10205 %}
10206 ins_pipe(ialu_reg_reg);
10207 %}
10208
10209 instruct overflowAddL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2)
10210 %{
10211 match(Set cr (OverflowAddL op1 op2));
10212 effect(DEF cr, USE_KILL op1, USE op2);
10213
10214 format %{ "addq $op1, $op2\t# overflow check long" %}
10215 ins_encode %{
10216 __ addq($op1$$Register, $op2$$Register);
10217 %}
10218 ins_pipe(ialu_reg_reg);
10219 %}
10220
10221 instruct overflowAddL_rReg_imm(rFlagsReg cr, rax_RegL op1, immL32 op2)
10222 %{
10223 match(Set cr (OverflowAddL op1 op2));
10224 effect(DEF cr, USE_KILL op1, USE op2);
10225
10226 format %{ "addq $op1, $op2\t# overflow check long" %}
10227 ins_encode %{
10228 __ addq($op1$$Register, $op2$$constant);
10229 %}
10230 ins_pipe(ialu_reg_reg);
10231 %}
10232
10233 instruct overflowSubI_rReg(rFlagsReg cr, rRegI op1, rRegI op2)
10234 %{
10235 match(Set cr (OverflowSubI op1 op2));
10236
10237 format %{ "cmpl $op1, $op2\t# overflow check int" %}
10238 ins_encode %{
10239 __ cmpl($op1$$Register, $op2$$Register);
10240 %}
10241 ins_pipe(ialu_reg_reg);
10242 %}
10243
10244 instruct overflowSubI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2)
10245 %{
10246 match(Set cr (OverflowSubI op1 op2));
10247
10248 format %{ "cmpl $op1, $op2\t# overflow check int" %}
10249 ins_encode %{
10250 __ cmpl($op1$$Register, $op2$$constant);
10251 %}
10252 ins_pipe(ialu_reg_reg);
10253 %}
10254
10255 instruct overflowSubL_rReg(rFlagsReg cr, rRegL op1, rRegL op2)
10256 %{
10257 match(Set cr (OverflowSubL op1 op2));
10258
10259 format %{ "cmpq $op1, $op2\t# overflow check long" %}
10260 ins_encode %{
10261 __ cmpq($op1$$Register, $op2$$Register);
10262 %}
10263 ins_pipe(ialu_reg_reg);
10264 %}
10265
10266 instruct overflowSubL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2)
10267 %{
10268 match(Set cr (OverflowSubL op1 op2));
10269
10270 format %{ "cmpq $op1, $op2\t# overflow check long" %}
10271 ins_encode %{
10272 __ cmpq($op1$$Register, $op2$$constant);
10273 %}
10274 ins_pipe(ialu_reg_reg);
10275 %}
10276
10277 instruct overflowNegI_rReg(rFlagsReg cr, immI0 zero, rax_RegI op2)
10278 %{
10279 match(Set cr (OverflowSubI zero op2));
10280 effect(DEF cr, USE_KILL op2);
10281
10282 format %{ "negl $op2\t# overflow check int" %}
10283 ins_encode %{
10284 __ negl($op2$$Register);
10285 %}
10286 ins_pipe(ialu_reg_reg);
10287 %}
10288
10289 instruct overflowNegL_rReg(rFlagsReg cr, immL0 zero, rax_RegL op2)
10290 %{
10291 match(Set cr (OverflowSubL zero op2));
10292 effect(DEF cr, USE_KILL op2);
10293
10294 format %{ "negq $op2\t# overflow check long" %}
10295 ins_encode %{
10296 __ negq($op2$$Register);
10297 %}
10298 ins_pipe(ialu_reg_reg);
10299 %}
10300
10301 instruct overflowMulI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2)
10302 %{
10303 match(Set cr (OverflowMulI op1 op2));
10304 effect(DEF cr, USE_KILL op1, USE op2);
10305
10306 format %{ "imull $op1, $op2\t# overflow check int" %}
10307 ins_encode %{
10308 __ imull($op1$$Register, $op2$$Register);
10309 %}
10310 ins_pipe(ialu_reg_reg_alu0);
10311 %}
10312
10313 instruct overflowMulI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2, rRegI tmp)
10314 %{
10315 match(Set cr (OverflowMulI op1 op2));
10316 effect(DEF cr, TEMP tmp, USE op1, USE op2);
10317
10318 format %{ "imull $tmp, $op1, $op2\t# overflow check int" %}
10319 ins_encode %{
10320 __ imull($tmp$$Register, $op1$$Register, $op2$$constant);
10321 %}
10322 ins_pipe(ialu_reg_reg_alu0);
10323 %}
10324
10325 instruct overflowMulL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2)
10326 %{
10327 match(Set cr (OverflowMulL op1 op2));
10328 effect(DEF cr, USE_KILL op1, USE op2);
10329
10330 format %{ "imulq $op1, $op2\t# overflow check long" %}
10331 ins_encode %{
10332 __ imulq($op1$$Register, $op2$$Register);
10333 %}
10334 ins_pipe(ialu_reg_reg_alu0);
10335 %}
10336
10337 instruct overflowMulL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2, rRegL tmp)
10338 %{
10339 match(Set cr (OverflowMulL op1 op2));
10340 effect(DEF cr, TEMP tmp, USE op1, USE op2);
10341
10342 format %{ "imulq $tmp, $op1, $op2\t# overflow check long" %}
10343 ins_encode %{
10344 __ imulq($tmp$$Register, $op1$$Register, $op2$$constant);
10345 %}
10346 ins_pipe(ialu_reg_reg_alu0);
10446 %} 10347 %}
10447 10348
10448 10349
10449 //----------Control Flow Instructions------------------------------------------ 10350 //----------Control Flow Instructions------------------------------------------
10450 // Signed compare Instructions 10351 // Signed compare Instructions