src/cpu/x86/vm/assembler_x86.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7121648 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/assembler_x86.hpp

Print this page




 572   void prefix(Address adr, Register reg,  bool byteinst = false);
 573   void prefix(Address adr, XMMRegister reg);
 574   void prefixq(Address adr, Register reg);
 575   void prefixq(Address adr, XMMRegister reg);
 576 
 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   int  vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc,
 593                              VexSimdPrefix pre, VexOpcode opc,
 594                              bool vex_w, bool vector256);
 595 





 596 
 597   void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
 598                    VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
 599                    bool rex_w = false, bool vector256 = false);
 600 
 601   void simd_prefix(XMMRegister dst, Address src,
 602                    VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
 603     simd_prefix(dst, xnoreg, src, pre, opc);
 604   }
 605   void simd_prefix(Address dst, XMMRegister src, VexSimdPrefix pre) {
 606     simd_prefix(src, dst, pre);
 607   }
 608   void simd_prefix_q(XMMRegister dst, XMMRegister nds, Address src,
 609                      VexSimdPrefix pre) {
 610     bool rex_w = true;
 611     simd_prefix(dst, nds, src, pre, VEX_OPCODE_0F, rex_w);
 612   }
 613 
 614 
 615   int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,


1557     emit_byte(0x0F);
1558     emit_byte(0x01);
1559     emit_byte(0xD0);
1560   }
1561 
1562   void xorl(Register dst, int32_t imm32);
1563   void xorl(Register dst, Address src);
1564   void xorl(Register dst, Register src);
1565 
1566   void xorq(Register dst, Address src);
1567   void xorq(Register dst, Register src);
1568 
1569   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
1570   void xorpd(XMMRegister dst, XMMRegister src);
1571 
1572   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
1573   void xorps(XMMRegister dst, XMMRegister src);
1574 
1575   void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
1576 























1577  protected:
1578   // Next instructions require address alignment 16 bytes SSE mode.
1579   // They should be called only from corresponding MacroAssembler instructions.
1580   void andpd(XMMRegister dst, Address src);
1581   void andps(XMMRegister dst, Address src);
1582   void xorpd(XMMRegister dst, Address src);
1583   void xorps(XMMRegister dst, Address src);
1584 
1585 };
1586 
1587 
1588 // MacroAssembler extends Assembler by frequently used macros.
1589 //
1590 // Instructions for which a 'better' code sequence exists depending
1591 // on arguments should also go in here.
1592 
1593 class MacroAssembler: public Assembler {
1594   friend class LIR_Assembler;
1595   friend class Runtime1;      // as_Address()
1596 


2405   void subss(XMMRegister dst, AddressLiteral src);
2406 
2407   void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
2408   void ucomiss(XMMRegister dst, Address src)     { Assembler::ucomiss(dst, src); }
2409   void ucomiss(XMMRegister dst, AddressLiteral src);
2410 
2411   void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
2412   void ucomisd(XMMRegister dst, Address src)     { Assembler::ucomisd(dst, src); }
2413   void ucomisd(XMMRegister dst, AddressLiteral src);
2414 
2415   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
2416   void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); }
2417   void xorpd(XMMRegister dst, Address src)     { Assembler::xorpd(dst, src); }
2418   void xorpd(XMMRegister dst, AddressLiteral src);
2419 
2420   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
2421   void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); }
2422   void xorps(XMMRegister dst, Address src)     { Assembler::xorps(dst, src); }
2423   void xorps(XMMRegister dst, AddressLiteral src);
2424 















































