2787 Register dest = reg_to_register_object($dst$$reg); |
2775 Register dest = reg_to_register_object($dst$$reg); |
2788 Register temp = reg_to_register_object($tmp$$reg); |
2776 Register temp = reg_to_register_object($tmp$$reg); |
2789 __ set64( $src$$constant, dest, temp ); |
2777 __ set64( $src$$constant, dest, temp ); |
2790 %} |
2778 %} |
2791 |
2779 |
2792 enc_class LdImmF(immF src, regF dst, o7RegP tmp) %{ // Load Immediate |
|
2793 address float_address = MacroAssembler(&cbuf).float_constant($src$$constant); |
|
2794 RelocationHolder rspec = internal_word_Relocation::spec(float_address); |
|
2795 #ifdef _LP64 |
|
2796 Register tmp_reg = reg_to_register_object($tmp$$reg); |
|
2797 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2798 emit_ptr(cbuf, (intptr_t)float_address, tmp_reg, /*ForceRelocatable=*/ true); |
|
2799 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::ldf_op3, $tmp$$reg, 0 ); |
|
2800 #else // _LP64 |
|
2801 uint *code; |
|
2802 int tmp_reg = $tmp$$reg; |
|
2803 |
|
2804 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2805 emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) float_address ); |
|
2806 |
|
2807 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2808 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::ldf_op3, tmp_reg, (intptr_t) float_address ); |
|
2809 #endif // _LP64 |
|
2810 %} |
|
2811 |
|
2812 enc_class LdImmD(immD src, regD dst, o7RegP tmp) %{ // Load Immediate |
|
2813 address double_address = MacroAssembler(&cbuf).double_constant($src$$constant); |
|
2814 RelocationHolder rspec = internal_word_Relocation::spec(double_address); |
|
2815 #ifdef _LP64 |
|
2816 Register tmp_reg = reg_to_register_object($tmp$$reg); |
|
2817 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2818 emit_ptr(cbuf, (intptr_t)double_address, tmp_reg, /*ForceRelocatable=*/ true); |
|
2819 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, $tmp$$reg, 0 ); |
|
2820 #else // _LP64 |
|
2821 uint *code; |
|
2822 int tmp_reg = $tmp$$reg; |
|
2823 |
|
2824 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2825 emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) double_address ); |
|
2826 |
|
2827 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2828 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, tmp_reg, (intptr_t) double_address ); |
|
2829 #endif // _LP64 |
|
2830 %} |
|
2831 |
|
2832 enc_class LdReplImmI(immI src, regD dst, o7RegP tmp, int count, int width) %{ |
2780 enc_class LdReplImmI(immI src, regD dst, o7RegP tmp, int count, int width) %{ |
2833 // Load a constant replicated "count" times with width "width" |
2781 // Load a constant replicated "count" times with width "width" |
2834 int bit_width = $width$$constant * 8; |
2782 int bit_width = $width$$constant * 8; |
2835 jlong elt_val = $src$$constant; |
2783 jlong elt_val = $src$$constant; |
2836 elt_val &= (((jlong)1) << bit_width) - 1; // mask off sign bits |
2784 elt_val &= (((jlong)1) << bit_width) - 1; // mask off sign bits |
2838 for (int i = 0; i < $count$$constant - 1; i++) { |
2786 for (int i = 0; i < $count$$constant - 1; i++) { |
2839 val <<= bit_width; |
2787 val <<= bit_width; |
2840 val |= elt_val; |
2788 val |= elt_val; |
2841 } |
2789 } |
2842 jdouble dval = *(jdouble*)&val; // coerce to double type |
2790 jdouble dval = *(jdouble*)&val; // coerce to double type |
2843 address double_address = MacroAssembler(&cbuf).double_constant(dval); |
2791 MacroAssembler _masm(&cbuf); |
|
2792 address double_address = __ double_constant(dval); |
2844 RelocationHolder rspec = internal_word_Relocation::spec(double_address); |
2793 RelocationHolder rspec = internal_word_Relocation::spec(double_address); |
2845 #ifdef _LP64 |
2794 AddressLiteral addrlit(double_address, rspec); |
2846 Register tmp_reg = reg_to_register_object($tmp$$reg); |
2795 |
2847 cbuf.relocate(cbuf.code_end(), rspec, 0); |
2796 __ sethi(addrlit, $tmp$$Register); |
2848 emit_ptr(cbuf, (intptr_t)double_address, tmp_reg, /*ForceRelocatable=*/ true); |
2797 __ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec); |
2849 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, $tmp$$reg, 0 ); |
|
2850 #else // _LP64 |
|
2851 uint *code; |
|
2852 int tmp_reg = $tmp$$reg; |
|
2853 |
|
2854 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2855 emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) double_address ); |
|
2856 |
|
2857 cbuf.relocate(cbuf.code_end(), rspec, 0); |
|
2858 emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, tmp_reg, (intptr_t) double_address ); |
|
2859 #endif // _LP64 |
|
2860 %} |
|
2861 |
|
2862 |
|
2863 enc_class ShouldNotEncodeThis ( ) %{ |
|
2864 ShouldNotCallThis(); |
|
2865 %} |
2798 %} |
2866 |
2799 |
2867 // Compiler ensures base is doubleword aligned and cnt is count of doublewords |
2800 // Compiler ensures base is doubleword aligned and cnt is count of doublewords |
2868 enc_class enc_Clear_Array(iRegX cnt, iRegP base, iRegX temp) %{ |
2801 enc_class enc_Clear_Array(iRegX cnt, iRegP base, iRegX temp) %{ |
2869 MacroAssembler _masm(&cbuf); |
2802 MacroAssembler _masm(&cbuf); |
2899 int value_offset = java_lang_String:: value_offset_in_bytes(); |
2832 int value_offset = java_lang_String:: value_offset_in_bytes(); |
2900 int offset_offset = java_lang_String::offset_offset_in_bytes(); |
2833 int offset_offset = java_lang_String::offset_offset_in_bytes(); |
2901 int count_offset = java_lang_String:: count_offset_in_bytes(); |
2834 int count_offset = java_lang_String:: count_offset_in_bytes(); |
2902 |
2835 |
2903 // load str1 (jchar*) base address into tmp1_reg |
2836 // load str1 (jchar*) base address into tmp1_reg |
2904 __ load_heap_oop(Address(str1_reg, 0, value_offset), tmp1_reg); |
2837 __ load_heap_oop(str1_reg, value_offset, tmp1_reg); |
2905 __ ld(Address(str1_reg, 0, offset_offset), result_reg); |
2838 __ ld(str1_reg, offset_offset, result_reg); |
2906 __ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg); |
2839 __ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg); |
2907 __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted |
2840 __ ld(str1_reg, count_offset, str1_reg); // hoisted |
2908 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2841 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2909 __ load_heap_oop(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted |
2842 __ load_heap_oop(str2_reg, value_offset, tmp2_reg); // hoisted |
2910 __ add(result_reg, tmp1_reg, tmp1_reg); |
2843 __ add(result_reg, tmp1_reg, tmp1_reg); |
2911 |
2844 |
2912 // load str2 (jchar*) base address into tmp2_reg |
2845 // load str2 (jchar*) base address into tmp2_reg |
2913 // __ ld_ptr(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted |
2846 // __ ld_ptr(str2_reg, value_offset, tmp2_reg); // hoisted |
2914 __ ld(Address(str2_reg, 0, offset_offset), result_reg); |
2847 __ ld(str2_reg, offset_offset, result_reg); |
2915 __ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg); |
2848 __ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg); |
2916 __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted |
2849 __ ld(str2_reg, count_offset, str2_reg); // hoisted |
2917 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2850 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2918 __ subcc(str1_reg, str2_reg, O7); // hoisted |
2851 __ subcc(str1_reg, str2_reg, O7); // hoisted |
2919 __ add(result_reg, tmp2_reg, tmp2_reg); |
2852 __ add(result_reg, tmp2_reg, tmp2_reg); |
2920 |
2853 |
2921 // Compute the minimum of the string lengths(str1_reg) and the |
2854 // Compute the minimum of the string lengths(str1_reg) and the |
2922 // difference of the string lengths (stack) |
2855 // difference of the string lengths (stack) |
2923 |
2856 |
2924 // discard string base pointers, after loading up the lengths |
2857 // discard string base pointers, after loading up the lengths |
2925 // __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted |
2858 // __ ld(str1_reg, count_offset, str1_reg); // hoisted |
2926 // __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted |
2859 // __ ld(str2_reg, count_offset, str2_reg); // hoisted |
2927 |
2860 |
2928 // See if the lengths are different, and calculate min in str1_reg. |
2861 // See if the lengths are different, and calculate min in str1_reg. |
2929 // Stash diff in O7 in case we need it for a tie-breaker. |
2862 // Stash diff in O7 in case we need it for a tie-breaker. |
2930 Label Lskip; |
2863 Label Lskip; |
2931 // __ subcc(str1_reg, str2_reg, O7); // hoisted |
2864 // __ subcc(str1_reg, str2_reg, O7); // hoisted |
3018 int value_offset = java_lang_String:: value_offset_in_bytes(); |
2951 int value_offset = java_lang_String:: value_offset_in_bytes(); |
3019 int offset_offset = java_lang_String::offset_offset_in_bytes(); |
2952 int offset_offset = java_lang_String::offset_offset_in_bytes(); |
3020 int count_offset = java_lang_String:: count_offset_in_bytes(); |
2953 int count_offset = java_lang_String:: count_offset_in_bytes(); |
3021 |
2954 |
3022 // load str1 (jchar*) base address into tmp1_reg |
2955 // load str1 (jchar*) base address into tmp1_reg |
3023 __ load_heap_oop(Address(str1_reg, 0, value_offset), tmp1_reg); |
2956 __ load_heap_oop(Address(str1_reg, value_offset), tmp1_reg); |
3024 __ ld(Address(str1_reg, 0, offset_offset), result_reg); |
2957 __ ld(Address(str1_reg, offset_offset), result_reg); |
3025 __ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg); |
2958 __ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg); |
3026 __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted |
2959 __ ld(Address(str1_reg, count_offset), str1_reg); // hoisted |
3027 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2960 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
3028 __ load_heap_oop(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted |
2961 __ load_heap_oop(Address(str2_reg, value_offset), tmp2_reg); // hoisted |
3029 __ add(result_reg, tmp1_reg, tmp1_reg); |
2962 __ add(result_reg, tmp1_reg, tmp1_reg); |
3030 |
2963 |
3031 // load str2 (jchar*) base address into tmp2_reg |
2964 // load str2 (jchar*) base address into tmp2_reg |
3032 // __ ld_ptr(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted |
2965 // __ ld_ptr(Address(str2_reg, value_offset), tmp2_reg); // hoisted |
3033 __ ld(Address(str2_reg, 0, offset_offset), result_reg); |
2966 __ ld(Address(str2_reg, offset_offset), result_reg); |
3034 __ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg); |
2967 __ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg); |
3035 __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted |
2968 __ ld(Address(str2_reg, count_offset), str2_reg); // hoisted |
3036 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
2969 __ sll(result_reg, exact_log2(sizeof(jchar)), result_reg); |
3037 __ cmp(str1_reg, str2_reg); // hoisted |
2970 __ cmp(str1_reg, str2_reg); // hoisted |
3038 __ add(result_reg, tmp2_reg, tmp2_reg); |
2971 __ add(result_reg, tmp2_reg, tmp2_reg); |
3039 |
2972 |
3040 __ sll(str1_reg, exact_log2(sizeof(jchar)), str1_reg); |
2973 __ sll(str1_reg, exact_log2(sizeof(jchar)), str1_reg); |
5491 match(Set dst (LoadB mem)); |
5425 match(Set dst (LoadB mem)); |
5492 ins_cost(MEMORY_REF_COST); |
5426 ins_cost(MEMORY_REF_COST); |
5493 |
5427 |
5494 size(4); |
5428 size(4); |
5495 format %{ "LDSB $mem,$dst\t! byte" %} |
5429 format %{ "LDSB $mem,$dst\t! byte" %} |
5496 opcode(Assembler::ldsb_op3); |
5430 ins_encode %{ |
5497 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5431 __ ldsb($mem$$Address, $dst$$Register); |
|
5432 %} |
5498 ins_pipe(iload_mask_mem); |
5433 ins_pipe(iload_mask_mem); |
5499 %} |
5434 %} |
5500 |
5435 |
5501 // Load Byte (8bit signed) into a Long Register |
5436 // Load Byte (8bit signed) into a Long Register |
5502 instruct loadB2L(iRegL dst, memory mem) %{ |
5437 instruct loadB2L(iRegL dst, memory mem) %{ |
5503 match(Set dst (ConvI2L (LoadB mem))); |
5438 match(Set dst (ConvI2L (LoadB mem))); |
5504 ins_cost(MEMORY_REF_COST); |
5439 ins_cost(MEMORY_REF_COST); |
5505 |
5440 |
5506 size(4); |
5441 size(4); |
5507 format %{ "LDSB $mem,$dst\t! byte -> long" %} |
5442 format %{ "LDSB $mem,$dst\t! byte -> long" %} |
5508 opcode(Assembler::ldsb_op3); |
5443 ins_encode %{ |
5509 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5444 __ ldsb($mem$$Address, $dst$$Register); |
|
5445 %} |
5510 ins_pipe(iload_mask_mem); |
5446 ins_pipe(iload_mask_mem); |
5511 %} |
5447 %} |
5512 |
5448 |
5513 // Load Unsigned Byte (8bit UNsigned) into an int reg |
5449 // Load Unsigned Byte (8bit UNsigned) into an int reg |
5514 instruct loadUB(iRegI dst, memory mem) %{ |
5450 instruct loadUB(iRegI dst, memory mem) %{ |
5515 match(Set dst (LoadUB mem)); |
5451 match(Set dst (LoadUB mem)); |
5516 ins_cost(MEMORY_REF_COST); |
5452 ins_cost(MEMORY_REF_COST); |
5517 |
5453 |
5518 size(4); |
5454 size(4); |
5519 format %{ "LDUB $mem,$dst\t! ubyte" %} |
5455 format %{ "LDUB $mem,$dst\t! ubyte" %} |
5520 opcode(Assembler::ldub_op3); |
5456 ins_encode %{ |
5521 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5457 __ ldub($mem$$Address, $dst$$Register); |
|
5458 %} |
5522 ins_pipe(iload_mask_mem); |
5459 ins_pipe(iload_mask_mem); |
5523 %} |
5460 %} |
5524 |
5461 |
5525 // Load Unsigned Byte (8bit UNsigned) into a Long Register |
5462 // Load Unsigned Byte (8bit UNsigned) into a Long Register |
5526 instruct loadUB2L(iRegL dst, memory mem) %{ |
5463 instruct loadUB2L(iRegL dst, memory mem) %{ |
5527 match(Set dst (ConvI2L (LoadUB mem))); |
5464 match(Set dst (ConvI2L (LoadUB mem))); |
5528 ins_cost(MEMORY_REF_COST); |
5465 ins_cost(MEMORY_REF_COST); |
5529 |
5466 |
5530 size(4); |
5467 size(4); |
5531 format %{ "LDUB $mem,$dst\t! ubyte -> long" %} |
5468 format %{ "LDUB $mem,$dst\t! ubyte -> long" %} |
5532 opcode(Assembler::ldub_op3); |
5469 ins_encode %{ |
5533 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5470 __ ldub($mem$$Address, $dst$$Register); |
|
5471 %} |
5534 ins_pipe(iload_mask_mem); |
5472 ins_pipe(iload_mask_mem); |
5535 %} |
5473 %} |
5536 |
5474 |
5537 // Load Short (16bit signed) |
5475 // Load Short (16bit signed) |
5538 instruct loadS(iRegI dst, memory mem) %{ |
5476 instruct loadS(iRegI dst, memory mem) %{ |
5539 match(Set dst (LoadS mem)); |
5477 match(Set dst (LoadS mem)); |
5540 ins_cost(MEMORY_REF_COST); |
5478 ins_cost(MEMORY_REF_COST); |
5541 |
5479 |
5542 size(4); |
5480 size(4); |
5543 format %{ "LDSH $mem,$dst\t! short" %} |
5481 format %{ "LDSH $mem,$dst\t! short" %} |
5544 opcode(Assembler::ldsh_op3); |
5482 ins_encode %{ |
5545 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5483 __ ldsh($mem$$Address, $dst$$Register); |
|
5484 %} |
5546 ins_pipe(iload_mask_mem); |
5485 ins_pipe(iload_mask_mem); |
5547 %} |
5486 %} |
5548 |
5487 |
5549 // Load Short (16bit signed) into a Long Register |
5488 // Load Short (16bit signed) into a Long Register |
5550 instruct loadS2L(iRegL dst, memory mem) %{ |
5489 instruct loadS2L(iRegL dst, memory mem) %{ |
5551 match(Set dst (ConvI2L (LoadS mem))); |
5490 match(Set dst (ConvI2L (LoadS mem))); |
5552 ins_cost(MEMORY_REF_COST); |
5491 ins_cost(MEMORY_REF_COST); |
5553 |
5492 |
5554 size(4); |
5493 size(4); |
5555 format %{ "LDSH $mem,$dst\t! short -> long" %} |
5494 format %{ "LDSH $mem,$dst\t! short -> long" %} |
5556 opcode(Assembler::ldsh_op3); |
5495 ins_encode %{ |
5557 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5496 __ ldsh($mem$$Address, $dst$$Register); |
|
5497 %} |
5558 ins_pipe(iload_mask_mem); |
5498 ins_pipe(iload_mask_mem); |
5559 %} |
5499 %} |
5560 |
5500 |
5561 // Load Unsigned Short/Char (16bit UNsigned) |
5501 // Load Unsigned Short/Char (16bit UNsigned) |
5562 instruct loadUS(iRegI dst, memory mem) %{ |
5502 instruct loadUS(iRegI dst, memory mem) %{ |
5563 match(Set dst (LoadUS mem)); |
5503 match(Set dst (LoadUS mem)); |
5564 ins_cost(MEMORY_REF_COST); |
5504 ins_cost(MEMORY_REF_COST); |
5565 |
5505 |
5566 size(4); |
5506 size(4); |
5567 format %{ "LDUH $mem,$dst\t! ushort/char" %} |
5507 format %{ "LDUH $mem,$dst\t! ushort/char" %} |
5568 opcode(Assembler::lduh_op3); |
5508 ins_encode %{ |
5569 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5509 __ lduh($mem$$Address, $dst$$Register); |
|
5510 %} |
5570 ins_pipe(iload_mask_mem); |
5511 ins_pipe(iload_mask_mem); |
5571 %} |
5512 %} |
5572 |
5513 |
5573 // Load Unsigned Short/Char (16bit UNsigned) into a Long Register |
5514 // Load Unsigned Short/Char (16bit UNsigned) into a Long Register |
5574 instruct loadUS2L(iRegL dst, memory mem) %{ |
5515 instruct loadUS2L(iRegL dst, memory mem) %{ |
5575 match(Set dst (ConvI2L (LoadUS mem))); |
5516 match(Set dst (ConvI2L (LoadUS mem))); |
5576 ins_cost(MEMORY_REF_COST); |
5517 ins_cost(MEMORY_REF_COST); |
5577 |
5518 |
5578 size(4); |
5519 size(4); |
5579 format %{ "LDUH $mem,$dst\t! ushort/char -> long" %} |
5520 format %{ "LDUH $mem,$dst\t! ushort/char -> long" %} |
5580 opcode(Assembler::lduh_op3); |
5521 ins_encode %{ |
5581 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5522 __ lduh($mem$$Address, $dst$$Register); |
|
5523 %} |
5582 ins_pipe(iload_mask_mem); |
5524 ins_pipe(iload_mask_mem); |
5583 %} |
5525 %} |
5584 |
5526 |
5585 // Load Integer |
5527 // Load Integer |
5586 instruct loadI(iRegI dst, memory mem) %{ |
5528 instruct loadI(iRegI dst, memory mem) %{ |
5587 match(Set dst (LoadI mem)); |
5529 match(Set dst (LoadI mem)); |
5588 ins_cost(MEMORY_REF_COST); |
5530 ins_cost(MEMORY_REF_COST); |
5589 |
5531 |
5590 size(4); |
5532 size(4); |
5591 format %{ "LDUW $mem,$dst\t! int" %} |
5533 format %{ "LDUW $mem,$dst\t! int" %} |
5592 opcode(Assembler::lduw_op3); |
5534 ins_encode %{ |
5593 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5535 __ lduw($mem$$Address, $dst$$Register); |
|
5536 %} |
5594 ins_pipe(iload_mem); |
5537 ins_pipe(iload_mem); |
5595 %} |
5538 %} |
5596 |
5539 |
5597 // Load Integer into a Long Register |
5540 // Load Integer into a Long Register |
5598 instruct loadI2L(iRegL dst, memory mem) %{ |
5541 instruct loadI2L(iRegL dst, memory mem) %{ |
5599 match(Set dst (ConvI2L (LoadI mem))); |
5542 match(Set dst (ConvI2L (LoadI mem))); |
5600 ins_cost(MEMORY_REF_COST); |
5543 ins_cost(MEMORY_REF_COST); |
5601 |
5544 |
5602 size(4); |
5545 size(4); |
5603 format %{ "LDSW $mem,$dst\t! int -> long" %} |
5546 format %{ "LDSW $mem,$dst\t! int -> long" %} |
5604 opcode(Assembler::ldsw_op3); |
5547 ins_encode %{ |
5605 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5548 __ ldsw($mem$$Address, $dst$$Register); |
|
5549 %} |
5606 ins_pipe(iload_mem); |
5550 ins_pipe(iload_mem); |
5607 %} |
5551 %} |
5608 |
5552 |
5609 // Load Unsigned Integer into a Long Register |
5553 // Load Unsigned Integer into a Long Register |
5610 instruct loadUI2L(iRegL dst, memory mem) %{ |
5554 instruct loadUI2L(iRegL dst, memory mem) %{ |
5611 match(Set dst (LoadUI2L mem)); |
5555 match(Set dst (LoadUI2L mem)); |
5612 ins_cost(MEMORY_REF_COST); |
5556 ins_cost(MEMORY_REF_COST); |
5613 |
5557 |
5614 size(4); |
5558 size(4); |
5615 format %{ "LDUW $mem,$dst\t! uint -> long" %} |
5559 format %{ "LDUW $mem,$dst\t! uint -> long" %} |
5616 opcode(Assembler::lduw_op3); |
5560 ins_encode %{ |
5617 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5561 __ lduw($mem$$Address, $dst$$Register); |
|
5562 %} |
5618 ins_pipe(iload_mem); |
5563 ins_pipe(iload_mem); |
5619 %} |
5564 %} |
5620 |
5565 |
5621 // Load Long - aligned |
5566 // Load Long - aligned |
5622 instruct loadL(iRegL dst, memory mem ) %{ |
5567 instruct loadL(iRegL dst, memory mem ) %{ |
5623 match(Set dst (LoadL mem)); |
5568 match(Set dst (LoadL mem)); |
5624 ins_cost(MEMORY_REF_COST); |
5569 ins_cost(MEMORY_REF_COST); |
5625 |
5570 |
5626 size(4); |
5571 size(4); |
5627 format %{ "LDX $mem,$dst\t! long" %} |
5572 format %{ "LDX $mem,$dst\t! long" %} |
5628 opcode(Assembler::ldx_op3); |
5573 ins_encode %{ |
5629 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5574 __ ldx($mem$$Address, $dst$$Register); |
|
5575 %} |
5630 ins_pipe(iload_mem); |
5576 ins_pipe(iload_mem); |
5631 %} |
5577 %} |
5632 |
5578 |
5633 // Load Long - UNaligned |
5579 // Load Long - UNaligned |
5634 instruct loadL_unaligned(iRegL dst, memory mem, o7RegI tmp) %{ |
5580 instruct loadL_unaligned(iRegL dst, memory mem, o7RegI tmp) %{ |
5719 ins_cost(MEMORY_REF_COST); |
5665 ins_cost(MEMORY_REF_COST); |
5720 size(4); |
5666 size(4); |
5721 |
5667 |
5722 #ifndef _LP64 |
5668 #ifndef _LP64 |
5723 format %{ "LDUW $mem,$dst\t! ptr" %} |
5669 format %{ "LDUW $mem,$dst\t! ptr" %} |
5724 opcode(Assembler::lduw_op3, 0, REGP_OP); |
5670 ins_encode %{ |
|
5671 __ lduw($mem$$Address, $dst$$Register); |
|
5672 %} |
5725 #else |
5673 #else |
5726 format %{ "LDX $mem,$dst\t! ptr" %} |
5674 format %{ "LDX $mem,$dst\t! ptr" %} |
5727 opcode(Assembler::ldx_op3, 0, REGP_OP); |
5675 ins_encode %{ |
|
5676 __ ldx($mem$$Address, $dst$$Register); |
|
5677 %} |
5728 #endif |
5678 #endif |
5729 ins_encode( form3_mem_reg( mem, dst ) ); |
|
5730 ins_pipe(iload_mem); |
5679 ins_pipe(iload_mem); |
5731 %} |
5680 %} |
5732 |
5681 |
5733 // Load Compressed Pointer |
5682 // Load Compressed Pointer |
5734 instruct loadN(iRegN dst, memory mem) %{ |
5683 instruct loadN(iRegN dst, memory mem) %{ |
5735 match(Set dst (LoadN mem)); |
5684 match(Set dst (LoadN mem)); |
5736 ins_cost(MEMORY_REF_COST); |
5685 ins_cost(MEMORY_REF_COST); |
5737 size(4); |
5686 size(4); |
5738 |
5687 |
5739 format %{ "LDUW $mem,$dst\t! compressed ptr" %} |
5688 format %{ "LDUW $mem,$dst\t! compressed ptr" %} |
5740 ins_encode %{ |
5689 ins_encode %{ |
5741 Register index = $mem$$index$$Register; |
5690 __ lduw($mem$$Address, $dst$$Register); |
5742 if (index != G0) { |
5691 %} |
5743 __ lduw($mem$$base$$Register, index, $dst$$Register); |
5692 ins_pipe(iload_mem); |
5744 } else { |
|
5745 __ lduw($mem$$base$$Register, $mem$$disp, $dst$$Register); |
|
5746 } |
|
5747 %} |
|
5748 ins_pipe(iload_mem); |
|
5749 %} |
5693 %} |
5750 |
5694 |
5751 // Load Klass Pointer |
5695 // Load Klass Pointer |
5752 instruct loadKlass(iRegP dst, memory mem) %{ |
5696 instruct loadKlass(iRegP dst, memory mem) %{ |
5753 match(Set dst (LoadKlass mem)); |
5697 match(Set dst (LoadKlass mem)); |
5754 ins_cost(MEMORY_REF_COST); |
5698 ins_cost(MEMORY_REF_COST); |
5755 size(4); |
5699 size(4); |
5756 |
5700 |
5757 #ifndef _LP64 |
5701 #ifndef _LP64 |
5758 format %{ "LDUW $mem,$dst\t! klass ptr" %} |
5702 format %{ "LDUW $mem,$dst\t! klass ptr" %} |
5759 opcode(Assembler::lduw_op3, 0, REGP_OP); |
5703 ins_encode %{ |
|
5704 __ lduw($mem$$Address, $dst$$Register); |
|
5705 %} |
5760 #else |
5706 #else |
5761 format %{ "LDX $mem,$dst\t! klass ptr" %} |
5707 format %{ "LDX $mem,$dst\t! klass ptr" %} |
5762 opcode(Assembler::ldx_op3, 0, REGP_OP); |
5708 ins_encode %{ |
|
5709 __ ldx($mem$$Address, $dst$$Register); |
|
5710 %} |
5763 #endif |
5711 #endif |
5764 ins_encode( form3_mem_reg( mem, dst ) ); |
|
5765 ins_pipe(iload_mem); |
5712 ins_pipe(iload_mem); |
5766 %} |
5713 %} |
5767 |
5714 |
5768 // Load narrow Klass Pointer |
5715 // Load narrow Klass Pointer |
5769 instruct loadNKlass(iRegN dst, memory mem) %{ |
5716 instruct loadNKlass(iRegN dst, memory mem) %{ |
5770 match(Set dst (LoadNKlass mem)); |
5717 match(Set dst (LoadNKlass mem)); |
5771 ins_cost(MEMORY_REF_COST); |
5718 ins_cost(MEMORY_REF_COST); |
5772 size(4); |
5719 size(4); |
5773 |
5720 |
5774 format %{ "LDUW $mem,$dst\t! compressed klass ptr" %} |
5721 format %{ "LDUW $mem,$dst\t! compressed klass ptr" %} |
5775 |
|
5776 ins_encode %{ |
5722 ins_encode %{ |
5777 Register base = as_Register($mem$$base); |
5723 __ lduw($mem$$Address, $dst$$Register); |
5778 Register index = as_Register($mem$$index); |
|
5779 Register dst = $dst$$Register; |
|
5780 if (index != G0) { |
|
5781 __ lduw(base, index, dst); |
|
5782 } else { |
|
5783 __ lduw(base, $mem$$disp, dst); |
|
5784 } |
|
5785 %} |
5724 %} |
5786 ins_pipe(iload_mem); |
5725 ins_pipe(iload_mem); |
5787 %} |
5726 %} |
5788 |
5727 |
5789 // Load Double |
5728 // Load Double |
5925 instruct loadConF(regF dst, immF src, o7RegP tmp) %{ |
5864 instruct loadConF(regF dst, immF src, o7RegP tmp) %{ |
5926 match(Set dst src); |
5865 match(Set dst src); |
5927 effect(KILL tmp); |
5866 effect(KILL tmp); |
5928 |
5867 |
5929 #ifdef _LP64 |
5868 #ifdef _LP64 |
5930 size(36); |
5869 size(8*4); |
5931 #else |
5870 #else |
5932 size(8); |
5871 size(2*4); |
5933 #endif |
5872 #endif |
5934 |
5873 |
5935 format %{ "SETHI hi(&$src),$tmp\t!get float $src from table\n\t" |
5874 format %{ "SETHI hi(&$src),$tmp\t!get float $src from table\n\t" |
5936 "LDF [$tmp+lo(&$src)],$dst" %} |
5875 "LDF [$tmp+lo(&$src)],$dst" %} |
5937 ins_encode( LdImmF(src, dst, tmp) ); |
5876 ins_encode %{ |
|
5877 address float_address = __ float_constant($src$$constant); |
|
5878 RelocationHolder rspec = internal_word_Relocation::spec(float_address); |
|
5879 AddressLiteral addrlit(float_address, rspec); |
|
5880 |
|
5881 __ sethi(addrlit, $tmp$$Register); |
|
5882 __ ldf(FloatRegisterImpl::S, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec); |
|
5883 %} |
5938 ins_pipe(loadConFD); |
5884 ins_pipe(loadConFD); |
5939 %} |
5885 %} |
5940 |
5886 |
5941 instruct loadConD(regD dst, immD src, o7RegP tmp) %{ |
5887 instruct loadConD(regD dst, immD src, o7RegP tmp) %{ |
5942 match(Set dst src); |
5888 match(Set dst src); |
5943 effect(KILL tmp); |
5889 effect(KILL tmp); |
5944 |
5890 |
5945 #ifdef _LP64 |
5891 #ifdef _LP64 |
5946 size(36); |
5892 size(8*4); |
5947 #else |
5893 #else |
5948 size(8); |
5894 size(2*4); |
5949 #endif |
5895 #endif |
5950 |
5896 |
5951 format %{ "SETHI hi(&$src),$tmp\t!get double $src from table\n\t" |
5897 format %{ "SETHI hi(&$src),$tmp\t!get double $src from table\n\t" |
5952 "LDDF [$tmp+lo(&$src)],$dst" %} |
5898 "LDDF [$tmp+lo(&$src)],$dst" %} |
5953 ins_encode( LdImmD(src, dst, tmp) ); |
5899 ins_encode %{ |
|
5900 address double_address = __ double_constant($src$$constant); |
|
5901 RelocationHolder rspec = internal_word_Relocation::spec(double_address); |
|
5902 AddressLiteral addrlit(double_address, rspec); |
|
5903 |
|
5904 __ sethi(addrlit, $tmp$$Register); |
|
5905 __ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec); |
|
5906 %} |
5954 ins_pipe(loadConFD); |
5907 ins_pipe(loadConFD); |
5955 %} |
5908 %} |
5956 |
5909 |
5957 // Prefetch instructions. |
5910 // Prefetch instructions. |
5958 // Must be safe to execute with invalid address (cannot fault). |
5911 // Must be safe to execute with invalid address (cannot fault). |