src/cpu/sparc/vm/sparc.ad

changeset 3001
faa472957b38
parent 2683
7e88bdae86ec
child 3037
3d42f82cd811
     1.1 --- a/src/cpu/sparc/vm/sparc.ad	Thu Jul 07 10:51:07 2011 -0700
     1.2 +++ b/src/cpu/sparc/vm/sparc.ad	Fri Jul 08 09:38:48 2011 -0700
     1.3 @@ -425,7 +425,7 @@
     1.4  // but they are used with the "Op_RegD" type, and always occur in even/odd pairs.
     1.5  // This class is usable for mis-aligned loads as happen in I2C adapters.
     1.6  reg_class dflt_low_reg(R_F0, R_F1, R_F2, R_F3, R_F4, R_F5, R_F6, R_F7, R_F8, R_F9, R_F10,R_F11,R_F12,R_F13,R_F14,R_F15,
     1.7 -                   R_F16,R_F17,R_F18,R_F19,R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29,R_F30,R_F31 );
     1.8 +                   R_F16,R_F17,R_F18,R_F19,R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29);
     1.9  %}
    1.10  
    1.11  //----------DEFINITION BLOCK---------------------------------------------------
    1.12 @@ -1326,17 +1326,17 @@
    1.13  
    1.14    // --------------------------------------
    1.15    // Check for float->int copy; requires a trip through memory
    1.16 -  if( src_first_rc == rc_float && dst_first_rc == rc_int ) {
    1.17 +  if (src_first_rc == rc_float && dst_first_rc == rc_int && UseVIS < 3) {
    1.18      int offset = frame::register_save_words*wordSize;
    1.19 -    if( cbuf ) {
    1.20 +    if (cbuf) {
    1.21        emit3_simm13( *cbuf, Assembler::arith_op, R_SP_enc, Assembler::sub_op3, R_SP_enc, 16 );
    1.22        impl_helper(this,cbuf,ra_,do_size,false,offset,src_first,Assembler::stf_op3 ,"STF ",size, st);
    1.23        impl_helper(this,cbuf,ra_,do_size,true ,offset,dst_first,Assembler::lduw_op3,"LDUW",size, st);
    1.24        emit3_simm13( *cbuf, Assembler::arith_op, R_SP_enc, Assembler::add_op3, R_SP_enc, 16 );
    1.25      }
    1.26  #ifndef PRODUCT
    1.27 -    else if( !do_size ) {
    1.28 -      if( size != 0 ) st->print("\n\t");
    1.29 +    else if (!do_size) {
    1.30 +      if (size != 0) st->print("\n\t");
    1.31        st->print(  "SUB    R_SP,16,R_SP\n");
    1.32        impl_helper(this,cbuf,ra_,do_size,false,offset,src_first,Assembler::stf_op3 ,"STF ",size, st);
    1.33        impl_helper(this,cbuf,ra_,do_size,true ,offset,dst_first,Assembler::lduw_op3,"LDUW",size, st);
    1.34 @@ -1346,6 +1346,21 @@
    1.35      size += 16;
    1.36    }
    1.37  
    1.38 +  // Check for float->int copy on T4
    1.39 +  if (src_first_rc == rc_float && dst_first_rc == rc_int && UseVIS >= 3) {
    1.40 +    // Further check for aligned-adjacent pair, so we can use a double move
    1.41 +    if ((src_first&1)==0 && src_first+1 == src_second && (dst_first&1)==0 && dst_first+1 == dst_second)
    1.42 +      return impl_mov_helper(cbuf,do_size,src_first,dst_first,Assembler::mftoi_op3,Assembler::mdtox_opf,"MOVDTOX",size, st);
    1.43 +    size  =  impl_mov_helper(cbuf,do_size,src_first,dst_first,Assembler::mftoi_op3,Assembler::mstouw_opf,"MOVSTOUW",size, st);
    1.44 +  }
    1.45 +  // Check for int->float copy on T4
    1.46 +  if (src_first_rc == rc_int && dst_first_rc == rc_float && UseVIS >= 3) {
    1.47 +    // Further check for aligned-adjacent pair, so we can use a double move
    1.48 +    if ((src_first&1)==0 && src_first+1 == src_second && (dst_first&1)==0 && dst_first+1 == dst_second)
    1.49 +      return impl_mov_helper(cbuf,do_size,src_first,dst_first,Assembler::mftoi_op3,Assembler::mxtod_opf,"MOVXTOD",size, st);
    1.50 +    size  =  impl_mov_helper(cbuf,do_size,src_first,dst_first,Assembler::mftoi_op3,Assembler::mwtos_opf,"MOVWTOS",size, st);
    1.51 +  }
    1.52 +
    1.53    // --------------------------------------
    1.54    // In the 32-bit 1-reg-longs build ONLY, I see mis-aligned long destinations.
    1.55    // In such cases, I have to do the big-endian swap.  For aligned targets, the
    1.56 @@ -8164,6 +8179,155 @@
    1.57    ins_pipe( cadd_cmpltmask );
    1.58  %}
    1.59  
    1.60 +
    1.61 +//-----------------------------------------------------------------
    1.62 +// Direct raw moves between float and general registers using VIS3.
    1.63 +
    1.64 +//  ins_pipe(faddF_reg);
    1.65 +instruct MoveF2I_reg_reg(iRegI dst, regF src) %{
    1.66 +  predicate(UseVIS >= 3);
    1.67 +  match(Set dst (MoveF2I src));
    1.68 +
    1.69 +  format %{ "MOVSTOUW $src,$dst\t! MoveF2I" %}
    1.70 +  ins_encode %{
    1.71 +    __ movstouw($src$$FloatRegister, $dst$$Register);
    1.72 +  %}
    1.73 +  ins_pipe(ialu_reg_reg);
    1.74 +%}
    1.75 +
    1.76 +instruct MoveI2F_reg_reg(regF dst, iRegI src) %{
    1.77 +  predicate(UseVIS >= 3);
    1.78 +  match(Set dst (MoveI2F src));
    1.79 +
    1.80 +  format %{ "MOVWTOS $src,$dst\t! MoveI2F" %}
    1.81 +  ins_encode %{
    1.82 +    __ movwtos($src$$Register, $dst$$FloatRegister);
    1.83 +  %}
    1.84 +  ins_pipe(ialu_reg_reg);
    1.85 +%}
    1.86 +
    1.87 +instruct MoveD2L_reg_reg(iRegL dst, regD src) %{
    1.88 +  predicate(UseVIS >= 3);
    1.89 +  match(Set dst (MoveD2L src));
    1.90 +
    1.91 +  format %{ "MOVDTOX $src,$dst\t! MoveD2L" %}
    1.92 +  ins_encode %{
    1.93 +    __ movdtox(as_DoubleFloatRegister($src$$reg), $dst$$Register);
    1.94 +  %}
    1.95 +  ins_pipe(ialu_reg_reg);
    1.96 +%}
    1.97 +
    1.98 +instruct MoveL2D_reg_reg(regD dst, iRegL src) %{
    1.99 +  predicate(UseVIS >= 3);
   1.100 +  match(Set dst (MoveL2D src));
   1.101 +
   1.102 +  format %{ "MOVXTOD $src,$dst\t! MoveL2D" %}
   1.103 +  ins_encode %{
   1.104 +    __ movxtod($src$$Register, as_DoubleFloatRegister($dst$$reg));
   1.105 +  %}
   1.106 +  ins_pipe(ialu_reg_reg);
   1.107 +%}
   1.108 +
   1.109 +
   1.110 +// Raw moves between float and general registers using stack.
   1.111 +
   1.112 +instruct MoveF2I_stack_reg(iRegI dst, stackSlotF src) %{
   1.113 +  match(Set dst (MoveF2I src));
   1.114 +  effect(DEF dst, USE src);
   1.115 +  ins_cost(MEMORY_REF_COST);
   1.116 +
   1.117 +  size(4);
   1.118 +  format %{ "LDUW   $src,$dst\t! MoveF2I" %}
   1.119 +  opcode(Assembler::lduw_op3);
   1.120 +  ins_encode(simple_form3_mem_reg( src, dst ) );
   1.121 +  ins_pipe(iload_mem);
   1.122 +%}
   1.123 +
   1.124 +instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{
   1.125 +  match(Set dst (MoveI2F src));
   1.126 +  effect(DEF dst, USE src);
   1.127 +  ins_cost(MEMORY_REF_COST);
   1.128 +
   1.129 +  size(4);
   1.130 +  format %{ "LDF    $src,$dst\t! MoveI2F" %}
   1.131 +  opcode(Assembler::ldf_op3);
   1.132 +  ins_encode(simple_form3_mem_reg(src, dst));
   1.133 +  ins_pipe(floadF_stk);
   1.134 +%}
   1.135 +
   1.136 +instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{
   1.137 +  match(Set dst (MoveD2L src));
   1.138 +  effect(DEF dst, USE src);
   1.139 +  ins_cost(MEMORY_REF_COST);
   1.140 +
   1.141 +  size(4);
   1.142 +  format %{ "LDX    $src,$dst\t! MoveD2L" %}
   1.143 +  opcode(Assembler::ldx_op3);
   1.144 +  ins_encode(simple_form3_mem_reg( src, dst ) );
   1.145 +  ins_pipe(iload_mem);
   1.146 +%}
   1.147 +
   1.148 +instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
   1.149 +  match(Set dst (MoveL2D src));
   1.150 +  effect(DEF dst, USE src);
   1.151 +  ins_cost(MEMORY_REF_COST);
   1.152 +
   1.153 +  size(4);
   1.154 +  format %{ "LDDF   $src,$dst\t! MoveL2D" %}
   1.155 +  opcode(Assembler::lddf_op3);
   1.156 +  ins_encode(simple_form3_mem_reg(src, dst));
   1.157 +  ins_pipe(floadD_stk);
   1.158 +%}
   1.159 +
   1.160 +instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{
   1.161 +  match(Set dst (MoveF2I src));
   1.162 +  effect(DEF dst, USE src);
   1.163 +  ins_cost(MEMORY_REF_COST);
   1.164 +
   1.165 +  size(4);
   1.166 +  format %{ "STF   $src,$dst\t! MoveF2I" %}
   1.167 +  opcode(Assembler::stf_op3);
   1.168 +  ins_encode(simple_form3_mem_reg(dst, src));
   1.169 +  ins_pipe(fstoreF_stk_reg);
   1.170 +%}
   1.171 +
   1.172 +instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
   1.173 +  match(Set dst (MoveI2F src));
   1.174 +  effect(DEF dst, USE src);
   1.175 +  ins_cost(MEMORY_REF_COST);
   1.176 +
   1.177 +  size(4);
   1.178 +  format %{ "STW    $src,$dst\t! MoveI2F" %}
   1.179 +  opcode(Assembler::stw_op3);
   1.180 +  ins_encode(simple_form3_mem_reg( dst, src ) );
   1.181 +  ins_pipe(istore_mem_reg);
   1.182 +%}
   1.183 +
   1.184 +instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{
   1.185 +  match(Set dst (MoveD2L src));
   1.186 +  effect(DEF dst, USE src);
   1.187 +  ins_cost(MEMORY_REF_COST);
   1.188 +
   1.189 +  size(4);
   1.190 +  format %{ "STDF   $src,$dst\t! MoveD2L" %}
   1.191 +  opcode(Assembler::stdf_op3);
   1.192 +  ins_encode(simple_form3_mem_reg(dst, src));
   1.193 +  ins_pipe(fstoreD_stk_reg);
   1.194 +%}
   1.195 +
   1.196 +instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
   1.197 +  match(Set dst (MoveL2D src));
   1.198 +  effect(DEF dst, USE src);
   1.199 +  ins_cost(MEMORY_REF_COST);
   1.200 +
   1.201 +  size(4);
   1.202 +  format %{ "STX    $src,$dst\t! MoveL2D" %}
   1.203 +  opcode(Assembler::stx_op3);
   1.204 +  ins_encode(simple_form3_mem_reg( dst, src ) );
   1.205 +  ins_pipe(istore_mem_reg);
   1.206 +%}
   1.207 +
   1.208 +
   1.209  //----------Arithmetic Conversion Instructions---------------------------------
   1.210  // The conversions operations are all Alpha sorted.  Please keep it that way!
   1.211  
   1.212 @@ -8191,7 +8355,7 @@
   1.213    ins_pipe(fcvtD2I);
   1.214  %}
   1.215  
   1.216 -instruct convD2I_reg(stackSlotI dst, regD src) %{
   1.217 +instruct convD2I_stk(stackSlotI dst, regD src) %{
   1.218    match(Set dst (ConvD2I src));
   1.219    ins_cost(DEFAULT_COST*2 + MEMORY_REF_COST*2 + BRANCH_COST);
   1.220    expand %{
   1.221 @@ -8201,6 +8365,18 @@
   1.222    %}
   1.223  %}
   1.224  
   1.225 +instruct convD2I_reg(iRegI dst, regD src) %{
   1.226 +  predicate(UseVIS >= 3);
   1.227 +  match(Set dst (ConvD2I src));
   1.228 +  ins_cost(DEFAULT_COST*2 + BRANCH_COST);
   1.229 +  expand %{
   1.230 +    regF tmp;
   1.231 +    convD2I_helper(tmp, src);
   1.232 +    MoveF2I_reg_reg(dst, tmp);
   1.233 +  %}
   1.234 +%}
   1.235 +
   1.236 +
   1.237  // Convert a double to a long in a double register.
   1.238  // If the double is a NAN, stuff a zero in instead.
   1.239  instruct convD2L_helper(regD dst, regD src, flagsRegF0 fcc0) %{
   1.240 @@ -8215,9 +8391,7 @@
   1.241    ins_pipe(fcvtD2L);
   1.242  %}
   1.243  
   1.244 -
   1.245 -// Double to Long conversion
   1.246 -instruct convD2L_reg(stackSlotL dst, regD src) %{
   1.247 +instruct convD2L_stk(stackSlotL dst, regD src) %{
   1.248    match(Set dst (ConvD2L src));
   1.249    ins_cost(DEFAULT_COST*2 + MEMORY_REF_COST*2 + BRANCH_COST);
   1.250    expand %{
   1.251 @@ -8227,6 +8401,17 @@
   1.252    %}
   1.253  %}
   1.254  
   1.255 +instruct convD2L_reg(iRegL dst, regD src) %{
   1.256 +  predicate(UseVIS >= 3);
   1.257 +  match(Set dst (ConvD2L src));
   1.258 +  ins_cost(DEFAULT_COST*2 + BRANCH_COST);
   1.259 +  expand %{
   1.260 +    regD tmp;
   1.261 +    convD2L_helper(tmp, src);
   1.262 +    MoveD2L_reg_reg(dst, tmp);
   1.263 +  %}
   1.264 +%}
   1.265 +
   1.266  
   1.267  instruct convF2D_reg(regD dst, regF src) %{
   1.268    match(Set dst (ConvF2D src));
   1.269 @@ -8237,6 +8422,8 @@
   1.270  %}
   1.271  
   1.272  
   1.273 +// Convert a float to an int in a float register.
   1.274 +// If the float is a NAN, stuff a zero in instead.
   1.275  instruct convF2I_helper(regF dst, regF src, flagsRegF0 fcc0) %{
   1.276    effect(DEF dst, USE src, KILL fcc0);
   1.277    format %{ "FCMPs  fcc0,$src,$src\t! check for NAN\n\t"
   1.278 @@ -8249,7 +8436,7 @@
   1.279    ins_pipe(fcvtF2I);
   1.280  %}
   1.281  
   1.282 -instruct convF2I_reg(stackSlotI dst, regF src) %{
   1.283 +instruct convF2I_stk(stackSlotI dst, regF src) %{
   1.284    match(Set dst (ConvF2I src));
   1.285    ins_cost(DEFAULT_COST*2 + MEMORY_REF_COST*2 + BRANCH_COST);
   1.286    expand %{
   1.287 @@ -8259,7 +8446,20 @@
   1.288    %}
   1.289  %}
   1.290  
   1.291 -
   1.292 +instruct convF2I_reg(iRegI dst, regF src) %{
   1.293 +  predicate(UseVIS >= 3);
   1.294 +  match(Set dst (ConvF2I src));
   1.295 +  ins_cost(DEFAULT_COST*2 + BRANCH_COST);
   1.296 +  expand %{
   1.297 +    regF tmp;
   1.298 +    convF2I_helper(tmp, src);
   1.299 +    MoveF2I_reg_reg(dst, tmp);
   1.300 +  %}
   1.301 +%}
   1.302 +
   1.303 +
   1.304 +// Convert a float to a long in a float register.
   1.305 +// If the float is a NAN, stuff a zero in instead.
   1.306  instruct convF2L_helper(regD dst, regF src, flagsRegF0 fcc0) %{
   1.307    effect(DEF dst, USE src, KILL fcc0);
   1.308    format %{ "FCMPs  fcc0,$src,$src\t! check for NAN\n\t"
   1.309 @@ -8272,8 +8472,7 @@
   1.310    ins_pipe(fcvtF2L);
   1.311  %}
   1.312  
   1.313 -// Float to Long conversion
   1.314 -instruct convF2L_reg(stackSlotL dst, regF src) %{
   1.315 +instruct convF2L_stk(stackSlotL dst, regF src) %{
   1.316    match(Set dst (ConvF2L src));
   1.317    ins_cost(DEFAULT_COST*2 + MEMORY_REF_COST*2 + BRANCH_COST);
   1.318    expand %{
   1.319 @@ -8283,6 +8482,17 @@
   1.320    %}
   1.321  %}
   1.322  
   1.323 +instruct convF2L_reg(iRegL dst, regF src) %{
   1.324 +  predicate(UseVIS >= 3);
   1.325 +  match(Set dst (ConvF2L src));
   1.326 +  ins_cost(DEFAULT_COST*2 + BRANCH_COST);
   1.327 +  expand %{
   1.328 +    regD tmp;
   1.329 +    convF2L_helper(tmp, src);
   1.330 +    MoveD2L_reg_reg(dst, tmp);
   1.331 +  %}
   1.332 +%}
   1.333 +
   1.334  
   1.335  instruct convI2D_helper(regD dst, regF tmp) %{
   1.336    effect(USE tmp, DEF dst);
   1.337 @@ -8292,17 +8502,27 @@
   1.338    ins_pipe(fcvtI2D);
   1.339  %}
   1.340  
   1.341 -instruct convI2D_reg(stackSlotI src, regD dst) %{
   1.342 +instruct convI2D_stk(stackSlotI src, regD dst) %{
   1.343    match(Set dst (ConvI2D src));
   1.344    ins_cost(DEFAULT_COST + MEMORY_REF_COST);
   1.345    expand %{
   1.346      regF tmp;
   1.347 -    stkI_to_regF( tmp, src);
   1.348 -    convI2D_helper( dst, tmp);
   1.349 -  %}
   1.350 -%}
   1.351 -
   1.352 -instruct convI2D_mem( regD_low dst, memory mem ) %{
   1.353 +    stkI_to_regF(tmp, src);
   1.354 +    convI2D_helper(dst, tmp);
   1.355 +  %}
   1.356 +%}
   1.357 +
   1.358 +instruct convI2D_reg(regD_low dst, iRegI src) %{
   1.359 +  predicate(UseVIS >= 3);
   1.360 +  match(Set dst (ConvI2D src));
   1.361 +  expand %{
   1.362 +    regF tmp;
   1.363 +    MoveI2F_reg_reg(tmp, src);
   1.364 +    convI2D_helper(dst, tmp);
   1.365 +  %}
   1.366 +%}
   1.367 +
   1.368 +instruct convI2D_mem(regD_low dst, memory mem) %{
   1.369    match(Set dst (ConvI2D (LoadI mem)));
   1.370    ins_cost(DEFAULT_COST + MEMORY_REF_COST);
   1.371    size(8);
   1.372 @@ -8322,7 +8542,7 @@
   1.373    ins_pipe(fcvtI2F);
   1.374  %}
   1.375  
   1.376 -instruct convI2F_reg( regF dst, stackSlotI src ) %{
   1.377 +instruct convI2F_stk(regF dst, stackSlotI src) %{
   1.378    match(Set dst (ConvI2F src));
   1.379    ins_cost(DEFAULT_COST + MEMORY_REF_COST);
   1.380    expand %{
   1.381 @@ -8332,6 +8552,17 @@
   1.382    %}
   1.383  %}
   1.384  
   1.385 +instruct convI2F_reg(regF dst, iRegI src) %{
   1.386 +  predicate(UseVIS >= 3);
   1.387 +  match(Set dst (ConvI2F src));
   1.388 +  ins_cost(DEFAULT_COST);
   1.389 +  expand %{
   1.390 +    regF tmp;
   1.391 +    MoveI2F_reg_reg(tmp, src);
   1.392 +    convI2F_helper(dst, tmp);
   1.393 +  %}
   1.394 +%}
   1.395 +
   1.396  instruct convI2F_mem( regF dst, memory mem ) %{
   1.397    match(Set dst (ConvI2F (LoadI mem)));
   1.398    ins_cost(DEFAULT_COST + MEMORY_REF_COST);
   1.399 @@ -8373,102 +8604,6 @@
   1.400    ins_pipe(ialu_reg_reg);
   1.401  %}
   1.402  
   1.403 -instruct MoveF2I_stack_reg(iRegI dst, stackSlotF src) %{
   1.404 -  match(Set dst (MoveF2I src));
   1.405 -  effect(DEF dst, USE src);
   1.406 -  ins_cost(MEMORY_REF_COST);
   1.407 -
   1.408 -  size(4);
   1.409 -  format %{ "LDUW   $src,$dst\t! MoveF2I" %}
   1.410 -  opcode(Assembler::lduw_op3);
   1.411 -  ins_encode(simple_form3_mem_reg( src, dst ) );
   1.412 -  ins_pipe(iload_mem);
   1.413 -%}
   1.414 -
   1.415 -instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{
   1.416 -  match(Set dst (MoveI2F src));
   1.417 -  effect(DEF dst, USE src);
   1.418 -  ins_cost(MEMORY_REF_COST);
   1.419 -
   1.420 -  size(4);
   1.421 -  format %{ "LDF    $src,$dst\t! MoveI2F" %}
   1.422 -  opcode(Assembler::ldf_op3);
   1.423 -  ins_encode(simple_form3_mem_reg(src, dst));
   1.424 -  ins_pipe(floadF_stk);
   1.425 -%}
   1.426 -
   1.427 -instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{
   1.428 -  match(Set dst (MoveD2L src));
   1.429 -  effect(DEF dst, USE src);
   1.430 -  ins_cost(MEMORY_REF_COST);
   1.431 -
   1.432 -  size(4);
   1.433 -  format %{ "LDX    $src,$dst\t! MoveD2L" %}
   1.434 -  opcode(Assembler::ldx_op3);
   1.435 -  ins_encode(simple_form3_mem_reg( src, dst ) );
   1.436 -  ins_pipe(iload_mem);
   1.437 -%}
   1.438 -
   1.439 -instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
   1.440 -  match(Set dst (MoveL2D src));
   1.441 -  effect(DEF dst, USE src);
   1.442 -  ins_cost(MEMORY_REF_COST);
   1.443 -
   1.444 -  size(4);
   1.445 -  format %{ "LDDF   $src,$dst\t! MoveL2D" %}
   1.446 -  opcode(Assembler::lddf_op3);
   1.447 -  ins_encode(simple_form3_mem_reg(src, dst));
   1.448 -  ins_pipe(floadD_stk);
   1.449 -%}
   1.450 -
   1.451 -instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{
   1.452 -  match(Set dst (MoveF2I src));
   1.453 -  effect(DEF dst, USE src);
   1.454 -  ins_cost(MEMORY_REF_COST);
   1.455 -
   1.456 -  size(4);
   1.457 -  format %{ "STF   $src,$dst\t!MoveF2I" %}
   1.458 -  opcode(Assembler::stf_op3);
   1.459 -  ins_encode(simple_form3_mem_reg(dst, src));
   1.460 -  ins_pipe(fstoreF_stk_reg);
   1.461 -%}
   1.462 -
   1.463 -instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
   1.464 -  match(Set dst (MoveI2F src));
   1.465 -  effect(DEF dst, USE src);
   1.466 -  ins_cost(MEMORY_REF_COST);
   1.467 -
   1.468 -  size(4);
   1.469 -  format %{ "STW    $src,$dst\t!MoveI2F" %}
   1.470 -  opcode(Assembler::stw_op3);
   1.471 -  ins_encode(simple_form3_mem_reg( dst, src ) );
   1.472 -  ins_pipe(istore_mem_reg);
   1.473 -%}
   1.474 -
   1.475 -instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{
   1.476 -  match(Set dst (MoveD2L src));
   1.477 -  effect(DEF dst, USE src);
   1.478 -  ins_cost(MEMORY_REF_COST);
   1.479 -
   1.480 -  size(4);
   1.481 -  format %{ "STDF   $src,$dst\t!MoveD2L" %}
   1.482 -  opcode(Assembler::stdf_op3);
   1.483 -  ins_encode(simple_form3_mem_reg(dst, src));
   1.484 -  ins_pipe(fstoreD_stk_reg);
   1.485 -%}
   1.486 -
   1.487 -instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
   1.488 -  match(Set dst (MoveL2D src));
   1.489 -  effect(DEF dst, USE src);
   1.490 -  ins_cost(MEMORY_REF_COST);
   1.491 -
   1.492 -  size(4);
   1.493 -  format %{ "STX    $src,$dst\t!MoveL2D" %}
   1.494 -  opcode(Assembler::stx_op3);
   1.495 -  ins_encode(simple_form3_mem_reg( dst, src ) );
   1.496 -  ins_pipe(istore_mem_reg);
   1.497 -%}
   1.498 -
   1.499  
   1.500  //-----------
   1.501  // Long to Double conversion using V8 opcodes.
   1.502 @@ -8589,7 +8724,7 @@
   1.503    ins_pipe(fcvtL2D);
   1.504  %}
   1.505  
   1.506 -instruct convL2D_reg_fast_fxtof(regD dst, stackSlotL src) %{
   1.507 +instruct convL2D_stk_fast_fxtof(regD dst, stackSlotL src) %{
   1.508    predicate(VM_Version::has_fast_fxtof());
   1.509    match(Set dst (ConvL2D src));
   1.510    ins_cost(DEFAULT_COST + 3 * MEMORY_REF_COST);
   1.511 @@ -8600,10 +8735,15 @@
   1.512    %}
   1.513  %}
   1.514  
   1.515 -//-----------
   1.516 -// Long to Float conversion using V8 opcodes.
   1.517 -// Still useful because cheetah traps and becomes
   1.518 -// amazingly slow for some common numbers.
   1.519 +instruct convL2D_reg(regD dst, iRegL src) %{
   1.520 +  predicate(UseVIS >= 3);
   1.521 +  match(Set dst (ConvL2D src));
   1.522 +  expand %{
   1.523 +    regD tmp;
   1.524 +    MoveL2D_reg_reg(tmp, src);
   1.525 +    convL2D_helper(dst, tmp);
   1.526 +  %}
   1.527 +%}
   1.528  
   1.529  // Long to Float conversion using fast fxtof
   1.530  instruct convL2F_helper(regF dst, regD tmp) %{
   1.531 @@ -8615,7 +8755,7 @@
   1.532    ins_pipe(fcvtL2F);
   1.533  %}
   1.534  
   1.535 -instruct convL2F_reg_fast_fxtof(regF dst, stackSlotL src) %{
   1.536 +instruct convL2F_stk_fast_fxtof(regF dst, stackSlotL src) %{
   1.537    match(Set dst (ConvL2F src));
   1.538    ins_cost(DEFAULT_COST + MEMORY_REF_COST);
   1.539    expand %{
   1.540 @@ -8624,6 +8764,18 @@
   1.541      convL2F_helper(dst, tmp);
   1.542    %}
   1.543  %}
   1.544 +
   1.545 +instruct convL2F_reg(regF dst, iRegL src) %{
   1.546 +  predicate(UseVIS >= 3);
   1.547 +  match(Set dst (ConvL2F src));
   1.548 +  ins_cost(DEFAULT_COST);
   1.549 +  expand %{
   1.550 +    regD tmp;
   1.551 +    MoveL2D_reg_reg(tmp, src);
   1.552 +    convL2F_helper(dst, tmp);
   1.553 +  %}
   1.554 +%}
   1.555 +
   1.556  //-----------
   1.557  
   1.558  instruct convL2I_reg(iRegI dst, iRegL src) %{

mercurial