src/cpu/sparc/vm/stubGenerator_sparc.cpp

changeset 1861
2338d41fbd81
parent 1858
c640000b7cc1
child 1907
c18cbe5936b8
child 1919
61b2245abf36
equal deleted inserted replaced
1860:0c5b3cf3c1f5 1861:2338d41fbd81
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);

mercurial