Mercurial > hg > truffle
comparison src/cpu/x86/vm/assembler_x86.hpp @ 4970:33df1aeaebbf
Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Mon, 27 Feb 2012 13:10:13 +0100 |
parents | fd8114661503 |
children | 6759698e3140 |
comparison
equal
deleted
inserted
replaced
4703:2cfb7fb2dce7 | 4970:33df1aeaebbf |
---|---|
501 REX_WX = 0x4A, | 501 REX_WX = 0x4A, |
502 REX_WXB = 0x4B, | 502 REX_WXB = 0x4B, |
503 REX_WR = 0x4C, | 503 REX_WR = 0x4C, |
504 REX_WRB = 0x4D, | 504 REX_WRB = 0x4D, |
505 REX_WRX = 0x4E, | 505 REX_WRX = 0x4E, |
506 REX_WRXB = 0x4F | 506 REX_WRXB = 0x4F, |
507 | |
508 VEX_3bytes = 0xC4, | |
509 VEX_2bytes = 0xC5 | |
510 }; | |
511 | |
512 enum VexPrefix { | |
513 VEX_B = 0x20, | |
514 VEX_X = 0x40, | |
515 VEX_R = 0x80, | |
516 VEX_W = 0x80 | |
517 }; | |
518 | |
519 enum VexSimdPrefix { | |
520 VEX_SIMD_NONE = 0x0, | |
521 VEX_SIMD_66 = 0x1, | |
522 VEX_SIMD_F3 = 0x2, | |
523 VEX_SIMD_F2 = 0x3 | |
524 }; | |
525 | |
526 enum VexOpcode { | |
527 VEX_OPCODE_NONE = 0x0, | |
528 VEX_OPCODE_0F = 0x1, | |
529 VEX_OPCODE_0F_38 = 0x2, | |
530 VEX_OPCODE_0F_3A = 0x3 | |
507 }; | 531 }; |
508 | 532 |
509 enum WhichOperand { | 533 enum WhichOperand { |
510 // input to locate_operand, and format code for relocations | 534 // input to locate_operand, and format code for relocations |
511 imm_operand = 0, // embedded 32-bit|64-bit immediate operand | 535 imm_operand = 0, // embedded 32-bit|64-bit immediate operand |
544 void prefix(Register reg); | 568 void prefix(Register reg); |
545 void prefix(Address adr); | 569 void prefix(Address adr); |
546 void prefixq(Address adr); | 570 void prefixq(Address adr); |
547 | 571 |
548 void prefix(Address adr, Register reg, bool byteinst = false); | 572 void prefix(Address adr, Register reg, bool byteinst = false); |
573 void prefix(Address adr, XMMRegister reg); | |
549 void prefixq(Address adr, Register reg); | 574 void prefixq(Address adr, Register reg); |
550 | 575 void prefixq(Address adr, XMMRegister reg); |
551 void prefix(Address adr, XMMRegister reg); | |
552 | 576 |
553 void prefetch_prefix(Address src); | 577 void prefetch_prefix(Address src); |
578 | |
579 void rex_prefix(Address adr, XMMRegister xreg, | |
580 VexSimdPrefix pre, VexOpcode opc, bool rex_w); | |
581 int rex_prefix_and_encode(int dst_enc, int src_enc, | |
582 VexSimdPrefix pre, VexOpcode opc, bool rex_w); | |
583 | |
584 void vex_prefix(bool vex_r, bool vex_b, bool vex_x, bool vex_w, | |
585 int nds_enc, VexSimdPrefix pre, VexOpcode opc, | |
586 bool vector256); | |
587 | |
588 void vex_prefix(Address adr, int nds_enc, int xreg_enc, | |
589 VexSimdPrefix pre, VexOpcode opc, | |
590 bool vex_w, bool vector256); | |
591 | |
592 void vex_prefix(XMMRegister dst, XMMRegister nds, Address src, | |
593 VexSimdPrefix pre, bool vector256 = false) { | |
594 vex_prefix(src, nds->encoding(), dst->encoding(), | |
595 pre, VEX_OPCODE_0F, false, vector256); | |
596 } | |
597 | |
598 int vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, | |
599 VexSimdPrefix pre, VexOpcode opc, | |
600 bool vex_w, bool vector256); | |
601 | |
602 int vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, | |
603 VexSimdPrefix pre, bool vector256 = false) { | |
604 return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), | |
605 pre, VEX_OPCODE_0F, false, vector256); | |
606 } | |
607 | |
608 void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, | |
609 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F, | |
610 bool rex_w = false, bool vector256 = false); | |
611 | |
612 void simd_prefix(XMMRegister dst, Address src, | |
613 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) { | |
614 simd_prefix(dst, xnoreg, src, pre, opc); | |
615 } | |
616 void simd_prefix(Address dst, XMMRegister src, VexSimdPrefix pre) { | |
617 simd_prefix(src, dst, pre); | |
618 } | |
619 void simd_prefix_q(XMMRegister dst, XMMRegister nds, Address src, | |
620 VexSimdPrefix pre) { | |
621 bool rex_w = true; | |
622 simd_prefix(dst, nds, src, pre, VEX_OPCODE_0F, rex_w); | |
623 } | |
624 | |
625 | |
626 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, | |
627 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F, | |
628 bool rex_w = false, bool vector256 = false); | |
629 | |
630 int simd_prefix_and_encode(XMMRegister dst, XMMRegister src, | |
631 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) { | |
632 return simd_prefix_and_encode(dst, xnoreg, src, pre, opc); | |
633 } | |
634 | |
635 // Move/convert 32-bit integer value. | |
636 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, Register src, | |
637 VexSimdPrefix pre) { | |
638 // It is OK to cast from Register to XMMRegister to pass argument here | |
639 // since only encoding is used in simd_prefix_and_encode() and number of | |
640 // Gen and Xmm registers are the same. | |
641 return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre); | |
642 } | |
643 int simd_prefix_and_encode(XMMRegister dst, Register src, VexSimdPrefix pre) { | |
644 return simd_prefix_and_encode(dst, xnoreg, src, pre); | |
645 } | |
646 int simd_prefix_and_encode(Register dst, XMMRegister src, | |
647 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) { | |
648 return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc); | |
649 } | |
650 | |
651 // Move/convert 64-bit integer value. | |
652 int simd_prefix_and_encode_q(XMMRegister dst, XMMRegister nds, Register src, | |
653 VexSimdPrefix pre) { | |
654 bool rex_w = true; | |
655 return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre, VEX_OPCODE_0F, rex_w); | |
656 } | |
657 int simd_prefix_and_encode_q(XMMRegister dst, Register src, VexSimdPrefix pre) { | |
658 return simd_prefix_and_encode_q(dst, xnoreg, src, pre); | |
659 } | |
660 int simd_prefix_and_encode_q(Register dst, XMMRegister src, | |
661 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) { | |
662 bool rex_w = true; | |
663 return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc, rex_w); | |
664 } | |
554 | 665 |
555 // Helper functions for groups of instructions | 666 // Helper functions for groups of instructions |
556 void emit_arith_b(int op1, int op2, Register dst, int imm8); | 667 void emit_arith_b(int op1, int op2, Register dst, int imm8); |
557 | 668 |
558 void emit_arith(int op1, int op2, Register dst, int32_t imm32); | 669 void emit_arith(int op1, int op2, Register dst, int32_t imm32); |
670 // Force generation of a 4 byte immediate value even if it fits into 8bit | |
671 void emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32); | |
559 // only 32bit?? | 672 // only 32bit?? |
560 void emit_arith(int op1, int op2, Register dst, jobject obj); | 673 void emit_arith(int op1, int op2, Register dst, jobject obj); |
561 void emit_arith(int op1, int op2, Register dst, Register src); | 674 void emit_arith(int op1, int op2, Register dst, Register src); |
562 | 675 |
563 void emit_operand(Register reg, | 676 void emit_operand(Register reg, |
762 | 875 |
763 // Add Scalar Single-Precision Floating-Point Values | 876 // Add Scalar Single-Precision Floating-Point Values |
764 void addss(XMMRegister dst, Address src); | 877 void addss(XMMRegister dst, Address src); |
765 void addss(XMMRegister dst, XMMRegister src); | 878 void addss(XMMRegister dst, XMMRegister src); |
766 | 879 |
880 void andl(Address dst, int32_t imm32); | |
767 void andl(Register dst, int32_t imm32); | 881 void andl(Register dst, int32_t imm32); |
768 void andl(Register dst, Address src); | 882 void andl(Register dst, Address src); |
769 void andl(Register dst, Register src); | 883 void andl(Register dst, Register src); |
770 | 884 |
771 void andq(Address dst, int32_t imm32); | 885 void andq(Address dst, int32_t imm32); |
772 void andq(Register dst, int32_t imm32); | 886 void andq(Register dst, int32_t imm32); |
773 void andq(Register dst, Address src); | 887 void andq(Register dst, Address src); |
774 void andq(Register dst, Register src); | 888 void andq(Register dst, Register src); |
775 | 889 |
776 // Bitwise Logical AND of Packed Double-Precision Floating-Point Values | 890 // Bitwise Logical AND of Packed Double-Precision Floating-Point Values |
777 void andpd(XMMRegister dst, Address src); | |
778 void andpd(XMMRegister dst, XMMRegister src); | 891 void andpd(XMMRegister dst, XMMRegister src); |
892 | |
893 // Bitwise Logical AND of Packed Single-Precision Floating-Point Values | |
894 void andps(XMMRegister dst, XMMRegister src); | |
779 | 895 |
780 void bsfl(Register dst, Register src); | 896 void bsfl(Register dst, Register src); |
781 void bsrl(Register dst, Register src); | 897 void bsrl(Register dst, Register src); |
782 | 898 |
783 #ifdef _LP64 | 899 #ifdef _LP64 |
835 | 951 |
836 void cmpxchgq(Register reg, Address adr); | 952 void cmpxchgq(Register reg, Address adr); |
837 | 953 |
838 // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS | 954 // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS |
839 void comisd(XMMRegister dst, Address src); | 955 void comisd(XMMRegister dst, Address src); |
956 void comisd(XMMRegister dst, XMMRegister src); | |
840 | 957 |
841 // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS | 958 // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS |
842 void comiss(XMMRegister dst, Address src); | 959 void comiss(XMMRegister dst, Address src); |
960 void comiss(XMMRegister dst, XMMRegister src); | |
843 | 961 |
844 // Identify processor type and features | 962 // Identify processor type and features |
845 void cpuid() { | 963 void cpuid() { |
846 emit_byte(0x0F); | 964 emit_byte(0x0F); |
847 emit_byte(0xA2); | 965 emit_byte(0xA2); |
848 } | 966 } |
849 | 967 |
850 // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value | 968 // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value |
851 void cvtsd2ss(XMMRegister dst, XMMRegister src); | 969 void cvtsd2ss(XMMRegister dst, XMMRegister src); |
970 void cvtsd2ss(XMMRegister dst, Address src); | |
852 | 971 |
853 // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value | 972 // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value |
854 void cvtsi2sdl(XMMRegister dst, Register src); | 973 void cvtsi2sdl(XMMRegister dst, Register src); |
974 void cvtsi2sdl(XMMRegister dst, Address src); | |
855 void cvtsi2sdq(XMMRegister dst, Register src); | 975 void cvtsi2sdq(XMMRegister dst, Register src); |
976 void cvtsi2sdq(XMMRegister dst, Address src); | |
856 | 977 |
857 // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value | 978 // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value |
858 void cvtsi2ssl(XMMRegister dst, Register src); | 979 void cvtsi2ssl(XMMRegister dst, Register src); |
980 void cvtsi2ssl(XMMRegister dst, Address src); | |
859 void cvtsi2ssq(XMMRegister dst, Register src); | 981 void cvtsi2ssq(XMMRegister dst, Register src); |
982 void cvtsi2ssq(XMMRegister dst, Address src); | |
860 | 983 |
861 // Convert Packed Signed Doubleword Integers to Packed Double-Precision Floating-Point Value | 984 // Convert Packed Signed Doubleword Integers to Packed Double-Precision Floating-Point Value |
862 void cvtdq2pd(XMMRegister dst, XMMRegister src); | 985 void cvtdq2pd(XMMRegister dst, XMMRegister src); |
863 | 986 |
864 // Convert Packed Signed Doubleword Integers to Packed Single-Precision Floating-Point Value | 987 // Convert Packed Signed Doubleword Integers to Packed Single-Precision Floating-Point Value |
865 void cvtdq2ps(XMMRegister dst, XMMRegister src); | 988 void cvtdq2ps(XMMRegister dst, XMMRegister src); |
866 | 989 |
867 // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value | 990 // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value |
868 void cvtss2sd(XMMRegister dst, XMMRegister src); | 991 void cvtss2sd(XMMRegister dst, XMMRegister src); |
992 void cvtss2sd(XMMRegister dst, Address src); | |
869 | 993 |
870 // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer | 994 // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer |
871 void cvttsd2sil(Register dst, Address src); | 995 void cvttsd2sil(Register dst, Address src); |
872 void cvttsd2sil(Register dst, XMMRegister src); | 996 void cvttsd2sil(Register dst, XMMRegister src); |
873 void cvttsd2siq(Register dst, XMMRegister src); | 997 void cvttsd2siq(Register dst, XMMRegister src); |
1138 // Move Double Quadword | 1262 // Move Double Quadword |
1139 void movdq(XMMRegister dst, Register src); | 1263 void movdq(XMMRegister dst, Register src); |
1140 void movdq(Register dst, XMMRegister src); | 1264 void movdq(Register dst, XMMRegister src); |
1141 | 1265 |
1142 // Move Aligned Double Quadword | 1266 // Move Aligned Double Quadword |
1143 void movdqa(Address dst, XMMRegister src); | |
1144 void movdqa(XMMRegister dst, Address src); | |
1145 void movdqa(XMMRegister dst, XMMRegister src); | 1267 void movdqa(XMMRegister dst, XMMRegister src); |
1146 | 1268 |
1147 // Move Unaligned Double Quadword | 1269 // Move Unaligned Double Quadword |
1148 void movdqu(Address dst, XMMRegister src); | 1270 void movdqu(Address dst, XMMRegister src); |
1149 void movdqu(XMMRegister dst, Address src); | 1271 void movdqu(XMMRegister dst, Address src); |
1259 void orq(Address dst, int32_t imm32); | 1381 void orq(Address dst, int32_t imm32); |
1260 void orq(Register dst, int32_t imm32); | 1382 void orq(Register dst, int32_t imm32); |
1261 void orq(Register dst, Address src); | 1383 void orq(Register dst, Address src); |
1262 void orq(Register dst, Register src); | 1384 void orq(Register dst, Register src); |
1263 | 1385 |
1386 // Pack with unsigned saturation | |
1387 void packuswb(XMMRegister dst, XMMRegister src); | |
1388 void packuswb(XMMRegister dst, Address src); | |
1389 | |
1264 // SSE4.2 string instructions | 1390 // SSE4.2 string instructions |
1265 void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8); | 1391 void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8); |
1266 void pcmpestri(XMMRegister xmm1, Address src, int imm8); | 1392 void pcmpestri(XMMRegister xmm1, Address src, int imm8); |
1393 | |
1394 // SSE4.1 packed move | |
1395 void pmovzxbw(XMMRegister dst, XMMRegister src); | |
1396 void pmovzxbw(XMMRegister dst, Address src); | |
1267 | 1397 |
1268 #ifndef _LP64 // no 32bit push/pop on amd64 | 1398 #ifndef _LP64 // no 32bit push/pop on amd64 |
1269 void popl(Address dst); | 1399 void popl(Address dst); |
1270 #endif | 1400 #endif |
1271 | 1401 |
1290 void prefetcht2(Address src); | 1420 void prefetcht2(Address src); |
1291 void prefetchw(Address src); | 1421 void prefetchw(Address src); |
1292 | 1422 |
1293 // POR - Bitwise logical OR | 1423 // POR - Bitwise logical OR |
1294 void por(XMMRegister dst, XMMRegister src); | 1424 void por(XMMRegister dst, XMMRegister src); |
1425 void por(XMMRegister dst, Address src); | |
1295 | 1426 |
1296 // Shuffle Packed Doublewords | 1427 // Shuffle Packed Doublewords |
1297 void pshufd(XMMRegister dst, XMMRegister src, int mode); | 1428 void pshufd(XMMRegister dst, XMMRegister src, int mode); |
1298 void pshufd(XMMRegister dst, Address src, int mode); | 1429 void pshufd(XMMRegister dst, Address src, int mode); |
1299 | 1430 |
1311 void ptest(XMMRegister dst, XMMRegister src); | 1442 void ptest(XMMRegister dst, XMMRegister src); |
1312 void ptest(XMMRegister dst, Address src); | 1443 void ptest(XMMRegister dst, Address src); |
1313 | 1444 |
1314 // Interleave Low Bytes | 1445 // Interleave Low Bytes |
1315 void punpcklbw(XMMRegister dst, XMMRegister src); | 1446 void punpcklbw(XMMRegister dst, XMMRegister src); |
1447 void punpcklbw(XMMRegister dst, Address src); | |
1448 | |
1449 // Interleave Low Doublewords | |
1450 void punpckldq(XMMRegister dst, XMMRegister src); | |
1451 void punpckldq(XMMRegister dst, Address src); | |
1316 | 1452 |
1317 #ifndef _LP64 // no 32bit push/pop on amd64 | 1453 #ifndef _LP64 // no 32bit push/pop on amd64 |
1318 void pushl(Address src); | 1454 void pushl(Address src); |
1319 #endif | 1455 #endif |
1320 | 1456 |
1390 void subq(Address dst, Register src); | 1526 void subq(Address dst, Register src); |
1391 void subq(Register dst, int32_t imm32); | 1527 void subq(Register dst, int32_t imm32); |
1392 void subq(Register dst, Address src); | 1528 void subq(Register dst, Address src); |
1393 void subq(Register dst, Register src); | 1529 void subq(Register dst, Register src); |
1394 | 1530 |
1531 // Force generation of a 4 byte immediate value even if it fits into 8bit | |
1532 void subl_imm32(Register dst, int32_t imm32); | |
1533 void subq_imm32(Register dst, int32_t imm32); | |
1395 | 1534 |
1396 // Subtract Scalar Double-Precision Floating-Point Values | 1535 // Subtract Scalar Double-Precision Floating-Point Values |
1397 void subsd(XMMRegister dst, Address src); | 1536 void subsd(XMMRegister dst, Address src); |
1398 void subsd(XMMRegister dst, XMMRegister src); | 1537 void subsd(XMMRegister dst, XMMRegister src); |
1399 | 1538 |
1427 void xchgl(Register dst, Register src); | 1566 void xchgl(Register dst, Register src); |
1428 | 1567 |
1429 void xchgq(Register reg, Address adr); | 1568 void xchgq(Register reg, Address adr); |
1430 void xchgq(Register dst, Register src); | 1569 void xchgq(Register dst, Register src); |
1431 | 1570 |
1571 // Get Value of Extended Control Register | |
1572 void xgetbv() { | |
1573 emit_byte(0x0F); | |
1574 emit_byte(0x01); | |
1575 emit_byte(0xD0); | |
1576 } | |
1577 | |
1432 void xorl(Register dst, int32_t imm32); | 1578 void xorl(Register dst, int32_t imm32); |
1433 void xorl(Register dst, Address src); | 1579 void xorl(Register dst, Address src); |
1434 void xorl(Register dst, Register src); | 1580 void xorl(Register dst, Register src); |
1435 | 1581 |
1436 void xorq(Register dst, Address src); | 1582 void xorq(Register dst, Address src); |
1437 void xorq(Register dst, Register src); | 1583 void xorq(Register dst, Register src); |
1438 | 1584 |
1439 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values | 1585 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values |
1586 void xorpd(XMMRegister dst, XMMRegister src); | |
1587 | |
1588 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values | |
1589 void xorps(XMMRegister dst, XMMRegister src); | |
1590 | |
1591 void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0 | |
1592 | |
1593 // AVX 3-operands instructions (encoded with VEX prefix) | |
1594 void vaddsd(XMMRegister dst, XMMRegister nds, Address src); | |
1595 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1596 void vaddss(XMMRegister dst, XMMRegister nds, Address src); | |
1597 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1598 void vandpd(XMMRegister dst, XMMRegister nds, Address src); | |
1599 void vandps(XMMRegister dst, XMMRegister nds, Address src); | |
1600 void vdivsd(XMMRegister dst, XMMRegister nds, Address src); | |
1601 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1602 void vdivss(XMMRegister dst, XMMRegister nds, Address src); | |
1603 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1604 void vmulsd(XMMRegister dst, XMMRegister nds, Address src); | |
1605 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1606 void vmulss(XMMRegister dst, XMMRegister nds, Address src); | |
1607 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1608 void vsubsd(XMMRegister dst, XMMRegister nds, Address src); | |
1609 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1610 void vsubss(XMMRegister dst, XMMRegister nds, Address src); | |
1611 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src); | |
1612 void vxorpd(XMMRegister dst, XMMRegister nds, Address src); | |
1613 void vxorps(XMMRegister dst, XMMRegister nds, Address src); | |
1614 | |
1615 | |
1616 protected: | |
1617 // Next instructions require address alignment 16 bytes SSE mode. | |
1618 // They should be called only from corresponding MacroAssembler instructions. | |
1619 void andpd(XMMRegister dst, Address src); | |
1620 void andps(XMMRegister dst, Address src); | |
1440 void xorpd(XMMRegister dst, Address src); | 1621 void xorpd(XMMRegister dst, Address src); |
1441 void xorpd(XMMRegister dst, XMMRegister src); | |
1442 | |
1443 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values | |
1444 void xorps(XMMRegister dst, Address src); | 1622 void xorps(XMMRegister dst, Address src); |
1445 void xorps(XMMRegister dst, XMMRegister src); | 1623 |
1446 | |
1447 void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0 | |
1448 }; | 1624 }; |
1449 | 1625 |
1450 | 1626 |
1451 // MacroAssembler extends Assembler by frequently used macros. | 1627 // MacroAssembler extends Assembler by frequently used macros. |
1452 // | 1628 // |
1590 void incrementl(ArrayAddress dst); | 1766 void incrementl(ArrayAddress dst); |
1591 | 1767 |
1592 // Alignment | 1768 // Alignment |
1593 void align(int modulus); | 1769 void align(int modulus); |
1594 | 1770 |
1595 // Misc | 1771 // A 5 byte nop that is safe for patching (see patch_verified_entry) |
1596 void fat_nop(); // 5 byte nop | 1772 void fat_nop(); |
1597 | 1773 |
1598 // Stack frame creation/removal | 1774 // Stack frame creation/removal |
1599 void enter(); | 1775 void enter(); |
1600 void leave(); | 1776 void leave(); |
1601 | 1777 |
2102 | 2278 |
2103 void subptr(Address dst, int32_t src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); } | 2279 void subptr(Address dst, int32_t src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); } |
2104 | 2280 |
2105 void subptr(Register dst, Address src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); } | 2281 void subptr(Register dst, Address src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); } |
2106 void subptr(Register dst, int32_t src); | 2282 void subptr(Register dst, int32_t src); |
2283 // Force generation of a 4 byte immediate value even if it fits into 8bit | |
2284 void subptr_imm32(Register dst, int32_t src); | |
2107 void subptr(Register dst, Register src); | 2285 void subptr(Register dst, Register src); |
2108 void subptr(Register dst, RegisterOrConstant src) { | 2286 void subptr(Register dst, RegisterOrConstant src) { |
2109 if (src.is_constant()) subptr(dst, (int) src.as_constant()); | 2287 if (src.is_constant()) subptr(dst, (int) src.as_constant()); |
2110 else subptr(dst, src.as_register()); | 2288 else subptr(dst, src.as_register()); |
2111 } | 2289 } |
2173 // Floating | 2351 // Floating |
2174 | 2352 |
2175 void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); } | 2353 void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); } |
2176 void andpd(XMMRegister dst, AddressLiteral src); | 2354 void andpd(XMMRegister dst, AddressLiteral src); |
2177 | 2355 |
2356 void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); } | |
2357 void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); } | |
2358 void andps(XMMRegister dst, AddressLiteral src); | |
2359 | |
2360 void comiss(XMMRegister dst, XMMRegister src) { Assembler::comiss(dst, src); } | |
2178 void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); } | 2361 void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); } |
2179 void comiss(XMMRegister dst, AddressLiteral src); | 2362 void comiss(XMMRegister dst, AddressLiteral src); |
2180 | 2363 |
2364 void comisd(XMMRegister dst, XMMRegister src) { Assembler::comisd(dst, src); } | |
2181 void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); } | 2365 void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); } |
2182 void comisd(XMMRegister dst, AddressLiteral src); | 2366 void comisd(XMMRegister dst, AddressLiteral src); |
2183 | 2367 |
2184 void fadd_s(Address src) { Assembler::fadd_s(src); } | 2368 void fadd_s(Address src) { Assembler::fadd_s(src); } |
2185 void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); } | 2369 void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); } |
2209 void movss(Address dst, XMMRegister src) { Assembler::movss(dst, src); } | 2393 void movss(Address dst, XMMRegister src) { Assembler::movss(dst, src); } |
2210 void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); } | 2394 void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); } |
2211 void movss(XMMRegister dst, Address src) { Assembler::movss(dst, src); } | 2395 void movss(XMMRegister dst, Address src) { Assembler::movss(dst, src); } |
2212 void movss(XMMRegister dst, AddressLiteral src); | 2396 void movss(XMMRegister dst, AddressLiteral src); |
2213 | 2397 |
2214 void movlpd(XMMRegister dst, Address src) {Assembler::movlpd(dst, src); } | 2398 void movlpd(XMMRegister dst, Address src) {Assembler::movlpd(dst, src); } |
2215 void movlpd(XMMRegister dst, AddressLiteral src); | 2399 void movlpd(XMMRegister dst, AddressLiteral src); |
2216 | 2400 |
2217 public: | 2401 public: |
2218 | 2402 |
2219 void addsd(XMMRegister dst, XMMRegister src) { Assembler::addsd(dst, src); } | 2403 void addsd(XMMRegister dst, XMMRegister src) { Assembler::addsd(dst, src); } |
2220 void addsd(XMMRegister dst, Address src) { Assembler::addsd(dst, src); } | 2404 void addsd(XMMRegister dst, Address src) { Assembler::addsd(dst, src); } |
2221 void addsd(XMMRegister dst, AddressLiteral src) { Assembler::addsd(dst, as_Address(src)); } | 2405 void addsd(XMMRegister dst, AddressLiteral src); |
2222 | 2406 |
2223 void addss(XMMRegister dst, XMMRegister src) { Assembler::addss(dst, src); } | 2407 void addss(XMMRegister dst, XMMRegister src) { Assembler::addss(dst, src); } |
2224 void addss(XMMRegister dst, Address src) { Assembler::addss(dst, src); } | 2408 void addss(XMMRegister dst, Address src) { Assembler::addss(dst, src); } |
2225 void addss(XMMRegister dst, AddressLiteral src) { Assembler::addss(dst, as_Address(src)); } | 2409 void addss(XMMRegister dst, AddressLiteral src); |
2226 | 2410 |
2227 void divsd(XMMRegister dst, XMMRegister src) { Assembler::divsd(dst, src); } | 2411 void divsd(XMMRegister dst, XMMRegister src) { Assembler::divsd(dst, src); } |
2228 void divsd(XMMRegister dst, Address src) { Assembler::divsd(dst, src); } | 2412 void divsd(XMMRegister dst, Address src) { Assembler::divsd(dst, src); } |
2229 void divsd(XMMRegister dst, AddressLiteral src) { Assembler::divsd(dst, as_Address(src)); } | 2413 void divsd(XMMRegister dst, AddressLiteral src); |
2230 | 2414 |
2231 void divss(XMMRegister dst, XMMRegister src) { Assembler::divss(dst, src); } | 2415 void divss(XMMRegister dst, XMMRegister src) { Assembler::divss(dst, src); } |
2232 void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); } | 2416 void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); } |
2233 void divss(XMMRegister dst, AddressLiteral src) { Assembler::divss(dst, as_Address(src)); } | 2417 void divss(XMMRegister dst, AddressLiteral src); |
2234 | 2418 |
2235 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); } | 2419 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); } |
2236 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); } | 2420 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); } |
2237 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); } | 2421 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); } |
2238 void movsd(XMMRegister dst, AddressLiteral src) { Assembler::movsd(dst, as_Address(src)); } | 2422 void movsd(XMMRegister dst, AddressLiteral src); |
2239 | 2423 |
2240 void mulsd(XMMRegister dst, XMMRegister src) { Assembler::mulsd(dst, src); } | 2424 void mulsd(XMMRegister dst, XMMRegister src) { Assembler::mulsd(dst, src); } |
2241 void mulsd(XMMRegister dst, Address src) { Assembler::mulsd(dst, src); } | 2425 void mulsd(XMMRegister dst, Address src) { Assembler::mulsd(dst, src); } |
2242 void mulsd(XMMRegister dst, AddressLiteral src) { Assembler::mulsd(dst, as_Address(src)); } | 2426 void mulsd(XMMRegister dst, AddressLiteral src); |
2243 | 2427 |
2244 void mulss(XMMRegister dst, XMMRegister src) { Assembler::mulss(dst, src); } | 2428 void mulss(XMMRegister dst, XMMRegister src) { Assembler::mulss(dst, src); } |
2245 void mulss(XMMRegister dst, Address src) { Assembler::mulss(dst, src); } | 2429 void mulss(XMMRegister dst, Address src) { Assembler::mulss(dst, src); } |
2246 void mulss(XMMRegister dst, AddressLiteral src) { Assembler::mulss(dst, as_Address(src)); } | 2430 void mulss(XMMRegister dst, AddressLiteral src); |
2247 | 2431 |
2248 void sqrtsd(XMMRegister dst, XMMRegister src) { Assembler::sqrtsd(dst, src); } | 2432 void sqrtsd(XMMRegister dst, XMMRegister src) { Assembler::sqrtsd(dst, src); } |
2249 void sqrtsd(XMMRegister dst, Address src) { Assembler::sqrtsd(dst, src); } | 2433 void sqrtsd(XMMRegister dst, Address src) { Assembler::sqrtsd(dst, src); } |
2250 void sqrtsd(XMMRegister dst, AddressLiteral src) { Assembler::sqrtsd(dst, as_Address(src)); } | 2434 void sqrtsd(XMMRegister dst, AddressLiteral src); |
2251 | 2435 |
2252 void sqrtss(XMMRegister dst, XMMRegister src) { Assembler::sqrtss(dst, src); } | 2436 void sqrtss(XMMRegister dst, XMMRegister src) { Assembler::sqrtss(dst, src); } |
2253 void sqrtss(XMMRegister dst, Address src) { Assembler::sqrtss(dst, src); } | 2437 void sqrtss(XMMRegister dst, Address src) { Assembler::sqrtss(dst, src); } |
2254 void sqrtss(XMMRegister dst, AddressLiteral src) { Assembler::sqrtss(dst, as_Address(src)); } | 2438 void sqrtss(XMMRegister dst, AddressLiteral src); |
2255 | 2439 |
2256 void subsd(XMMRegister dst, XMMRegister src) { Assembler::subsd(dst, src); } | 2440 void subsd(XMMRegister dst, XMMRegister src) { Assembler::subsd(dst, src); } |
2257 void subsd(XMMRegister dst, Address src) { Assembler::subsd(dst, src); } | 2441 void subsd(XMMRegister dst, Address src) { Assembler::subsd(dst, src); } |
2258 void subsd(XMMRegister dst, AddressLiteral src) { Assembler::subsd(dst, as_Address(src)); } | 2442 void subsd(XMMRegister dst, AddressLiteral src); |
2259 | 2443 |
2260 void subss(XMMRegister dst, XMMRegister src) { Assembler::subss(dst, src); } | 2444 void subss(XMMRegister dst, XMMRegister src) { Assembler::subss(dst, src); } |
2261 void subss(XMMRegister dst, Address src) { Assembler::subss(dst, src); } | 2445 void subss(XMMRegister dst, Address src) { Assembler::subss(dst, src); } |
2262 void subss(XMMRegister dst, AddressLiteral src) { Assembler::subss(dst, as_Address(src)); } | 2446 void subss(XMMRegister dst, AddressLiteral src); |
2263 | 2447 |
2264 void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); } | 2448 void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); } |
2265 void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); } | 2449 void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); } |
2266 void ucomiss(XMMRegister dst, AddressLiteral src); | 2450 void ucomiss(XMMRegister dst, AddressLiteral src); |
2267 | 2451 |
2268 void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); } | 2452 void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); } |
2269 void ucomisd(XMMRegister dst, Address src) { Assembler::ucomisd(dst, src); } | 2453 void ucomisd(XMMRegister dst, Address src) { Assembler::ucomisd(dst, src); } |
2270 void ucomisd(XMMRegister dst, AddressLiteral src); | 2454 void ucomisd(XMMRegister dst, AddressLiteral src); |
2271 | 2455 |
2272 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values | 2456 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values |
2273 void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); } | 2457 void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); } |
2274 void xorpd(XMMRegister dst, Address src) { Assembler::xorpd(dst, src); } | 2458 void xorpd(XMMRegister dst, Address src) { Assembler::xorpd(dst, src); } |
2277 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values | 2461 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values |
2278 void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); } | 2462 void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); } |
2279 void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); } | 2463 void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); } |
2280 void xorps(XMMRegister dst, AddressLiteral src); | 2464 void xorps(XMMRegister dst, AddressLiteral src); |
2281 | 2465 |
2466 // AVX 3-operands instructions | |
2467 | |
2468 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); } | |
2469 void vaddsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddsd(dst, nds, src); } | |
2470 void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2471 | |
2472 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); } | |
2473 void vaddss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddss(dst, nds, src); } | |
2474 void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2475 | |
2476 void vandpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vandpd(dst, nds, src); } | |
2477 void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2478 | |
2479 void vandps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vandps(dst, nds, src); } | |
2480 void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2481 | |
2482 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); } | |
2483 void vdivsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivsd(dst, nds, src); } | |
2484 void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2485 | |
2486 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); } | |
2487 void vdivss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivss(dst, nds, src); } | |
2488 void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2489 | |
2490 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); } | |
2491 void vmulsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulsd(dst, nds, src); } | |
2492 void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2493 | |
2494 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); } | |
2495 void vmulss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulss(dst, nds, src); } | |
2496 void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2497 | |
2498 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); } | |
2499 void vsubsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubsd(dst, nds, src); } | |
2500 void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2501 | |
2502 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); } | |
2503 void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); } | |
2504 void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2505 | |
2506 void vxorpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorpd(dst, nds, src); } | |
2507 void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2508 | |
2509 void vxorps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorps(dst, nds, src); } | |
2510 void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src); | |
2511 | |
2512 | |
2282 // Data | 2513 // Data |
2283 | 2514 |
2284 void cmov32( Condition cc, Register dst, Address src); | 2515 void cmov32( Condition cc, Register dst, Address src); |
2285 void cmov32( Condition cc, Register dst, Register src); | 2516 void cmov32( Condition cc, Register dst, Register src); |
2286 | 2517 |
2339 void pushoop(jobject obj); | 2570 void pushoop(jobject obj); |
2340 | 2571 |
2341 // sign extend as need a l to ptr sized element | 2572 // sign extend as need a l to ptr sized element |
2342 void movl2ptr(Register dst, Address src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(movl(dst, src)); } | 2573 void movl2ptr(Register dst, Address src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(movl(dst, src)); } |
2343 void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); } | 2574 void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); } |
2575 | |
2576 // C2 compiled method's prolog code. | |
2577 void verified_entry(int framesize, bool stack_bang, bool fp_mode_24b); | |
2344 | 2578 |
2345 // IndexOf strings. | 2579 // IndexOf strings. |
2346 // Small strings are loaded through stack if they cross page boundary. | 2580 // Small strings are loaded through stack if they cross page boundary. |
2347 void string_indexof(Register str1, Register str2, | 2581 void string_indexof(Register str1, Register str2, |
2348 Register cnt1, Register cnt2, | 2582 Register cnt1, Register cnt2, |