1889 |
1889 |
1890 |
1890 |
1891 // The intptr_t operand types, defined by textual substitution. |
1891 // The intptr_t operand types, defined by textual substitution. |
1892 // (Cf. opto/type.hpp. This lets us avoid many, many other ifdefs.) |
1892 // (Cf. opto/type.hpp. This lets us avoid many, many other ifdefs.) |
1893 #ifdef _LP64 |
1893 #ifdef _LP64 |
1894 #define immX immL |
1894 #define immX immL |
1895 #define immX13 immL13 |
1895 #define immX13 immL13 |
1896 #define immX13m7 immL13m7 |
1896 #define immX13m7 immL13m7 |
1897 #define iRegX iRegL |
1897 #define iRegX iRegL |
1898 #define g1RegX g1RegL |
1898 #define g1RegX g1RegL |
1899 #else |
1899 #else |
1900 #define immX immI |
1900 #define immX immI |
1901 #define immX13 immI13 |
1901 #define immX13 immI13 |
1902 #define immX13m7 immI13m7 |
1902 #define immX13m7 immI13m7 |
1903 #define iRegX iRegI |
1903 #define iRegX iRegI |
1904 #define g1RegX g1RegI |
1904 #define g1RegX g1RegI |
1905 #endif |
1905 #endif |
1906 |
1906 |
1907 //----------ENCODING BLOCK----------------------------------------------------- |
1907 //----------ENCODING BLOCK----------------------------------------------------- |
1908 // This block specifies the encoding classes used by the compiler to output |
1908 // This block specifies the encoding classes used by the compiler to output |
1909 // byte streams. Encoding classes are parameterized macros used by |
1909 // byte streams. Encoding classes are parameterized macros used by |
5542 size(4); |
5560 size(4); |
5543 format %{ "LDUB $mem,$dst\t! ubyte" %} |
5561 format %{ "LDUB $mem,$dst\t! ubyte" %} |
5544 ins_encode %{ |
5562 ins_encode %{ |
5545 __ ldub($mem$$Address, $dst$$Register); |
5563 __ ldub($mem$$Address, $dst$$Register); |
5546 %} |
5564 %} |
5547 ins_pipe(iload_mask_mem); |
5565 ins_pipe(iload_mem); |
5548 %} |
5566 %} |
5549 |
5567 |
5550 // Load Unsigned Byte (8bit UNsigned) into a Long Register |
5568 // Load Unsigned Byte (8bit UNsigned) into a Long Register |
5551 instruct loadUB2L(iRegL dst, memory mem) %{ |
5569 instruct loadUB2L(iRegL dst, memory mem) %{ |
5552 match(Set dst (ConvI2L (LoadUB mem))); |
5570 match(Set dst (ConvI2L (LoadUB mem))); |
5555 size(4); |
5573 size(4); |
5556 format %{ "LDUB $mem,$dst\t! ubyte -> long" %} |
5574 format %{ "LDUB $mem,$dst\t! ubyte -> long" %} |
5557 ins_encode %{ |
5575 ins_encode %{ |
5558 __ ldub($mem$$Address, $dst$$Register); |
5576 __ ldub($mem$$Address, $dst$$Register); |
5559 %} |
5577 %} |
5560 ins_pipe(iload_mask_mem); |
5578 ins_pipe(iload_mem); |
|
5579 %} |
|
5580 |
|
5581 // Load Unsigned Byte (8 bit UNsigned) with 8-bit mask into Long Register |
|
5582 instruct loadUB2L_immI8(iRegL dst, memory mem, immI8 mask) %{ |
|
5583 match(Set dst (ConvI2L (AndI (LoadUB mem) mask))); |
|
5584 ins_cost(MEMORY_REF_COST + DEFAULT_COST); |
|
5585 |
|
5586 size(2*4); |
|
5587 format %{ "LDUB $mem,$dst\t# ubyte & 8-bit mask -> long\n\t" |
|
5588 "AND $dst,$mask,$dst" %} |
|
5589 ins_encode %{ |
|
5590 __ ldub($mem$$Address, $dst$$Register); |
|
5591 __ and3($dst$$Register, $mask$$constant, $dst$$Register); |
|
5592 %} |
|
5593 ins_pipe(iload_mem); |
5561 %} |
5594 %} |
5562 |
5595 |
5563 // Load Short (16bit signed) |
5596 // Load Short (16bit signed) |
5564 instruct loadS(iRegI dst, memory mem) %{ |
5597 instruct loadS(iRegI dst, memory mem) %{ |
5565 match(Set dst (LoadS mem)); |
5598 match(Set dst (LoadS mem)); |
5608 size(4); |
5641 size(4); |
5609 format %{ "LDUH $mem,$dst\t! ushort/char" %} |
5642 format %{ "LDUH $mem,$dst\t! ushort/char" %} |
5610 ins_encode %{ |
5643 ins_encode %{ |
5611 __ lduh($mem$$Address, $dst$$Register); |
5644 __ lduh($mem$$Address, $dst$$Register); |
5612 %} |
5645 %} |
5613 ins_pipe(iload_mask_mem); |
5646 ins_pipe(iload_mem); |
5614 %} |
5647 %} |
5615 |
5648 |
5616 // Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed) |
5649 // Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed) |
5617 instruct loadUS2B(iRegI dst, indOffset13m7 mem, immI_24 twentyfour) %{ |
5650 instruct loadUS2B(iRegI dst, indOffset13m7 mem, immI_24 twentyfour) %{ |
5618 match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour)); |
5651 match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour)); |
5634 size(4); |
5667 size(4); |
5635 format %{ "LDUH $mem,$dst\t! ushort/char -> long" %} |
5668 format %{ "LDUH $mem,$dst\t! ushort/char -> long" %} |
5636 ins_encode %{ |
5669 ins_encode %{ |
5637 __ lduh($mem$$Address, $dst$$Register); |
5670 __ lduh($mem$$Address, $dst$$Register); |
5638 %} |
5671 %} |
5639 ins_pipe(iload_mask_mem); |
5672 ins_pipe(iload_mem); |
|
5673 %} |
|
5674 |
|
5675 // Load Unsigned Short/Char (16bit UNsigned) with mask 0xFF into a Long Register |
|
5676 instruct loadUS2L_immI_255(iRegL dst, indOffset13m7 mem, immI_255 mask) %{ |
|
5677 match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); |
|
5678 ins_cost(MEMORY_REF_COST); |
|
5679 |
|
5680 size(4); |
|
5681 format %{ "LDUB $mem+1,$dst\t! ushort/char & 0xFF -> long" %} |
|
5682 ins_encode %{ |
|
5683 __ ldub($mem$$Address, $dst$$Register, 1); // LSB is index+1 on BE |
|
5684 %} |
|
5685 ins_pipe(iload_mem); |
|
5686 %} |
|
5687 |
|
5688 // Load Unsigned Short/Char (16bit UNsigned) with a 13-bit mask into a Long Register |
|
5689 instruct loadUS2L_immI13(iRegL dst, memory mem, immI13 mask) %{ |
|
5690 match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); |
|
5691 ins_cost(MEMORY_REF_COST + DEFAULT_COST); |
|
5692 |
|
5693 size(2*4); |
|
5694 format %{ "LDUH $mem,$dst\t! ushort/char & 13-bit mask -> long\n\t" |
|
5695 "AND $dst,$mask,$dst" %} |
|
5696 ins_encode %{ |
|
5697 Register Rdst = $dst$$Register; |
|
5698 __ lduh($mem$$Address, Rdst); |
|
5699 __ and3(Rdst, $mask$$constant, Rdst); |
|
5700 %} |
|
5701 ins_pipe(iload_mem); |
|
5702 %} |
|
5703 |
|
5704 // Load Unsigned Short/Char (16bit UNsigned) with a 16-bit mask into a Long Register |
|
5705 instruct loadUS2L_immI16(iRegL dst, memory mem, immI16 mask, iRegL tmp) %{ |
|
5706 match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); |
|
5707 effect(TEMP dst, TEMP tmp); |
|
5708 ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST); |
|
5709 |
|
5710 size(3*4); |
|
5711 format %{ "LDUH $mem,$dst\t! ushort/char & 16-bit mask -> long\n\t" |
|
5712 "SET $mask,$tmp\n\t" |
|
5713 "AND $dst,$tmp,$dst" %} |
|
5714 ins_encode %{ |
|
5715 Register Rdst = $dst$$Register; |
|
5716 Register Rtmp = $tmp$$Register; |
|
5717 __ lduh($mem$$Address, Rdst); |
|
5718 __ set($mask$$constant, Rtmp); |
|
5719 __ and3(Rdst, Rtmp, Rdst); |
|
5720 %} |
|
5721 ins_pipe(iload_mem); |
5640 %} |
5722 %} |
5641 |
5723 |
5642 // Load Integer |
5724 // Load Integer |
5643 instruct loadI(iRegI dst, memory mem) %{ |
5725 instruct loadI(iRegI dst, memory mem) %{ |
5644 match(Set dst (LoadI mem)); |
5726 match(Set dst (LoadI mem)); |
5715 |
5797 |
5716 size(4); |
5798 size(4); |
5717 format %{ "LDSW $mem,$dst\t! int -> long" %} |
5799 format %{ "LDSW $mem,$dst\t! int -> long" %} |
5718 ins_encode %{ |
5800 ins_encode %{ |
5719 __ ldsw($mem$$Address, $dst$$Register); |
5801 __ ldsw($mem$$Address, $dst$$Register); |
|
5802 %} |
|
5803 ins_pipe(iload_mask_mem); |
|
5804 %} |
|
5805 |
|
5806 // Load Integer with mask 0xFF into a Long Register |
|
5807 instruct loadI2L_immI_255(iRegL dst, indOffset13m7 mem, immI_255 mask) %{ |
|
5808 match(Set dst (ConvI2L (AndI (LoadI mem) mask))); |
|
5809 ins_cost(MEMORY_REF_COST); |
|
5810 |
|
5811 size(4); |
|
5812 format %{ "LDUB $mem+3,$dst\t! int & 0xFF -> long" %} |
|
5813 ins_encode %{ |
|
5814 __ ldub($mem$$Address, $dst$$Register, 3); // LSB is index+3 on BE |
|
5815 %} |
|
5816 ins_pipe(iload_mem); |
|
5817 %} |
|
5818 |
|
5819 // Load Integer with mask 0xFFFF into a Long Register |
|
5820 instruct loadI2L_immI_65535(iRegL dst, indOffset13m7 mem, immI_65535 mask) %{ |
|
5821 match(Set dst (ConvI2L (AndI (LoadI mem) mask))); |
|
5822 ins_cost(MEMORY_REF_COST); |
|
5823 |
|
5824 size(4); |
|
5825 format %{ "LDUH $mem+2,$dst\t! int & 0xFFFF -> long" %} |
|
5826 ins_encode %{ |
|
5827 __ lduh($mem$$Address, $dst$$Register, 2); // LSW is index+2 on BE |
|
5828 %} |
|
5829 ins_pipe(iload_mem); |
|
5830 %} |
|
5831 |
|
5832 // Load Integer with a 13-bit mask into a Long Register |
|
5833 instruct loadI2L_immI13(iRegL dst, memory mem, immI13 mask) %{ |
|
5834 match(Set dst (ConvI2L (AndI (LoadI mem) mask))); |
|
5835 ins_cost(MEMORY_REF_COST + DEFAULT_COST); |
|
5836 |
|
5837 size(2*4); |
|
5838 format %{ "LDUW $mem,$dst\t! int & 13-bit mask -> long\n\t" |
|
5839 "AND $dst,$mask,$dst" %} |
|
5840 ins_encode %{ |
|
5841 Register Rdst = $dst$$Register; |
|
5842 __ lduw($mem$$Address, Rdst); |
|
5843 __ and3(Rdst, $mask$$constant, Rdst); |
|
5844 %} |
|
5845 ins_pipe(iload_mem); |
|
5846 %} |
|
5847 |
|
5848 // Load Integer with a 32-bit mask into a Long Register |
|
5849 instruct loadI2L_immI(iRegL dst, memory mem, immI mask, iRegL tmp) %{ |
|
5850 match(Set dst (ConvI2L (AndI (LoadI mem) mask))); |
|
5851 effect(TEMP dst, TEMP tmp); |
|
5852 ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST); |
|
5853 |
|
5854 size(3*4); |
|
5855 format %{ "LDUW $mem,$dst\t! int & 32-bit mask -> long\n\t" |
|
5856 "SET $mask,$tmp\n\t" |
|
5857 "AND $dst,$tmp,$dst" %} |
|
5858 ins_encode %{ |
|
5859 Register Rdst = $dst$$Register; |
|
5860 Register Rtmp = $tmp$$Register; |
|
5861 __ lduw($mem$$Address, Rdst); |
|
5862 __ set($mask$$constant, Rtmp); |
|
5863 __ and3(Rdst, Rtmp, Rdst); |
5720 %} |
5864 %} |
5721 ins_pipe(iload_mem); |
5865 ins_pipe(iload_mem); |
5722 %} |
5866 %} |
5723 |
5867 |
5724 // Load Unsigned Integer into a Long Register |
5868 // Load Unsigned Integer into a Long Register |