137 // create activation frame & allocate space for parameters |
137 // create activation frame & allocate space for parameters |
138 { const Register t = G3_scratch; |
138 { const Register t = G3_scratch; |
139 __ ld_ptr(parameter_size.as_address(), t); // get parameter size (in words) |
139 __ ld_ptr(parameter_size.as_address(), t); // get parameter size (in words) |
140 __ add(t, frame::memory_parameter_word_sp_offset, t); // add space for save area (in words) |
140 __ add(t, frame::memory_parameter_word_sp_offset, t); // add space for save area (in words) |
141 __ round_to(t, WordsPerLong); // make sure it is multiple of 2 (in words) |
141 __ round_to(t, WordsPerLong); // make sure it is multiple of 2 (in words) |
142 __ sll(t, Interpreter::logStackElementSize(), t); // compute number of bytes |
142 __ sll(t, Interpreter::logStackElementSize, t); // compute number of bytes |
143 __ neg(t); // negate so it can be used with save |
143 __ neg(t); // negate so it can be used with save |
144 __ save(SP, t, SP); // setup new frame |
144 __ save(SP, t, SP); // setup new frame |
145 } |
145 } |
146 |
146 |
147 // +---------------+ <--- sp + 0 |
147 // +---------------+ <--- sp + 0 |
189 __ delayed()->sub(dst, BytesPerWord, dst); // setup Lentry_args |
189 __ delayed()->sub(dst, BytesPerWord, dst); // setup Lentry_args |
190 |
190 |
191 // copy parameters if any |
191 // copy parameters if any |
192 Label loop; |
192 Label loop; |
193 __ BIND(loop); |
193 __ BIND(loop); |
194 // Store tag first. |
|
195 if (TaggedStackInterpreter) { |
|
196 __ ld_ptr(src, 0, tmp); |
|
197 __ add(src, BytesPerWord, src); // get next |
|
198 __ st_ptr(tmp, dst, Interpreter::tag_offset_in_bytes()); |
|
199 } |
|
200 // Store parameter value |
194 // Store parameter value |
201 __ ld_ptr(src, 0, tmp); |
195 __ ld_ptr(src, 0, tmp); |
202 __ add(src, BytesPerWord, src); |
196 __ add(src, BytesPerWord, src); |
203 __ st_ptr(tmp, dst, Interpreter::value_offset_in_bytes()); |
197 __ st_ptr(tmp, dst, 0); |
204 __ deccc(cnt); |
198 __ deccc(cnt); |
205 __ br(Assembler::greater, false, Assembler::pt, loop); |
199 __ br(Assembler::greater, false, Assembler::pt, loop); |
206 __ delayed()->sub(dst, Interpreter::stackElementSize(), dst); |
200 __ delayed()->sub(dst, Interpreter::stackElementSize, dst); |
207 |
201 |
208 // done |
202 // done |
209 __ BIND(exit); |
203 __ BIND(exit); |
210 } |
204 } |
211 |
205 |
218 #endif |
212 #endif |
219 |
213 |
220 // setup parameters |
214 // setup parameters |
221 const Register t = G3_scratch; |
215 const Register t = G3_scratch; |
222 __ ld_ptr(parameter_size.as_in().as_address(), t); // get parameter size (in words) |
216 __ ld_ptr(parameter_size.as_in().as_address(), t); // get parameter size (in words) |
223 __ sll(t, Interpreter::logStackElementSize(), t); // compute number of bytes |
217 __ sll(t, Interpreter::logStackElementSize, t); // compute number of bytes |
224 __ sub(FP, t, Gargs); // setup parameter pointer |
218 __ sub(FP, t, Gargs); // setup parameter pointer |
225 #ifdef _LP64 |
219 #ifdef _LP64 |
226 __ add( Gargs, STACK_BIAS, Gargs ); // Account for LP64 stack bias |
220 __ add( Gargs, STACK_BIAS, Gargs ); // Account for LP64 stack bias |
227 #endif |
221 #endif |
228 __ mov(SP, O5_savedSP); |
222 __ mov(SP, O5_savedSP); |