Mercurial > hg > graal-compiler
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) { |