@@ -211,6 +211,19 @@ Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
211
211
// FIXME: This needs to be much more clever. See x86.
212
212
}
213
213
214
+ // Ensure a valid Address (base + offset) to a stack-slot. If stack access is
215
+ // not encodable as a base + (immediate) offset, generate an explicit address
216
+ // calculation to hold the address in a temporary register.
217
+ Address LIR_Assembler::stack_slot_address (int index, uint size, Register tmp, int adjust) {
218
+ precond (size == 4 || size == 8 );
219
+ Address addr = frame_map ()->address_for_slot (index , adjust);
220
+ precond (addr.getMode () == Address::base_plus_offset);
221
+ precond (addr.base () == sp);
222
+ precond (addr.offset () > 0 );
223
+ uint mask = size - 1 ;
224
+ assert ((addr.offset () & mask) == 0 , " scaled offsets only" );
225
+ return __ legitimize_address (addr, size, tmp);
226
+ }
214
227
215
228
void LIR_Assembler::osr_entry () {
216
229
offsets ()->set_value (CodeOffsets::OSR_Entry, code_offset ());
@@ -735,32 +748,38 @@ void LIR_Assembler::reg2reg(LIR_Opr src, LIR_Opr dest) {
735
748
}
736
749
737
750
void LIR_Assembler::reg2stack (LIR_Opr src, LIR_Opr dest, BasicType type, bool pop_fpu_stack) {
751
+ precond (src->is_register () && dest->is_stack ());
752
+
753
+ uint const c_sz32 = sizeof (uint32_t );
754
+ uint const c_sz64 = sizeof (uint64_t );
755
+
738
756
if (src->is_single_cpu ()) {
757
+ int index = dest->single_stack_ix ();
739
758
if (is_reference_type (type)) {
740
- __ str (src->as_register (), frame_map ()-> address_for_slot (dest-> single_stack_ix () ));
759
+ __ str (src->as_register (), stack_slot_address ( index , c_sz64, rscratch1 ));
741
760
__ verify_oop (src->as_register ());
742
761
} else if (type == T_METADATA || type == T_DOUBLE || type == T_ADDRESS) {
743
- __ str (src->as_register (), frame_map ()-> address_for_slot (dest-> single_stack_ix () ));
762
+ __ str (src->as_register (), stack_slot_address ( index , c_sz64, rscratch1 ));
744
763
} else {
745
- __ strw (src->as_register (), frame_map ()-> address_for_slot (dest-> single_stack_ix () ));
764
+ __ strw (src->as_register (), stack_slot_address ( index , c_sz32, rscratch1 ));
746
765
}
747
766
748
767
} else if (src->is_double_cpu ()) {
749
- Address dest_addr_LO = frame_map ()->address_for_slot (dest->double_stack_ix (), lo_word_offset_in_bytes);
768
+ int index = dest->double_stack_ix ();
769
+ Address dest_addr_LO = stack_slot_address (index , c_sz64, rscratch1, lo_word_offset_in_bytes);
750
770
__ str (src->as_register_lo (), dest_addr_LO);
751
771
752
772
} else if (src->is_single_fpu ()) {
753
- Address dest_addr = frame_map ()-> address_for_slot ( dest->single_stack_ix () );
754
- __ strs (src->as_float_reg (), dest_addr );
773
+ int index = dest->single_stack_ix ();
774
+ __ strs (src->as_float_reg (), stack_slot_address ( index , c_sz32, rscratch1) );
755
775
756
776
} else if (src->is_double_fpu ()) {
757
- Address dest_addr = frame_map ()-> address_for_slot ( dest->double_stack_ix () );
758
- __ strd (src->as_double_reg (), dest_addr );
777
+ int index = dest->double_stack_ix ();
778
+ __ strd (src->as_double_reg (), stack_slot_address ( index , c_sz64, rscratch1) );
759
779
760
780
} else {
761
781
ShouldNotReachHere ();
762
782
}
763
-
764
783
}
765
784
766
785
@@ -845,30 +864,34 @@ void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
845
864
846
865
847
866
void LIR_Assembler::stack2reg (LIR_Opr src, LIR_Opr dest, BasicType type) {
848
- assert (src->is_stack (), " should not call otherwise" );
849
- assert (dest->is_register (), " should not call otherwise" );
867
+ precond (src->is_stack () && dest->is_register ());
868
+
869
+ uint const c_sz32 = sizeof (uint32_t );
870
+ uint const c_sz64 = sizeof (uint64_t );
850
871
851
872
if (dest->is_single_cpu ()) {
873
+ int index = src->single_stack_ix ();
852
874
if (is_reference_type (type)) {
853
- __ ldr (dest->as_register (), frame_map ()-> address_for_slot (src-> single_stack_ix () ));
875
+ __ ldr (dest->as_register (), stack_slot_address ( index , c_sz64, rscratch1 ));
854
876
__ verify_oop (dest->as_register ());
855
877
} else if (type == T_METADATA || type == T_ADDRESS) {
856
- __ ldr (dest->as_register (), frame_map ()-> address_for_slot (src-> single_stack_ix () ));
878
+ __ ldr (dest->as_register (), stack_slot_address ( index , c_sz64, rscratch1 ));
857
879
} else {
858
- __ ldrw (dest->as_register (), frame_map ()-> address_for_slot (src-> single_stack_ix () ));
880
+ __ ldrw (dest->as_register (), stack_slot_address ( index , c_sz32, rscratch1 ));
859
881
}
860
882
861
883
} else if (dest->is_double_cpu ()) {
862
- Address src_addr_LO = frame_map ()->address_for_slot (src->double_stack_ix (), lo_word_offset_in_bytes);
884
+ int index = src->double_stack_ix ();
885
+ Address src_addr_LO = stack_slot_address (index , c_sz64, rscratch1, lo_word_offset_in_bytes);
863
886
__ ldr (dest->as_register_lo (), src_addr_LO);
864
887
865
888
} else if (dest->is_single_fpu ()) {
866
- Address src_addr = frame_map ()-> address_for_slot ( src->single_stack_ix () );
867
- __ ldrs (dest->as_float_reg (), src_addr );
889
+ int index = src->single_stack_ix ();
890
+ __ ldrs (dest->as_float_reg (), stack_slot_address ( index , c_sz32, rscratch1) );
868
891
869
892
} else if (dest->is_double_fpu ()) {
870
- Address src_addr = frame_map ()-> address_for_slot ( src->double_stack_ix () );
871
- __ ldrd (dest->as_double_reg (), src_addr );
893
+ int index = src->double_stack_ix ();
894
+ __ ldrd (dest->as_double_reg (), stack_slot_address ( index , c_sz64, rscratch1) );
872
895
873
896
} else {
874
897
ShouldNotReachHere ();
0 commit comments