2425   // Data
2426 
2427   void cmov32( Condition cc, Register dst, Address  src);
2428   void cmov32( Condition cc, Register dst, Register src);
2429 
2430   void cmov(   Condition cc, Register dst, Register src) { cmovptr(cc, dst, src); }
2431 
2432   void cmovptr(Condition cc, Register dst, Address  src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
2433   void cmovptr(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
2434 
2435   void movoop(Register dst, jobject obj);
2436   void movoop(Address dst, jobject obj);
2437 
2438   void movptr(ArrayAddress dst, Register src);
2439   // can this do an lea?
2440   void movptr(Register dst, ArrayAddress src);
2441 
2442   void movptr(Register dst, Address src);
2443 
2444   void movptr(Register dst, AddressLiteral src);




 572   void prefix(Address adr, Register reg,  bool byteinst = false);
 573   void prefix(Address adr, XMMRegister reg);
 574   void prefixq(Address adr, Register reg);
 575   void prefixq(Address adr, XMMRegister reg);
 576 
 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,


1568     emit_byte(0x0F);
1569     emit_byte(0x01);
1570     emit_byte(0xD0);
1571   }
1572 
1573   void xorl(Register dst, int32_t imm32);
1574   void xorl(Register dst, Address src);
1575   void xorl(Register dst, Register src);
1576 
1577   void xorq(Register dst, Address src);
1578   void xorq(Register dst, Register src);
1579 
1580   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
1581   void xorpd(XMMRegister dst, XMMRegister src);
1582 
1583   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
1584   void xorps(XMMRegister dst, XMMRegister src);
1585 
1586   void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
1587 
1588   // AVX 3-operands instructions (encoded with VEX prefix)
1589   void vaddsd(XMMRegister dst, XMMRegister nds, Address src);
1590   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
1591   void vaddss(XMMRegister dst, XMMRegister nds, Address src);
1592   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src);
1593   void vandpd(XMMRegister dst, XMMRegister nds, Address src);
1594   void vandps(XMMRegister dst, XMMRegister nds, Address src);
1595   void vdivsd(XMMRegister dst, XMMRegister nds, Address src);
1596   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
1597   void vdivss(XMMRegister dst, XMMRegister nds, Address src);
1598   void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src);
1599   void vmulsd(XMMRegister dst, XMMRegister nds, Address src);
1600   void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
1601   void vmulss(XMMRegister dst, XMMRegister nds, Address src);
1602   void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src);
1603   void vsubsd(XMMRegister dst, XMMRegister nds, Address src);
1604   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
1605   void vsubss(XMMRegister dst, XMMRegister nds, Address src);
1606   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src);
1607   void vxorpd(XMMRegister dst, XMMRegister nds, Address src);
1608   void vxorps(XMMRegister dst, XMMRegister nds, Address src);
1609 
1610 
1611  protected:
1612   // Next instructions require address alignment 16 bytes SSE mode.
1613   // They should be called only from corresponding MacroAssembler instructions.
1614   void andpd(XMMRegister dst, Address src);
1615   void andps(XMMRegister dst, Address src);
1616   void xorpd(XMMRegister dst, Address src);
1617   void xorps(XMMRegister dst, Address src);
1618 
1619 };
1620 
1621 
1622 // MacroAssembler extends Assembler by frequently used macros.
1623 //
1624 // Instructions for which a 'better' code sequence exists depending
1625 // on arguments should also go in here.
1626 
1627 class MacroAssembler: public Assembler {
1628   friend class LIR_Assembler;
1629   friend class Runtime1;      // as_Address()
1630 


2439   void subss(XMMRegister dst, AddressLiteral src);
2440 
2441   void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
2442   void ucomiss(XMMRegister dst, Address src)     { Assembler::ucomiss(dst, src); }
2443   void ucomiss(XMMRegister dst, AddressLiteral src);
2444 
2445   void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
2446   void ucomisd(XMMRegister dst, Address src)     { Assembler::ucomisd(dst, src); }
2447   void ucomisd(XMMRegister dst, AddressLiteral src);
2448 
2449   // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
2450   void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); }
2451   void xorpd(XMMRegister dst, Address src)     { Assembler::xorpd(dst, src); }
2452   void xorpd(XMMRegister dst, AddressLiteral src);
2453 
2454   // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
2455   void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); }
2456   void xorps(XMMRegister dst, Address src)     { Assembler::xorps(dst, src); }
2457   void xorps(XMMRegister dst, AddressLiteral src);
2458 
2459   // AVX 3-operands instructions
2460 
2461   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); }
2462   void vaddsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddsd(dst, nds, src); }
2463   void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2464 
2465   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); }
2466   void vaddss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vaddss(dst, nds, src); }
2467   void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2468 
2469   void vandpd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vandpd(dst, nds, src); }
2470   void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2471 
2472   void vandps(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vandps(dst, nds, src); }
2473   void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2474 
2475   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); }
2476   void vdivsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivsd(dst, nds, src); }
2477   void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2478 
2479   void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); }
2480   void vdivss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vdivss(dst, nds, src); }
2481   void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2482 
2483   void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); }
2484   void vmulsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulsd(dst, nds, src); }
2485   void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2486 
2487   void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); }
2488   void vmulss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vmulss(dst, nds, src); }
2489   void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2490 
2491   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); }
2492   void vsubsd(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubsd(dst, nds, src); }
2493   void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2494 
2495   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); }
2496   void vsubss(XMMRegister dst, XMMRegister nds, Address src)     { Assembler::vsubss(dst, nds, src); }
2497   void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2498 
2499   void vxorpd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorpd(dst, nds, src); }
2500   void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2501 
2502   void vxorps(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vxorps(dst, nds, src); }
2503   void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src);
2504 
2505 
2506   // Data
2507 
2508   void cmov32( Condition cc, Register dst, Address  src);
2509   void cmov32( Condition cc, Register dst, Register src);
2510 
2511   void cmov(   Condition cc, Register dst, Register src) { cmovptr(cc, dst, src); }
2512 
2513   void cmovptr(Condition cc, Register dst, Address  src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
2514   void cmovptr(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
2515 
2516   void movoop(Register dst, jobject obj);
2517   void movoop(Address dst, jobject obj);
2518 
2519   void movptr(ArrayAddress dst, Register src);
2520   // can this do an lea?
2521   void movptr(Register dst, ArrayAddress src);
2522 
2523   void movptr(Register dst, Address src);
2524 
2525   void movptr(Register dst, AddressLiteral src);


src/cpu/x86/vm/assembler_x86.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File