src/cpu/sparc/vm/sparc.ad

changeset 599
c436414a719e
parent 598
885ed790ecf0
child 600
437d03ea40b1
     1.1 --- a/src/cpu/sparc/vm/sparc.ad	Wed May 21 10:45:07 2008 -0700
     1.2 +++ b/src/cpu/sparc/vm/sparc.ad	Wed May 21 13:46:23 2008 -0700
     1.3 @@ -5486,10 +5486,9 @@
     1.4    ins_pipe(iload_mem);
     1.5  %}
     1.6  
     1.7 -// Load Klass Pointer
     1.8 -instruct loadKlassComp(iRegP dst, memory mem) %{
     1.9 -  match(Set dst (LoadKlass mem));
    1.10 -  predicate(n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop());
    1.11 +// Load narrow Klass Pointer
    1.12 +instruct loadNKlass(iRegN dst, memory mem) %{
    1.13 +  match(Set dst (LoadNKlass mem));
    1.14    ins_cost(MEMORY_REF_COST);
    1.15  
    1.16    format %{ "LDUW   $mem,$dst\t! compressed klass ptr" %}
    1.17 @@ -5503,9 +5502,6 @@
    1.18       } else {
    1.19         __ lduw(base, $mem$$disp, dst);
    1.20       }
    1.21 -     // klass oop never null but this is generated for nonheader klass loads
    1.22 -     // too which can be null.
    1.23 -     __ decode_heap_oop(dst);
    1.24    %}
    1.25    ins_pipe(iload_mem);
    1.26  %}
    1.27 @@ -5609,22 +5605,24 @@
    1.28    ins_pipe(loadConP_poll);
    1.29  %}
    1.30  
    1.31 +instruct loadConN0(iRegN dst, immN0 src) %{
    1.32 +  match(Set dst src);
    1.33 +
    1.34 +  size(4);
    1.35 +  format %{ "CLR    $dst\t! compressed NULL ptr" %}
    1.36 +  ins_encode( SetNull( dst ) );
    1.37 +  ins_pipe(ialu_imm);
    1.38 +%}
    1.39 +
    1.40  instruct loadConN(iRegN dst, immN src) %{
    1.41    match(Set dst src);
    1.42 -  ins_cost(DEFAULT_COST * 2);
    1.43 -  format %{ "SET    $src,$dst\t!ptr" %}
    1.44 +  ins_cost(DEFAULT_COST * 3/2);
    1.45 +  format %{ "SET    $src,$dst\t! compressed ptr" %}
    1.46    ins_encode %{
    1.47 -    address con = (address)$src$$constant;
    1.48      Register dst = $dst$$Register;
    1.49 -    if (con == NULL) {
    1.50 -      __ mov(G0, dst);
    1.51 -    } else {
    1.52 -      __ set_oop((jobject)$src$$constant, dst);
    1.53 -      __ encode_heap_oop(dst);
    1.54 -    }
    1.55 -  %}
    1.56 -  ins_pipe(loadConP);
    1.57 -
    1.58 +    __ set_narrow_oop((jobject)$src$$constant, dst);
    1.59 +  %}
    1.60 +  ins_pipe(ialu_hi_lo_reg);
    1.61  %}
    1.62  
    1.63  instruct loadConL(iRegL dst, immL src, o7RegL tmp) %{
    1.64 @@ -6258,6 +6256,34 @@
    1.65    ins_pipe(ialu_imm);
    1.66  %}
    1.67  
    1.68 +// Conditional move for RegN. Only cmov(reg,reg).
    1.69 +instruct cmovNP_reg(cmpOpP cmp, flagsRegP pcc, iRegN dst, iRegN src) %{
    1.70 +  match(Set dst (CMoveN (Binary cmp pcc) (Binary dst src)));
    1.71 +  ins_cost(150);
    1.72 +  format %{ "MOV$cmp $pcc,$src,$dst" %}
    1.73 +  ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::ptr_cc)) );
    1.74 +  ins_pipe(ialu_reg);
    1.75 +%}
    1.76 +
    1.77 +// This instruction also works with CmpN so we don't need cmovNN_reg.
    1.78 +instruct cmovNI_reg(cmpOp cmp, flagsReg icc, iRegN dst, iRegN src) %{
    1.79 +  match(Set dst (CMoveN (Binary cmp icc) (Binary dst src)));
    1.80 +  ins_cost(150);
    1.81 +  size(4);
    1.82 +  format %{ "MOV$cmp  $icc,$src,$dst" %}
    1.83 +  ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) );
    1.84 +  ins_pipe(ialu_reg);
    1.85 +%}
    1.86 +
    1.87 +instruct cmovNF_reg(cmpOpF cmp, flagsRegF fcc, iRegN dst, iRegN src) %{
    1.88 +  match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src)));
    1.89 +  ins_cost(150);
    1.90 +  size(4);
    1.91 +  format %{ "MOV$cmp $fcc,$src,$dst" %}
    1.92 +  ins_encode( enc_cmov_reg_f(cmp,dst,src, fcc) );
    1.93 +  ins_pipe(ialu_reg);
    1.94 +%}
    1.95 +
    1.96  // Conditional move
    1.97  instruct cmovPP_reg(cmpOpP cmp, flagsRegP pcc, iRegP dst, iRegP src) %{
    1.98    match(Set dst (CMoveP (Binary cmp pcc) (Binary dst src)));
    1.99 @@ -6275,6 +6301,7 @@
   1.100    ins_pipe(ialu_imm);
   1.101  %}
   1.102  
   1.103 +// This instruction also works with CmpN so we don't need cmovPN_reg.
   1.104  instruct cmovPI_reg(cmpOp cmp, flagsReg icc, iRegP dst, iRegP src) %{
   1.105    match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
   1.106    ins_cost(150);
   1.107 @@ -8265,6 +8292,27 @@
   1.108    ins_pipe(ialu_cconly_reg_imm);
   1.109  %}
   1.110  
   1.111 +// Compare Narrow oops
   1.112 +instruct compN_iRegN(flagsReg icc, iRegN op1, iRegN op2 ) %{
   1.113 +  match(Set icc (CmpN op1 op2));
   1.114 +
   1.115 +  size(4);
   1.116 +  format %{ "CMP    $op1,$op2\t! compressed ptr" %}
   1.117 +  opcode(Assembler::subcc_op3, Assembler::arith_op);
   1.118 +  ins_encode( form3_rs1_rs2_rd( op1, op2, R_G0 ) );
   1.119 +  ins_pipe(ialu_cconly_reg_reg);
   1.120 +%}
   1.121 +
   1.122 +instruct compN_iRegN_immN0(flagsReg icc, iRegN op1, immN0 op2 ) %{
   1.123 +  match(Set icc (CmpN op1 op2));
   1.124 +
   1.125 +  size(4);
   1.126 +  format %{ "CMP    $op1,$op2\t! compressed ptr" %}
   1.127 +  opcode(Assembler::subcc_op3, Assembler::arith_op);
   1.128 +  ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) );
   1.129 +  ins_pipe(ialu_cconly_reg_imm);
   1.130 +%}
   1.131 +
   1.132  //----------Max and Min--------------------------------------------------------
   1.133  // Min Instructions
   1.134  // Conditional move for min
   1.135 @@ -8595,6 +8643,14 @@
   1.136    ins_pipe(ialu_imm);
   1.137  %}
   1.138  
   1.139 +instruct cmovNL_reg(cmpOp cmp, flagsRegL xcc, iRegN dst, iRegN src) %{
   1.140 +  match(Set dst (CMoveN (Binary cmp xcc) (Binary dst src)));
   1.141 +  ins_cost(150);
   1.142 +  format %{ "MOV$cmp  $xcc,$src,$dst" %}
   1.143 +  ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::xcc)) );
   1.144 +  ins_pipe(ialu_reg);
   1.145 +%}
   1.146 +
   1.147  instruct cmovPL_reg(cmpOp cmp, flagsRegL xcc, iRegP dst, iRegP src) %{
   1.148    match(Set dst (CMoveP (Binary cmp xcc) (Binary dst src)));
   1.149    ins_cost(150);
   1.150 @@ -8826,16 +8882,6 @@
   1.151  %}
   1.152  
   1.153  
   1.154 -instruct compP_iRegN_immN0(flagsRegP pcc, iRegN op1, immN0 op2 ) %{
   1.155 -  match(Set pcc (CmpN op1 op2));
   1.156 -
   1.157 -  size(4);
   1.158 -  format %{ "CMP    $op1,$op2\t! ptr" %}
   1.159 -  opcode(Assembler::subcc_op3, Assembler::arith_op);
   1.160 -  ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) );
   1.161 -  ins_pipe(ialu_cconly_reg_imm);
   1.162 -%}
   1.163 -
   1.164  // ============================================================================
   1.165  // inlined locking and unlocking
   1.166  

mercurial