src/cpu/x86/vm/x86_64.ad

changeset 559
b130b98db9cf
parent 548
ba764ed4b6f2
child 580
f3de1255b035
     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

mercurial