1.1 --- a/src/cpu/x86/vm/x86_64.ad Thu Apr 17 07:16:03 2008 -0700 1.2 +++ b/src/cpu/x86/vm/x86_64.ad Wed Apr 23 11:20:36 2008 -0700 1.3 @@ -6080,7 +6080,8 @@ 1.4 predicate(n->in(MemNode::Address)->bottom_type()->is_narrow()); 1.5 1.6 ins_cost(125); // XXX 1.7 - format %{ "movl $dst, $mem\t# compressed class" %} 1.8 + format %{ "movl $dst, $mem\t# compressed class\n\t" 1.9 + "decode_heap_oop $dst,$dst" %} 1.10 ins_encode %{ 1.11 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.12 Register dst = as_Register($dst$$reg); 1.13 @@ -6349,7 +6350,7 @@ 1.14 instruct loadConN0(rRegN dst, immN0 src, rFlagsReg cr) %{ 1.15 match(Set dst src); 1.16 effect(KILL cr); 1.17 - format %{ "xorq $dst, $src\t# compressed ptr" %} 1.18 + format %{ "xorq $dst, $src\t# compressed NULL ptr" %} 1.19 ins_encode %{ 1.20 Register dst = $dst$$Register; 1.21 __ xorq(dst, dst); 1.22 @@ -6361,7 +6362,8 @@ 1.23 match(Set dst src); 1.24 1.25 ins_cost(125); 1.26 - format %{ "movl $dst, $src\t# compressed ptr" %} 1.27 + format %{ "movq $dst, $src\t# compressed ptr\n\t" 1.28 + "encode_heap_oop_not_null $dst,$dst" %} 1.29 ins_encode %{ 1.30 address con = (address)$src$$constant; 1.31 Register dst = $dst$$Register; 1.32 @@ -6996,6 +6998,7 @@ 1.33 1.34 // Convert oop pointer into compressed form 1.35 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ 1.36 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull); 1.37 match(Set dst (EncodeP src)); 1.38 effect(KILL cr); 1.39 format %{ "encode_heap_oop $dst,$src" %} 1.40 @@ -7010,7 +7013,21 @@ 1.41 ins_pipe(ialu_reg_long); 1.42 %} 1.43 1.44 +instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ 1.45 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull); 1.46 + match(Set dst (EncodeP src)); 1.47 + effect(KILL cr); 1.48 + format %{ "encode_heap_oop_not_null $dst,$src" %} 1.49 + ins_encode %{ 1.50 + Register s = $src$$Register; 1.51 + Register d = $dst$$Register; 1.52 + __ encode_heap_oop_not_null(d, s); 1.53 + %} 1.54 + ins_pipe(ialu_reg_long); 1.55 +%} 1.56 + 1.57 instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ 1.58 + predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); 1.59 match(Set dst (DecodeN src)); 1.60 effect(KILL cr); 1.61 format %{ "decode_heap_oop $dst,$src" %} 1.62 @@ -7025,6 +7042,18 @@ 1.63 ins_pipe(ialu_reg_long); 1.64 %} 1.65 1.66 +instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{ 1.67 + predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); 1.68 + match(Set dst (DecodeN src)); 1.69 + format %{ "decode_heap_oop_not_null $dst,$src" %} 1.70 + ins_encode %{ 1.71 + Register s = $src$$Register; 1.72 + Register d = $dst$$Register; 1.73 + __ decode_heap_oop_not_null(d, s); 1.74 + %} 1.75 + ins_pipe(ialu_reg_long); 1.76 +%} 1.77 + 1.78 1.79 //----------Conditional Move--------------------------------------------------- 1.80 // Jump