comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 164:c436414a719e

6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions Summary: Add LoadNKlass and CMoveN nodes, use CmpN and ConN nodes to generate narrow oops compare instructions. Reviewed-by: never, rasbold
author kvn
date Wed, 21 May 2008 13:46:23 -0700
parents b130b98db9cf
children feeb96a45707
comparison
equal deleted inserted replaced
163:885ed790ecf0 164:c436414a719e
1519 1519
1520 Address MacroAssembler::constant_oop_address(jobject obj, Register d) { 1520 Address MacroAssembler::constant_oop_address(jobject obj, Register d) {
1521 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); 1521 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
1522 int oop_index = oop_recorder()->find_index(obj); 1522 int oop_index = oop_recorder()->find_index(obj);
1523 return Address(d, address(obj), oop_Relocation::spec(oop_index)); 1523 return Address(d, address(obj), oop_Relocation::spec(oop_index));
1524 }
1525
1526 void MacroAssembler::set_narrow_oop(jobject obj, Register d) {
1527 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
1528 int oop_index = oop_recorder()->find_index(obj);
1529 RelocationHolder rspec = oop_Relocation::spec(oop_index);
1530
1531 assert_not_delayed();
1532 // Relocation with special format (see relocInfo_sparc.hpp).
1533 relocate(rspec, 1);
1534 // Assembler::sethi(0x3fffff, d);
1535 emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) );
1536 // Don't add relocation for 'add'. Do patching during 'sethi' processing.
1537 add(d, 0x3ff, d);
1538
1524 } 1539 }
1525 1540
1526 1541
1527 void MacroAssembler::align(int modulus) { 1542 void MacroAssembler::align(int modulus) {
1528 while (offset() % modulus != 0) nop(); 1543 while (offset() % modulus != 0) nop();
3535 set((-i*offset)+STACK_BIAS, Rscratch); 3550 set((-i*offset)+STACK_BIAS, Rscratch);
3536 st(G0, Rtsp, Rscratch); 3551 st(G0, Rtsp, Rscratch);
3537 } 3552 }
3538 } 3553 }
3539 3554
3540 void MacroAssembler::load_klass(Register s, Register d) { 3555 void MacroAssembler::load_klass(Register src_oop, Register klass) {
3541 // The number of bytes in this code is used by 3556 // The number of bytes in this code is used by
3542 // MachCallDynamicJavaNode::ret_addr_offset() 3557 // MachCallDynamicJavaNode::ret_addr_offset()
3543 // if this changes, change that. 3558 // if this changes, change that.
3544 if (UseCompressedOops) { 3559 if (UseCompressedOops) {
3545 lduw(s, oopDesc::klass_offset_in_bytes(), d); 3560 lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass);
3546 decode_heap_oop_not_null(d); 3561 decode_heap_oop_not_null(klass);
3547 } else { 3562 } else {
3548 ld_ptr(s, oopDesc::klass_offset_in_bytes(), d); 3563 ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass);
3549 } 3564 }
3550 } 3565 }
3551 3566
3552 // ??? figure out src vs. dst! 3567 void MacroAssembler::store_klass(Register klass, Register dst_oop) {
3553 void MacroAssembler::store_klass(Register d, Register s1) {
3554 if (UseCompressedOops) { 3568 if (UseCompressedOops) {
3555 assert(s1 != d, "not enough registers"); 3569 assert(dst_oop != klass, "not enough registers");
3556 encode_heap_oop_not_null(d); 3570 encode_heap_oop_not_null(klass);
3557 // Zero out entire klass field first. 3571 sllx(klass, BitsPerInt, klass);
3558 st_ptr(G0, s1, oopDesc::klass_offset_in_bytes()); 3572 stx(klass, dst_oop, oopDesc::klass_offset_in_bytes());
3559 st(d, s1, oopDesc::klass_offset_in_bytes());
3560 } else { 3573 } else {
3561 st_ptr(d, s1, oopDesc::klass_offset_in_bytes()); 3574 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes());
3562 } 3575 }
3563 } 3576 }
3564 3577
3565 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) { 3578 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) {
3566 if (UseCompressedOops) { 3579 if (UseCompressedOops) {