99 reg_def FPR5H( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg()->next()); |
99 reg_def FPR5H( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg()->next()); |
100 reg_def FPR6L( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()); |
100 reg_def FPR6L( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()); |
101 reg_def FPR6H( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()->next()); |
101 reg_def FPR6H( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()->next()); |
102 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()); |
102 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()); |
103 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next()); |
103 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next()); |
|
104 // |
|
105 // Empty fill registers, which are never used, but supply alignment to xmm regs |
|
106 // |
|
107 reg_def FILL0( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(2)); |
|
108 reg_def FILL1( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(3)); |
|
109 reg_def FILL2( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(4)); |
|
110 reg_def FILL3( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(5)); |
|
111 reg_def FILL4( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(6)); |
|
112 reg_def FILL5( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(7)); |
|
113 reg_def FILL6( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(8)); |
|
114 reg_def FILL7( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(9)); |
104 |
115 |
105 // Specify priority of register selection within phases of register |
116 // Specify priority of register selection within phases of register |
106 // allocation. Highest priority is first. A useful heuristic is to |
117 // allocation. Highest priority is first. A useful heuristic is to |
107 // give registers a low priority when they are required by machine |
118 // give registers a low priority when they are required by machine |
108 // instructions, like EAX and EDX. Registers which are used as |
119 // instructions, like EAX and EDX. Registers which are used as |
110 // For the Intel integer registers, the equivalent Long pairs are |
121 // For the Intel integer registers, the equivalent Long pairs are |
111 // EDX:EAX, EBX:ECX, and EDI:EBP. |
122 // EDX:EAX, EBX:ECX, and EDI:EBP. |
112 alloc_class chunk0( ECX, EBX, EBP, EDI, EAX, EDX, ESI, ESP, |
123 alloc_class chunk0( ECX, EBX, EBP, EDI, EAX, EDX, ESI, ESP, |
113 FPR0L, FPR0H, FPR1L, FPR1H, FPR2L, FPR2H, |
124 FPR0L, FPR0H, FPR1L, FPR1H, FPR2L, FPR2H, |
114 FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H, |
125 FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H, |
115 FPR6L, FPR6H, FPR7L, FPR7H ); |
126 FPR6L, FPR6H, FPR7L, FPR7H, |
|
127 FILL0, FILL1, FILL2, FILL3, FILL4, FILL5, FILL6, FILL7); |
116 |
128 |
117 |
129 |
118 //----------Architecture Description Register Classes-------------------------- |
130 //----------Architecture Description Register Classes-------------------------- |
119 // Several register classes are automatically defined based upon information in |
131 // Several register classes are automatically defined based upon information in |
120 // this architecture description. |
132 // this architecture description. |
129 // Class for all registers |
141 // Class for all registers |
130 reg_class any_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP); |
142 reg_class any_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP); |
131 // Class for all registers (excluding EBP) |
143 // Class for all registers (excluding EBP) |
132 reg_class any_reg_no_ebp(EAX, EDX, EDI, ESI, ECX, EBX, ESP); |
144 reg_class any_reg_no_ebp(EAX, EDX, EDI, ESI, ECX, EBX, ESP); |
133 // Dynamic register class that selects at runtime between register classes |
145 // Dynamic register class that selects at runtime between register classes |
134 // any_reg and any_no_ebp_reg (depending on the value of the flag PreserveFramePointer). |
146 // any_reg and any_no_ebp_reg (depending on the value of the flag PreserveFramePointer). |
135 // Equivalent to: return PreserveFramePointer ? any_no_ebp_reg : any_reg; |
147 // Equivalent to: return PreserveFramePointer ? any_no_ebp_reg : any_reg; |
136 reg_class_dynamic any_reg(any_reg_no_ebp, any_reg_with_ebp, %{ PreserveFramePointer %}); |
148 reg_class_dynamic any_reg(any_reg_no_ebp, any_reg_with_ebp, %{ PreserveFramePointer %}); |
137 |
149 |
138 // Class for general registers |
150 // Class for general registers |
139 reg_class int_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX); |
151 reg_class int_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX); |
277 Compile* C = Compile::current(); |
289 Compile* C = Compile::current(); |
278 if (C->in_24_bit_fp_mode()) { |
290 if (C->in_24_bit_fp_mode()) { |
279 size += 6; // fldcw |
291 size += 6; // fldcw |
280 } |
292 } |
281 if (C->max_vector_size() > 16) { |
293 if (C->max_vector_size() > 16) { |
282 size += 3; // vzeroupper |
294 if(UseAVX <= 2) { |
|
295 size += 3; // vzeroupper |
|
296 } |
283 } |
297 } |
284 return size; |
298 return size; |
285 } |
299 } |
286 |
300 |
287 // !!!!! Special hack to get all type of calls to specify the byte offset |
301 // !!!!! Special hack to get all type of calls to specify the byte offset |
288 // from the start of the call to the point where the return address |
302 // from the start of the call to the point where the return address |
289 // will point. |
303 // will point. |
290 int MachCallStaticJavaNode::ret_addr_offset() { |
304 int MachCallStaticJavaNode::ret_addr_offset() { |
291 return 5 + pre_call_resets_size(); // 5 bytes from start of call to where return address points |
305 return 5 + pre_call_resets_size(); // 5 bytes from start of call to where return address points |
292 } |
306 } |
293 |
307 |
294 int MachCallDynamicJavaNode::ret_addr_offset() { |
308 int MachCallDynamicJavaNode::ret_addr_offset() { |
295 return 10 + pre_call_resets_size(); // 10 bytes from start of call to where return address points |
309 return 10 + pre_call_resets_size(); // 10 bytes from start of call to where return address points |
296 } |
310 } |
765 } |
779 } |
766 |
780 |
767 // Helper for XMM registers. Extra opcode bits, limited syntax. |
781 // Helper for XMM registers. Extra opcode bits, limited syntax. |
768 static int impl_x_helper( CodeBuffer *cbuf, bool do_size, bool is_load, |
782 static int impl_x_helper( CodeBuffer *cbuf, bool do_size, bool is_load, |
769 int offset, int reg_lo, int reg_hi, int size, outputStream* st ) { |
783 int offset, int reg_lo, int reg_hi, int size, outputStream* st ) { |
|
784 int in_size_in_bits = Assembler::EVEX_32bit; |
|
785 int evex_encoding = 0; |
|
786 if (reg_lo+1 == reg_hi) { |
|
787 in_size_in_bits = Assembler::EVEX_64bit; |
|
788 evex_encoding = Assembler::VEX_W; |
|
789 } |
770 if (cbuf) { |
790 if (cbuf) { |
771 MacroAssembler _masm(cbuf); |
791 MacroAssembler _masm(cbuf); |
772 if (reg_lo+1 == reg_hi) { // double move? |
792 if (reg_lo+1 == reg_hi) { // double move? |
773 if (is_load) { |
793 if (is_load) { |
774 __ movdbl(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset)); |
794 __ movdbl(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset)); |
797 else st->print("MOVSS [ESP + #%d],%s", |
817 else st->print("MOVSS [ESP + #%d],%s", |
798 offset, Matcher::regName[reg_lo]); |
818 offset, Matcher::regName[reg_lo]); |
799 } |
819 } |
800 #endif |
820 #endif |
801 } |
821 } |
802 int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4); |
822 bool is_single_byte = false; |
|
823 if ((UseAVX > 2) && (offset != 0)) { |
|
824 is_single_byte = Assembler::query_compressed_disp_byte(offset, true, 0, Assembler::EVEX_T1S, in_size_in_bits, evex_encoding); |
|
825 } |
|
826 int offset_size = 0; |
|
827 if (UseAVX > 2 ) { |
|
828 offset_size = (offset == 0) ? 0 : ((is_single_byte) ? 1 : 4); |
|
829 } else { |
|
830 offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4); |
|
831 } |
|
832 size += (UseAVX > 2) ? 2 : 0; // Need an additional two bytes for EVEX |
803 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. |
833 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix. |
804 return size+5+offset_size; |
834 return size+5+offset_size; |
805 } |
835 } |
806 |
836 |
807 |
837 |
852 #ifndef PRODUCT |
882 #ifndef PRODUCT |
853 } else if (!do_size) { |
883 } else if (!do_size) { |
854 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]); |
884 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]); |
855 #endif |
885 #endif |
856 } |
886 } |
857 return 4; |
887 return (UseAVX> 2) ? 6 : 4; |
858 } |
888 } |
859 |
889 |
860 |
890 |
861 static int impl_movx2gpr_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, |
891 static int impl_movx2gpr_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, |
862 int src_hi, int dst_hi, int size, outputStream* st ) { |
892 int src_hi, int dst_hi, int size, outputStream* st ) { |
868 #ifndef PRODUCT |
898 #ifndef PRODUCT |
869 } else if (!do_size) { |
899 } else if (!do_size) { |
870 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]); |
900 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]); |
871 #endif |
901 #endif |
872 } |
902 } |
873 return 4; |
903 return (UseAVX> 2) ? 6 : 4; |
874 } |
904 } |
875 |
905 |
876 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size, outputStream* st ) { |
906 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size, outputStream* st ) { |
877 if( cbuf ) { |
907 if( cbuf ) { |
878 emit_opcode(*cbuf, 0x8B ); |
908 emit_opcode(*cbuf, 0x8B ); |
972 case Op_VecY: |
1001 case Op_VecY: |
973 __ vmovdqu(Address(rsp, -32), xmm0); |
1002 __ vmovdqu(Address(rsp, -32), xmm0); |
974 __ vmovdqu(xmm0, Address(rsp, src_offset)); |
1003 __ vmovdqu(xmm0, Address(rsp, src_offset)); |
975 __ vmovdqu(Address(rsp, dst_offset), xmm0); |
1004 __ vmovdqu(Address(rsp, dst_offset), xmm0); |
976 __ vmovdqu(xmm0, Address(rsp, -32)); |
1005 __ vmovdqu(xmm0, Address(rsp, -32)); |
|
1006 case Op_VecZ: |
|
1007 __ evmovdqu(Address(rsp, -64), xmm0, 2); |
|
1008 __ evmovdqu(xmm0, Address(rsp, src_offset), 2); |
|
1009 __ evmovdqu(Address(rsp, dst_offset), xmm0, 2); |
|
1010 __ evmovdqu(xmm0, Address(rsp, -64), 2); |
977 break; |
1011 break; |
978 default: |
1012 default: |
979 ShouldNotReachHere(); |
1013 ShouldNotReachHere(); |
980 } |
1014 } |
981 int size = __ offset() - offset; |
1015 int size = __ offset() - offset; |
1007 st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" |
1041 st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" |
1008 "vmovdqu xmm0, [rsp + #%d]\n\t" |
1042 "vmovdqu xmm0, [rsp + #%d]\n\t" |
1009 "vmovdqu [rsp + #%d], xmm0\n\t" |
1043 "vmovdqu [rsp + #%d], xmm0\n\t" |
1010 "vmovdqu xmm0, [rsp - #32]", |
1044 "vmovdqu xmm0, [rsp - #32]", |
1011 src_offset, dst_offset); |
1045 src_offset, dst_offset); |
|
1046 case Op_VecZ: |
|
1047 st->print("vmovdqu [rsp - #64], xmm0\t# 512-bit mem-mem spill\n\t" |
|
1048 "vmovdqu xmm0, [rsp + #%d]\n\t" |
|
1049 "vmovdqu [rsp + #%d], xmm0\n\t" |
|
1050 "vmovdqu xmm0, [rsp - #64]", |
|
1051 src_offset, dst_offset); |
1012 break; |
1052 break; |
1013 default: |
1053 default: |
1014 ShouldNotReachHere(); |
1054 ShouldNotReachHere(); |
1015 } |
1055 } |
1016 #endif |
1056 #endif |
1040 |
1080 |
1041 if (bottom_type()->isa_vect() != NULL) { |
1081 if (bottom_type()->isa_vect() != NULL) { |
1042 uint ireg = ideal_reg(); |
1082 uint ireg = ideal_reg(); |
1043 assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); |
1083 assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); |
1044 assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity"); |
1084 assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity"); |
1045 assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity"); |
1085 assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ ), "sanity"); |
1046 if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { |
1086 if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { |
1047 // mem -> mem |
1087 // mem -> mem |
1048 int src_offset = ra_->reg2offset(src_first); |
1088 int src_offset = ra_->reg2offset(src_first); |
1049 int dst_offset = ra_->reg2offset(dst_first); |
1089 int dst_offset = ra_->reg2offset(dst_first); |
1050 return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st); |
1090 return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st); |
3996 %} |
4036 %} |
3997 |
4037 |
3998 // XMM Float register operands |
4038 // XMM Float register operands |
3999 operand regF() %{ |
4039 operand regF() %{ |
4000 predicate( UseSSE>=1 ); |
4040 predicate( UseSSE>=1 ); |
4001 constraint(ALLOC_IN_RC(float_reg)); |
4041 constraint(ALLOC_IN_RC(float_reg_legacy)); |
4002 match(RegF); |
4042 match(RegF); |
4003 format %{ %} |
4043 format %{ %} |
4004 interface(REG_INTER); |
4044 interface(REG_INTER); |
4005 %} |
4045 %} |
4006 |
4046 |
4007 // XMM Double register operands |
4047 // XMM Double register operands |
4008 operand regD() %{ |
4048 operand regD() %{ |
4009 predicate( UseSSE>=2 ); |
4049 predicate( UseSSE>=2 ); |
4010 constraint(ALLOC_IN_RC(double_reg)); |
4050 constraint(ALLOC_IN_RC(double_reg_legacy)); |
4011 match(RegD); |
4051 match(RegD); |
4012 format %{ %} |
4052 format %{ %} |
4013 interface(REG_INTER); |
4053 interface(REG_INTER); |
4014 %} |
4054 %} |
4015 |
4055 |
|
4056 // Vectors : note, we use legacy registers to avoid extra (unneeded in 32-bit VM) |
|
4057 // runtime code generation via reg_class_dynamic. |
|
4058 operand vecS() %{ |
|
4059 constraint(ALLOC_IN_RC(vectors_reg_legacy)); |
|
4060 match(VecS); |
|
4061 |
|
4062 format %{ %} |
|
4063 interface(REG_INTER); |
|
4064 %} |
|
4065 |
|
4066 operand vecD() %{ |
|
4067 constraint(ALLOC_IN_RC(vectord_reg_legacy)); |
|
4068 match(VecD); |
|
4069 |
|
4070 format %{ %} |
|
4071 interface(REG_INTER); |
|
4072 %} |
|
4073 |
|
4074 operand vecX() %{ |
|
4075 constraint(ALLOC_IN_RC(vectorx_reg_legacy)); |
|
4076 match(VecX); |
|
4077 |
|
4078 format %{ %} |
|
4079 interface(REG_INTER); |
|
4080 %} |
|
4081 |
|
4082 operand vecY() %{ |
|
4083 constraint(ALLOC_IN_RC(vectory_reg_legacy)); |
|
4084 match(VecY); |
|
4085 |
|
4086 format %{ %} |
|
4087 interface(REG_INTER); |
|
4088 %} |
4016 |
4089 |
4017 //----------Memory Operands---------------------------------------------------- |
4090 //----------Memory Operands---------------------------------------------------- |
4018 // Direct Memory Operand |
4091 // Direct Memory Operand |
4019 operand direct(immP addr) %{ |
4092 operand direct(immP addr) %{ |
4020 match(addr); |
4093 match(addr); |
5018 |
5091 |
5019 instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{ |
5092 instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{ |
5020 match(Set dst (ReverseBytesUS dst)); |
5093 match(Set dst (ReverseBytesUS dst)); |
5021 effect(KILL cr); |
5094 effect(KILL cr); |
5022 |
5095 |
5023 format %{ "BSWAP $dst\n\t" |
5096 format %{ "BSWAP $dst\n\t" |
5024 "SHR $dst,16\n\t" %} |
5097 "SHR $dst,16\n\t" %} |
5025 ins_encode %{ |
5098 ins_encode %{ |
5026 __ bswapl($dst$$Register); |
5099 __ bswapl($dst$$Register); |
5027 __ shrl($dst$$Register, 16); |
5100 __ shrl($dst$$Register, 16); |
5028 %} |
5101 %} |
5029 ins_pipe( ialu_reg ); |
5102 ins_pipe( ialu_reg ); |
5030 %} |
5103 %} |
5031 |
5104 |
5032 instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{ |
5105 instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{ |
5033 match(Set dst (ReverseBytesS dst)); |
5106 match(Set dst (ReverseBytesS dst)); |
5034 effect(KILL cr); |
5107 effect(KILL cr); |
5035 |
5108 |
5036 format %{ "BSWAP $dst\n\t" |
5109 format %{ "BSWAP $dst\n\t" |
5037 "SAR $dst,16\n\t" %} |
5110 "SAR $dst,16\n\t" %} |
5038 ins_encode %{ |
5111 ins_encode %{ |
5039 __ bswapl($dst$$Register); |
5112 __ bswapl($dst$$Register); |
5040 __ sarl($dst$$Register, 16); |
5113 __ sarl($dst$$Register, 16); |
5041 %} |
5114 %} |
5042 ins_pipe( ialu_reg ); |
5115 ins_pipe( ialu_reg ); |
5043 %} |
5116 %} |
5044 |
5117 |
5045 |
5118 |
8937 ins_pipe( ialu_reg_reg_long ); |
9010 ins_pipe( ialu_reg_reg_long ); |
8938 %} |
9011 %} |
8939 |
9012 |
8940 // Xor Long Register with Immediate -1 |
9013 // Xor Long Register with Immediate -1 |
8941 instruct xorl_eReg_im1(eRegL dst, immL_M1 imm) %{ |
9014 instruct xorl_eReg_im1(eRegL dst, immL_M1 imm) %{ |
8942 match(Set dst (XorL dst imm)); |
9015 match(Set dst (XorL dst imm)); |
8943 format %{ "NOT $dst.lo\n\t" |
9016 format %{ "NOT $dst.lo\n\t" |
8944 "NOT $dst.hi" %} |
9017 "NOT $dst.hi" %} |
8945 ins_encode %{ |
9018 ins_encode %{ |
8946 __ notl($dst$$Register); |
9019 __ notl($dst$$Register); |
8947 __ notl(HIGH_FROM_LOW($dst$$Register)); |
9020 __ notl(HIGH_FROM_LOW($dst$$Register)); |
8992 predicate(UseNewLongLShift); |
9065 predicate(UseNewLongLShift); |
8993 match(Set dst (LShiftL dst cnt)); |
9066 match(Set dst (LShiftL dst cnt)); |
8994 effect(KILL cr); |
9067 effect(KILL cr); |
8995 ins_cost(100); |
9068 ins_cost(100); |
8996 format %{ "ADD $dst.lo,$dst.lo\n\t" |
9069 format %{ "ADD $dst.lo,$dst.lo\n\t" |
8997 "ADC $dst.hi,$dst.hi\n\t" |
9070 "ADC $dst.hi,$dst.hi\n\t" |
8998 "ADD $dst.lo,$dst.lo\n\t" |
9071 "ADD $dst.lo,$dst.lo\n\t" |
8999 "ADC $dst.hi,$dst.hi" %} |
9072 "ADC $dst.hi,$dst.hi" %} |
9000 ins_encode %{ |
9073 ins_encode %{ |
9001 __ addl($dst$$Register,$dst$$Register); |
9074 __ addl($dst$$Register,$dst$$Register); |
9002 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); |
9075 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); |
9011 predicate(UseNewLongLShift); |
9084 predicate(UseNewLongLShift); |
9012 match(Set dst (LShiftL dst cnt)); |
9085 match(Set dst (LShiftL dst cnt)); |
9013 effect(KILL cr); |
9086 effect(KILL cr); |
9014 ins_cost(100); |
9087 ins_cost(100); |
9015 format %{ "ADD $dst.lo,$dst.lo\n\t" |
9088 format %{ "ADD $dst.lo,$dst.lo\n\t" |
9016 "ADC $dst.hi,$dst.hi\n\t" |
9089 "ADC $dst.hi,$dst.hi\n\t" |
9017 "ADD $dst.lo,$dst.lo\n\t" |
9090 "ADD $dst.lo,$dst.lo\n\t" |
9018 "ADC $dst.hi,$dst.hi\n\t" |
9091 "ADC $dst.hi,$dst.hi\n\t" |
9019 "ADD $dst.lo,$dst.lo\n\t" |
9092 "ADD $dst.lo,$dst.lo\n\t" |
9020 "ADC $dst.hi,$dst.hi" %} |
9093 "ADC $dst.hi,$dst.hi" %} |
9021 ins_encode %{ |
9094 ins_encode %{ |
9022 __ addl($dst$$Register,$dst$$Register); |
9095 __ addl($dst$$Register,$dst$$Register); |
9023 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); |
9096 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); |
11166 format %{ "MOV $dst,$src.lo" %} |
11239 format %{ "MOV $dst,$src.lo" %} |
11167 ins_encode(enc_CopyL_Lo(dst,src)); |
11240 ins_encode(enc_CopyL_Lo(dst,src)); |
11168 ins_pipe( ialu_reg_reg ); |
11241 ins_pipe( ialu_reg_reg ); |
11169 %} |
11242 %} |
11170 |
11243 |
11171 |
|
11172 instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{ |
11244 instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{ |
11173 match(Set dst (MoveF2I src)); |
11245 match(Set dst (MoveF2I src)); |
11174 effect( DEF dst, USE src ); |
11246 effect( DEF dst, USE src ); |
11175 ins_cost(100); |
11247 ins_cost(100); |
11176 format %{ "MOV $dst,$src\t# MoveF2I_stack_reg" %} |
11248 format %{ "MOV $dst,$src\t# MoveF2I_stack_reg" %} |
11398 match(Set dummy (ClearArray cnt base)); |
11470 match(Set dummy (ClearArray cnt base)); |
11399 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); |
11471 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); |
11400 format %{ "XOR EAX,EAX\t# ClearArray:\n\t" |
11472 format %{ "XOR EAX,EAX\t# ClearArray:\n\t" |
11401 "SHL ECX,1\t# Convert doublewords to words\n\t" |
11473 "SHL ECX,1\t# Convert doublewords to words\n\t" |
11402 "REP STOS\t# store EAX into [EDI++] while ECX--" %} |
11474 "REP STOS\t# store EAX into [EDI++] while ECX--" %} |
11403 ins_encode %{ |
11475 ins_encode %{ |
11404 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); |
11476 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); |
11405 %} |
11477 %} |
11406 ins_pipe( pipe_slow ); |
11478 ins_pipe( pipe_slow ); |
11407 %} |
11479 %} |
11408 |
11480 |
11411 match(Set dummy (ClearArray cnt base)); |
11483 match(Set dummy (ClearArray cnt base)); |
11412 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); |
11484 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); |
11413 format %{ "XOR EAX,EAX\t# ClearArray:\n\t" |
11485 format %{ "XOR EAX,EAX\t# ClearArray:\n\t" |
11414 "SHL ECX,3\t# Convert doublewords to bytes\n\t" |
11486 "SHL ECX,3\t# Convert doublewords to bytes\n\t" |
11415 "REP STOSB\t# store EAX into [EDI++] while ECX--" %} |
11487 "REP STOSB\t# store EAX into [EDI++] while ECX--" %} |
11416 ins_encode %{ |
11488 ins_encode %{ |
11417 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); |
11489 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); |
11418 %} |
11490 %} |
11419 ins_pipe( pipe_slow ); |
11491 ins_pipe( pipe_slow ); |
11420 %} |
11492 %} |
11421 |
11493 |