111 __ mov(dst, r0);
112 }
113
114 __ pop(RegSet::range(r0,r28) - RegSet::of(dst), sp);
115 __ leave();
116
117 __ bind(done);
118
119 // Restore tmps
120 __ pop(savedRegs, sp);
121 }
122
123 #ifdef ASSERT
124
125 void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
126 DecoratorSet decorators,
127 BasicType type,
128 Address dst,
129 Register val,
130 Register tmp1,
131 Register tmp2) {
132 // Verify value
133 if (type == T_OBJECT || type == T_ARRAY) {
134 // Note that src could be noreg, which means we
135 // are storing null and can skip verification.
136 if (val != noreg) {
137 Label done;
138
139 // tmp1 and tmp2 are often set to noreg.
140 RegSet savedRegs = RegSet::of(rscratch1);
141 __ push(savedRegs, sp);
142
143 __ ldr(rscratch1, address_bad_mask_from_thread(rthread));
144 __ tst(val, rscratch1);
145 __ br(Assembler::EQ, done);
146 __ stop("Verify oop store failed");
147 __ should_not_reach_here();
148 __ bind(done);
149 __ pop(savedRegs, sp);
150 }
151 }
|
111 __ mov(dst, r0);
112 }
113
114 __ pop(RegSet::range(r0,r28) - RegSet::of(dst), sp);
115 __ leave();
116
117 __ bind(done);
118
119 // Restore tmps
120 __ pop(savedRegs, sp);
121 }
122
123 #ifdef ASSERT
124
125 void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
126 DecoratorSet decorators,
127 BasicType type,
128 Address dst,
129 Register val,
130 Register tmp1,
131 Register tmp2,
132 Register tmp3) {
133 // Verify value
134 if (type == T_OBJECT || type == T_ARRAY) {
135 // Note that src could be noreg, which means we
136 // are storing null and can skip verification.
137 if (val != noreg) {
138 Label done;
139
140 // tmp1 and tmp2 are often set to noreg.
141 RegSet savedRegs = RegSet::of(rscratch1);
142 __ push(savedRegs, sp);
143
144 __ ldr(rscratch1, address_bad_mask_from_thread(rthread));
145 __ tst(val, rscratch1);
146 __ br(Assembler::EQ, done);
147 __ stop("Verify oop store failed");
148 __ should_not_reach_here();
149 __ bind(done);
150 __ pop(savedRegs, sp);
151 }
152 }
|