src/cpu/x86/vm/x86_64.ad

changeset 5001
e10e43e58e92
parent 5000
a6e09d6dd8e5
parent 4944
886d1fd67dc3
child 5003
78603aa58b1e
     1.1 --- a/src/cpu/x86/vm/x86_64.ad	Wed Apr 24 20:55:28 2013 -0400
     1.2 +++ b/src/cpu/x86/vm/x86_64.ad	Wed Apr 24 21:11:02 2013 -0400
     1.3 @@ -1,5 +1,5 @@
     1.4  //
     1.5 -// Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     1.6 +// Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
     1.7  // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8  //
     1.9  // This code is free software; you can redistribute it and/or modify it
    1.10 @@ -1651,17 +1651,6 @@
    1.11    return PTR_RBP_REG_mask();
    1.12  }
    1.13  
    1.14 -static Address build_address(int b, int i, int s, int d) {
    1.15 -  Register index = as_Register(i);
    1.16 -  Address::ScaleFactor scale = (Address::ScaleFactor)s;
    1.17 -  if (index == rsp) {
    1.18 -    index = noreg;
    1.19 -    scale = Address::no_scale;
    1.20 -  }
    1.21 -  Address addr(as_Register(b), index, scale, d);
    1.22 -  return addr;
    1.23 -}
    1.24 -
    1.25  %}
    1.26  
    1.27  //----------ENCODING BLOCK-----------------------------------------------------
    1.28 @@ -9403,7 +9392,7 @@
    1.29    match(Set dst (CmpLTMask p q));
    1.30    effect(KILL cr);
    1.31  
    1.32 -  ins_cost(400); // XXX
    1.33 +  ins_cost(400);
    1.34    format %{ "cmpl    $p, $q\t# cmpLTMask\n\t"
    1.35              "setlt   $dst\n\t"
    1.36              "movzbl  $dst, $dst\n\t"
    1.37 @@ -9421,37 +9410,63 @@
    1.38    match(Set dst (CmpLTMask dst zero));
    1.39    effect(KILL cr);
    1.40  
    1.41 -  ins_cost(100); // XXX
    1.42 +  ins_cost(100);
    1.43    format %{ "sarl    $dst, #31\t# cmpLTMask0" %}
    1.44 -  opcode(0xC1, 0x7);  /* C1 /7 ib */
    1.45 -  ins_encode(reg_opc_imm(dst, 0x1F));
    1.46 +  ins_encode %{
    1.47 +  __ sarl($dst$$Register, 31);
    1.48 +  %}
    1.49    ins_pipe(ialu_reg);
    1.50  %}
    1.51  
    1.52 -
    1.53 -instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rRegI tmp, rFlagsReg cr)
    1.54 +/* Better to save a register than avoid a branch */
    1.55 +instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr)
    1.56  %{
    1.57    match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
    1.58 -  effect(TEMP tmp, KILL cr);
    1.59 -
    1.60 -  ins_cost(400); // XXX
    1.61 -  format %{ "subl    $p, $q\t# cadd_cmpLTMask1\n\t"
    1.62 -            "sbbl    $tmp, $tmp\n\t"
    1.63 -            "andl    $tmp, $y\n\t"
    1.64 -            "addl    $p, $tmp" %}
    1.65 +  effect(KILL cr);
    1.66 +  ins_cost(300);
    1.67 +  format %{ "subl   $p,$q\t# cadd_cmpLTMask\n\t"
    1.68 +            "jge    done\n\t"
    1.69 +            "addl   $p,$y\n"
    1.70 +            "done:  " %}
    1.71    ins_encode %{
    1.72      Register Rp = $p$$Register;
    1.73      Register Rq = $q$$Register;
    1.74      Register Ry = $y$$Register;
    1.75 -    Register Rt = $tmp$$Register;
    1.76 +    Label done;
    1.77      __ subl(Rp, Rq);
    1.78 -    __ sbbl(Rt, Rt);
    1.79 -    __ andl(Rt, Ry);
    1.80 -    __ addl(Rp, Rt);
    1.81 +    __ jccb(Assembler::greaterEqual, done);
    1.82 +    __ addl(Rp, Ry);
    1.83 +    __ bind(done);
    1.84    %}
    1.85    ins_pipe(pipe_cmplt);
    1.86  %}
    1.87  
    1.88 +/* Better to save a register than avoid a branch */
    1.89 +instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr)
    1.90 +%{
    1.91 +  match(Set y (AndI (CmpLTMask p q) y));
    1.92 +  effect(KILL cr);
    1.93 +
    1.94 +  ins_cost(300);
    1.95 +
    1.96 +  format %{ "cmpl     $p, $q\t# and_cmpLTMask\n\t"
    1.97 +            "jlt      done\n\t"
    1.98 +            "xorl     $y, $y\n"
    1.99 +            "done:  " %}
   1.100 +  ins_encode %{
   1.101 +    Register Rp = $p$$Register;
   1.102 +    Register Rq = $q$$Register;
   1.103 +    Register Ry = $y$$Register;
   1.104 +    Label done;
   1.105 +    __ cmpl(Rp, Rq);
   1.106 +    __ jccb(Assembler::less, done);
   1.107 +    __ xorl(Ry, Ry);
   1.108 +    __ bind(done);
   1.109 +  %}
   1.110 +  ins_pipe(pipe_cmplt);
   1.111 +%}
   1.112 +
   1.113 +
   1.114  //---------- FP Instructions------------------------------------------------
   1.115  
   1.116  instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2)

mercurial