257 void TemplateTable::ldc(bool wide) { |
257 void TemplateTable::ldc(bool wide) { |
258 transition(vtos, vtos); |
258 transition(vtos, vtos); |
259 Label call_ldc, notFloat, notClass, Done; |
259 Label call_ldc, notFloat, notClass, Done; |
260 // get index in cpool |
260 // get index in cpool |
261 if (wide) { |
261 if (wide) { |
262 __ get_2_byte_integer_at_bcp(T2, AT, 1); |
262 __ get_unsigned_2_byte_index_at_bcp(T2, 1); |
263 __ huswap(T2); |
|
264 } else { |
263 } else { |
265 __ lbu(T2, at_bcp(1)); |
264 __ lbu(T2, at_bcp(1)); |
266 } |
265 } |
267 |
266 |
268 __ get_cpool_and_tags(T3, T1); |
267 __ get_cpool_and_tags(T3, T1); |
269 |
268 |
270 const int base_offset = ConstantPool::header_size() * wordSize; |
269 const int base_offset = ConstantPool::header_size() * wordSize; |
271 const int tags_offset = Array<u1>::base_offset_in_bytes(); |
270 const int tags_offset = Array<u1>::base_offset_in_bytes(); |
272 |
271 |
273 // get type |
272 // get type |
274 __ dadd(AT, T1, T2); |
273 if (UseLoongsonISA && Assembler::is_simm(sizeof(tags_offset), 8)) { |
275 __ lb(T1, AT, tags_offset); |
274 __ gslbx(T1, T1, T2, tags_offset); |
|
275 } else { |
|
276 __ dadd(AT, T1, T2); |
|
277 __ lb(T1, AT, tags_offset); |
|
278 } |
276 //now T1 is the tag |
279 //now T1 is the tag |
277 |
280 |
278 // unresolved class - get the resolved class |
281 // unresolved class - get the resolved class |
279 __ daddiu(AT, T1, - JVM_CONSTANT_UnresolvedClass); |
282 __ daddiu(AT, T1, - JVM_CONSTANT_UnresolvedClass); |
280 __ beq(AT, R0, call_ldc); |
283 __ beq(AT, R0, call_ldc); |
290 __ daddiu(AT, T1, - JVM_CONSTANT_Class); |
293 __ daddiu(AT, T1, - JVM_CONSTANT_Class); |
291 __ bne(AT, R0, notClass); |
294 __ bne(AT, R0, notClass); |
292 __ delayed()->dsll(T2, T2, Address::times_8); |
295 __ delayed()->dsll(T2, T2, Address::times_8); |
293 |
296 |
294 __ bind(call_ldc); |
297 __ bind(call_ldc); |
295 |
|
296 __ move(A1, wide); |
298 __ move(A1, wide); |
297 call_VM(FSR, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), A1); |
299 call_VM(FSR, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), A1); |
298 __ push(atos); |
300 //__ push(atos); |
|
301 __ sd(FSR, SP, - Interpreter::stackElementSize); |
299 __ b(Done); |
302 __ b(Done); |
300 __ delayed()->nop(); |
303 __ delayed()->daddiu(SP, SP, - Interpreter::stackElementSize); |
|
304 __ nop(); // added for performance issue |
|
305 |
301 __ bind(notClass); |
306 __ bind(notClass); |
302 |
|
303 __ daddiu(AT, T1, -JVM_CONSTANT_Float); |
307 __ daddiu(AT, T1, -JVM_CONSTANT_Float); |
304 __ bne(AT, R0, notFloat); |
308 __ bne(AT, R0, notFloat); |
305 __ delayed()->nop(); |
309 __ delayed()->nop(); |
306 // ftos |
310 // ftos |
307 __ dadd(AT, T3, T2); |
311 if (UseLoongsonISA && Assembler::is_simm(sizeof(base_offset), 8)) { |
308 __ lwc1(FSF, AT, base_offset); |
312 __ gslwxc1(FSF, T3, T2, base_offset); |
309 __ push_f(); |
313 } else { |
|
314 __ dadd(AT, T3, T2); |
|
315 __ lwc1(FSF, AT, base_offset); |
|
316 } |
|
317 //__ push_f(); |
|
318 __ swc1(FSF, SP, - Interpreter::stackElementSize); |
310 __ b(Done); |
319 __ b(Done); |
311 __ delayed()->nop(); |
320 __ delayed()->daddiu(SP, SP, - Interpreter::stackElementSize); |
312 |
321 |
313 __ bind(notFloat); |
322 __ bind(notFloat); |
314 #ifdef ASSERT |
323 #ifdef ASSERT |
315 { |
324 { |
316 Label L; |
325 Label L; |
319 __ delayed()->nop(); |
328 __ delayed()->nop(); |
320 __ stop("unexpected tag type in ldc"); |
329 __ stop("unexpected tag type in ldc"); |
321 __ bind(L); |
330 __ bind(L); |
322 } |
331 } |
323 #endif |
332 #endif |
324 // atos and itos |
333 // itos JVM_CONSTANT_Integer only |
325 __ dadd(T0, T3, T2); |
334 if (UseLoongsonISA && Assembler::is_simm(sizeof(base_offset), 8)) { |
326 __ lw(FSR, T0, base_offset); |
335 __ gslwx(FSR, T3, T2, base_offset); |
|
336 } else { |
|
337 __ dadd(T0, T3, T2); |
|
338 __ lw(FSR, T0, base_offset); |
|
339 } |
327 __ push(itos); |
340 __ push(itos); |
328 __ b(Done); |
|
329 __ delayed()->nop(); |
|
330 |
|
331 |
|
332 if (VerifyOops) { |
|
333 __ verify_oop(FSR); |
|
334 } |
|
335 |
|
336 __ bind(Done); |
341 __ bind(Done); |
337 } |
342 } |
338 |
343 |
339 // Fast path for caching oop constants. |
344 // Fast path for caching oop constants. |
340 void TemplateTable::fast_aldc(bool wide) { |
345 void TemplateTable::fast_aldc(bool wide) { |