comparison src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @ 6848:8e47bac5643a

7054512: Compress class pointers after perm gen removal Summary: support of compress class pointers in the compilers. Reviewed-by: kvn, twisti
author roland
date Tue, 09 Oct 2012 10:11:38 +0200
parents 7eca5de9e0b6
children d804e148cff8
comparison
equal deleted inserted replaced
6847:65d07d9ee446 6848:8e47bac5643a
338 // inline cache check; done before the frame is built. 338 // inline cache check; done before the frame is built.
339 int LIR_Assembler::check_icache() { 339 int LIR_Assembler::check_icache() {
340 Register receiver = FrameMap::receiver_opr->as_register(); 340 Register receiver = FrameMap::receiver_opr->as_register();
341 Register ic_klass = IC_Klass; 341 Register ic_klass = IC_Klass;
342 const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9); 342 const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
343 const bool do_post_padding = VerifyOops || UseCompressedOops; 343 const bool do_post_padding = VerifyOops || UseCompressedKlassPointers;
344 if (!do_post_padding) { 344 if (!do_post_padding) {
345 // insert some nops so that the verified entry point is aligned on CodeEntryAlignment 345 // insert some nops so that the verified entry point is aligned on CodeEntryAlignment
346 while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) { 346 while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
347 __ nop(); 347 __ nop();
348 } 348 }
1260 __ movptr(dest->as_register(), from_addr); 1260 __ movptr(dest->as_register(), from_addr);
1261 } 1261 }
1262 break; 1262 break;
1263 1263
1264 case T_ADDRESS: 1264 case T_ADDRESS:
1265 __ movptr(dest->as_register(), from_addr); 1265 if (UseCompressedKlassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
1266 __ movl(dest->as_register(), from_addr);
1267 } else {
1268 __ movptr(dest->as_register(), from_addr);
1269 }
1266 break; 1270 break;
1267 case T_INT: 1271 case T_INT:
1268 __ movl(dest->as_register(), from_addr); 1272 __ movl(dest->as_register(), from_addr);
1269 break; 1273 break;
1270 1274
1362 if (UseCompressedOops && !wide) { 1366 if (UseCompressedOops && !wide) {
1363 __ decode_heap_oop(dest->as_register()); 1367 __ decode_heap_oop(dest->as_register());
1364 } 1368 }
1365 #endif 1369 #endif
1366 __ verify_oop(dest->as_register()); 1370 __ verify_oop(dest->as_register());
1371 } else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
1372 #ifdef _LP64
1373 if (UseCompressedKlassPointers) {
1374 __ decode_klass_not_null(dest->as_register());
1375 }
1376 #endif
1367 } 1377 }
1368 } 1378 }
1369 1379
1370 1380
1371 void LIR_Assembler::prefetchr(LIR_Opr src) { 1381 void LIR_Assembler::prefetchr(LIR_Opr src) {
1703 if (obj == k_RInfo) { 1713 if (obj == k_RInfo) {
1704 k_RInfo = dst; 1714 k_RInfo = dst;
1705 } else if (obj == klass_RInfo) { 1715 } else if (obj == klass_RInfo) {
1706 klass_RInfo = dst; 1716 klass_RInfo = dst;
1707 } 1717 }
1708 if (k->is_loaded() && !UseCompressedOops) { 1718 if (k->is_loaded() && !UseCompressedKlassPointers) {
1709 select_different_registers(obj, dst, k_RInfo, klass_RInfo); 1719 select_different_registers(obj, dst, k_RInfo, klass_RInfo);
1710 } else { 1720 } else {
1711 Rtmp1 = op->tmp3()->as_register(); 1721 Rtmp1 = op->tmp3()->as_register();
1712 select_different_registers(obj, dst, k_RInfo, klass_RInfo, Rtmp1); 1722 select_different_registers(obj, dst, k_RInfo, klass_RInfo, Rtmp1);
1713 } 1723 }
3444 // but not necessarily exactly of type default_type. 3454 // but not necessarily exactly of type default_type.
3445 Label known_ok, halt; 3455 Label known_ok, halt;
3446 __ mov_metadata(tmp, default_type->constant_encoding()); 3456 __ mov_metadata(tmp, default_type->constant_encoding());
3447 #ifdef _LP64 3457 #ifdef _LP64
3448 if (UseCompressedKlassPointers) { 3458 if (UseCompressedKlassPointers) {
3449 __ encode_heap_oop(tmp); 3459 __ encode_klass_not_null(tmp);
3450 } 3460 }
3451 #endif 3461 #endif
3452 3462
3453 if (basic_type != T_OBJECT) { 3463 if (basic_type != T_OBJECT) {
3454 3464