src/cpu/mips/vm/templateTable_mips_64.cpp

changeset 6885
75ee8543b584
parent 6884
37fd1c756f31
child 6886
2fa8027581f6
equal deleted inserted replaced
6884:37fd1c756f31 6885:75ee8543b584
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) {

mercurial