378 void TemplateTable::ldc2_w() { |
378 void TemplateTable::ldc2_w() { |
379 transition(vtos, vtos); |
379 transition(vtos, vtos); |
380 Label Long, Done; |
380 Label Long, Done; |
381 |
381 |
382 // get index in cpool |
382 // get index in cpool |
383 __ get_2_byte_integer_at_bcp(T2, AT, 1); |
383 __ get_unsigned_2_byte_index_at_bcp(T2, 1); |
384 __ huswap(T2); |
|
385 |
384 |
386 __ get_cpool_and_tags(T3, T1); |
385 __ get_cpool_and_tags(T3, T1); |
387 |
386 |
388 const int base_offset = ConstantPool::header_size() * wordSize; |
387 const int base_offset = ConstantPool::header_size() * wordSize; |
389 const int tags_offset = Array<u1>::base_offset_in_bytes(); |
388 const int tags_offset = Array<u1>::base_offset_in_bytes(); |
390 |
389 |
391 // get type in T1 |
390 // get type in T1 |
392 __ dadd(AT, T1, T2); |
391 if (UseLoongsonISA && Assembler::is_simm(tags_offset, 8)) { |
393 __ lb(T1, AT, tags_offset); |
392 __ gslbx(T1, T1, T2, tags_offset); |
|
393 } else { |
|
394 __ dadd(AT, T1, T2); |
|
395 __ lb(T1, AT, tags_offset); |
|
396 } |
394 |
397 |
395 __ daddiu(AT, T1, - JVM_CONSTANT_Double); |
398 __ daddiu(AT, T1, - JVM_CONSTANT_Double); |
396 __ bne(AT, R0, Long); |
399 __ bne(AT, R0, Long); |
397 __ delayed()->dsll(T2, T2, Address::times_8); |
400 __ delayed()->dsll(T2, T2, Address::times_8); |
|
401 |
398 // dtos |
402 // dtos |
399 __ daddu(AT, T3, T2); |
403 if (UseLoongsonISA && Assembler::is_simm(base_offset, 8)) { |
400 __ ldc1(FSF, AT, base_offset + 0 * wordSize); |
404 __ gsldxc1(FSF, T3, T2, base_offset); |
|
405 } else { |
|
406 __ daddu(AT, T3, T2); |
|
407 __ ldc1(FSF, AT, base_offset); |
|
408 } |
401 __ sdc1(FSF, SP, - 2 * wordSize); |
409 __ sdc1(FSF, SP, - 2 * wordSize); |
402 __ b(Done); |
410 __ b(Done); |
403 __ delayed()->daddi(SP, SP, - 2 * wordSize); |
411 __ delayed()->daddi(SP, SP, - 2 * wordSize); |
404 |
412 |
405 // ltos |
413 // ltos |
406 __ bind(Long); |
414 __ bind(Long); |
407 __ dadd(AT, T3, T2); |
415 if (UseLoongsonISA && Assembler::is_simm(base_offset, 8)) { |
408 __ ld(FSR, AT, base_offset + 0 * wordSize); |
416 __ gsldx(FSR, T3, T2, base_offset); |
|
417 } else { |
|
418 __ dadd(AT, T3, T2); |
|
419 __ ld(FSR, AT, base_offset); |
|
420 } |
409 __ push(ltos); |
421 __ push(ltos); |
410 |
422 |
411 __ bind(Done); |
423 __ bind(Done); |
412 } |
424 } |
413 |
425 |