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)