61 // Barrier not needed |
61 // Barrier not needed |
62 BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread); |
62 BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread); |
63 return; |
63 return; |
64 } |
64 } |
65 |
65 |
66 // rscratch1 can be passed as src or dst, so don't use it. |
66 assert_different_registers(rscratch1, rscratch2, src.base()); |
67 RegSet savedRegs = RegSet::of(rscratch2, rheapbase); |
67 assert_different_registers(rscratch1, rscratch2, dst); |
|
68 |
|
69 RegSet savedRegs = RegSet::range(r0,r28) - RegSet::of(dst, rscratch1, rscratch2); |
68 |
70 |
69 Label done; |
71 Label done; |
70 assert_different_registers(rheapbase, rscratch2, dst); |
|
71 assert_different_registers(rheapbase, rscratch2, src.base()); |
|
72 |
|
73 __ push(savedRegs, sp); |
|
74 |
72 |
75 // Load bad mask into scratch register. |
73 // Load bad mask into scratch register. |
76 __ ldr(rheapbase, address_bad_mask_from_thread(rthread)); |
74 __ ldr(rscratch1, address_bad_mask_from_thread(rthread)); |
77 __ lea(rscratch2, src); |
75 __ lea(rscratch2, src); |
78 __ ldr(dst, src); |
76 __ ldr(dst, src); |
79 |
77 |
80 // Test reference against bad mask. If mask bad, then we need to fix it up. |
78 // Test reference against bad mask. If mask bad, then we need to fix it up. |
81 __ tst(dst, rheapbase); |
79 __ tst(dst, rscratch1); |
82 __ br(Assembler::EQ, done); |
80 __ br(Assembler::EQ, done); |
83 |
81 |
84 __ enter(); |
82 __ enter(); |
85 |
83 |
86 __ push(RegSet::range(r0,r28) - RegSet::of(dst), sp); |
84 __ push(savedRegs, sp); |
87 |
85 |
88 if (c_rarg0 != dst) { |
86 if (c_rarg0 != dst) { |
89 __ mov(c_rarg0, dst); |
87 __ mov(c_rarg0, dst); |
90 } |
88 } |
91 __ mov(c_rarg1, rscratch2); |
89 __ mov(c_rarg1, rscratch2); |
92 |
90 |
93 int step = 4 * wordSize; |
91 int step = 4 * wordSize; |
94 __ mov(rscratch1, -step); |
92 __ mov(rscratch2, -step); |
95 __ sub(sp, sp, step); |
93 __ sub(sp, sp, step); |
96 |
94 |
97 for (int i = 28; i >= 4; i -= 4) { |
95 for (int i = 28; i >= 4; i -= 4) { |
98 __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2), |
96 __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2), |
99 as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch1))); |
97 as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch2))); |
100 } |
98 } |
|
99 __ st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2), |
|
100 as_FloatRegister(3), __ T1D, Address(sp)); |
101 |
101 |
102 __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2); |
102 __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2); |
103 |
103 |
104 for (int i = 0; i <= 28; i += 4) { |
104 for (int i = 0; i <= 28; i += 4) { |
105 __ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2), |
105 __ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2), |