src/cpu/sparc/vm/methodHandles_sparc.cpp

changeset 3037
3d42f82cd811
parent 3005
341a57af9b0a
child 3046
a19c671188cb
     1.1 --- a/src/cpu/sparc/vm/methodHandles_sparc.cpp	Thu Jul 21 08:38:25 2011 -0700
     1.2 +++ b/src/cpu/sparc/vm/methodHandles_sparc.cpp	Thu Jul 21 11:25:07 2011 -0700
     1.3 @@ -287,9 +287,7 @@
     1.4    BLOCK_COMMENT("verify_clean {");
     1.5    // Magic numbers must check out:
     1.6    __ set((int32_t) MAGIC_NUMBER_1, O7_temp);
     1.7 -  __ cmp(O7_temp, L0_magic_number_1);
     1.8 -  __ br(Assembler::equal, false, Assembler::pt, L_ok_1);
     1.9 -  __ delayed()->nop();
    1.10 +  __ cmp_and_br_short(O7_temp, L0_magic_number_1, Assembler::equal, Assembler::pt, L_ok_1);
    1.11    __ stop("damaged ricochet frame: MAGIC_NUMBER_1 not found");
    1.12  
    1.13    __ BIND(L_ok_1);
    1.14 @@ -301,9 +299,7 @@
    1.15  #else
    1.16    Register FP_temp = FP;
    1.17  #endif
    1.18 -  __ cmp(L4_saved_args_base, FP_temp);
    1.19 -  __ br(Assembler::greaterEqualUnsigned, false, Assembler::pt, L_ok_2);
    1.20 -  __ delayed()->nop();
    1.21 +  __ cmp_and_brx_short(L4_saved_args_base, FP_temp, Assembler::greaterEqualUnsigned, Assembler::pt, L_ok_2);
    1.22    __ stop("damaged ricochet frame: L4 < FP");
    1.23  
    1.24    __ BIND(L_ok_2);
    1.25 @@ -316,15 +312,11 @@
    1.26  
    1.27    __ BIND(L_ok_3);
    1.28    extract_conversion_dest_type(_masm, L5_conversion, O7_temp);
    1.29 -  __ cmp(O7_temp, T_VOID);
    1.30 -  __ br(Assembler::equal, false, Assembler::pt, L_ok_4);
    1.31 -  __ delayed()->nop();
    1.32 +  __ cmp_and_br_short(O7_temp, T_VOID, Assembler::equal, Assembler::pt, L_ok_4);
    1.33    extract_conversion_vminfo(_masm, L5_conversion, O5_temp);
    1.34    __ ld_ptr(L4_saved_args_base, __ argument_offset(O5_temp, O5_temp), O7_temp);
    1.35    assert(__ is_simm13(RETURN_VALUE_PLACEHOLDER), "must be simm13");
    1.36 -  __ cmp(O7_temp, (int32_t) RETURN_VALUE_PLACEHOLDER);
    1.37 -  __ brx(Assembler::equal, false, Assembler::pt, L_ok_4);
    1.38 -  __ delayed()->nop();
    1.39 +  __ cmp_and_brx_short(O7_temp, (int32_t) RETURN_VALUE_PLACEHOLDER, Assembler::equal, Assembler::pt, L_ok_4);
    1.40    __ stop("damaged ricochet frame: RETURN_VALUE_PLACEHOLDER not found");
    1.41    __ BIND(L_ok_4);
    1.42    BLOCK_COMMENT("} verify_clean");
    1.43 @@ -363,9 +355,7 @@
    1.44    if (VerifyMethodHandles) {
    1.45      Label L_ok, L_bad;
    1.46      int32_t stack_move_limit = 0x0800;  // extra-large
    1.47 -    __ cmp(stack_move_reg, stack_move_limit);
    1.48 -    __ br(Assembler::greaterEqual, false, Assembler::pn, L_bad);
    1.49 -    __ delayed()->nop();
    1.50 +    __ cmp_and_br_short(stack_move_reg, stack_move_limit, Assembler::greaterEqual, Assembler::pn, L_bad);
    1.51      __ cmp(stack_move_reg, -stack_move_limit);
    1.52      __ br(Assembler::greater, false, Assembler::pt, L_ok);
    1.53      __ delayed()->nop();
    1.54 @@ -401,13 +391,9 @@
    1.55    // Verify that argslot lies within (Gargs, FP].
    1.56    Label L_ok, L_bad;
    1.57    BLOCK_COMMENT("verify_argslot {");
    1.58 +  __ cmp_and_brx_short(Gargs, argslot_reg, Assembler::greaterUnsigned, Assembler::pn, L_bad);
    1.59    __ add(FP, STACK_BIAS, temp_reg);  // STACK_BIAS is zero on !_LP64
    1.60 -  __ cmp(argslot_reg, temp_reg);
    1.61 -  __ brx(Assembler::greaterUnsigned, false, Assembler::pn, L_bad);
    1.62 -  __ delayed()->nop();
    1.63 -  __ cmp(Gargs, argslot_reg);
    1.64 -  __ brx(Assembler::lessEqualUnsigned, false, Assembler::pt, L_ok);
    1.65 -  __ delayed()->nop();
    1.66 +  __ cmp_and_brx_short(argslot_reg, temp_reg, Assembler::lessEqualUnsigned, Assembler::pt, L_ok);
    1.67    __ BIND(L_bad);
    1.68    __ stop(error_message);
    1.69    __ BIND(L_ok);
    1.70 @@ -434,14 +420,10 @@
    1.71    }
    1.72    __ add(arg_slot_base_reg, __ argument_offset(arg_slots, temp_reg), temp_reg);
    1.73    __ add(FP, STACK_BIAS, temp2_reg);  // STACK_BIAS is zero on !_LP64
    1.74 -  __ cmp(temp_reg, temp2_reg);
    1.75 -  __ brx(Assembler::greaterUnsigned, false, Assembler::pn, L_bad);
    1.76 -  __ delayed()->nop();
    1.77 +  __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::greaterUnsigned, Assembler::pn, L_bad);
    1.78    // Gargs points to the first word so adjust by BytesPerWord
    1.79    __ add(arg_slot_base_reg, BytesPerWord, temp_reg);
    1.80 -  __ cmp(Gargs, temp_reg);
    1.81 -  __ brx(Assembler::lessEqualUnsigned, false, Assembler::pt, L_ok);
    1.82 -  __ delayed()->nop();
    1.83 +  __ cmp_and_brx_short(Gargs, temp_reg, Assembler::lessEqualUnsigned, Assembler::pt, L_ok);
    1.84    __ BIND(L_bad);
    1.85    __ stop(error_message);
    1.86    __ BIND(L_ok);
    1.87 @@ -502,21 +484,16 @@
    1.88    Label L_ok, L_bad;
    1.89    BLOCK_COMMENT("verify_klass {");
    1.90    __ verify_oop(obj_reg);
    1.91 -  __ br_null(obj_reg, false, Assembler::pn, L_bad);
    1.92 -  __ delayed()->nop();
    1.93 +  __ br_null_short(obj_reg, Assembler::pn, L_bad);
    1.94    __ load_klass(obj_reg, temp_reg);
    1.95    __ set(ExternalAddress(klass_addr), temp2_reg);
    1.96    __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
    1.97 -  __ cmp(temp_reg, temp2_reg);
    1.98 -  __ brx(Assembler::equal, false, Assembler::pt, L_ok);
    1.99 -  __ delayed()->nop();
   1.100 +  __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
   1.101    intptr_t super_check_offset = klass->super_check_offset();
   1.102    __ ld_ptr(Address(temp_reg, super_check_offset), temp_reg);
   1.103    __ set(ExternalAddress(klass_addr), temp2_reg);
   1.104    __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
   1.105 -  __ cmp(temp_reg, temp2_reg);
   1.106 -  __ brx(Assembler::equal, false, Assembler::pt, L_ok);
   1.107 -  __ delayed()->nop();
   1.108 +  __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
   1.109    __ BIND(L_bad);
   1.110    __ stop(error_message);
   1.111    __ BIND(L_ok);
   1.112 @@ -671,9 +648,7 @@
   1.113  #ifdef ASSERT
   1.114      {
   1.115        Label L_ok;
   1.116 -      __ cmp(arg_slots.as_register(), 0);
   1.117 -      __ br(Assembler::greaterEqual, false, Assembler::pt, L_ok);
   1.118 -      __ delayed()->nop();
   1.119 +      __ cmp_and_br_short(arg_slots.as_register(), 0, Assembler::greaterEqual, Assembler::pt, L_ok);
   1.120        __ stop("negative arg_slots");
   1.121        __ bind(L_ok);
   1.122      }
   1.123 @@ -748,9 +723,7 @@
   1.124      __ ld_ptr(           Address(temp_reg, 0     ), temp2_reg);
   1.125      __ st_ptr(temp2_reg, Address(temp_reg, offset)           );
   1.126      __ add(temp_reg, wordSize, temp_reg);
   1.127 -    __ cmp(temp_reg, argslot_reg);
   1.128 -    __ brx(Assembler::lessUnsigned, false, Assembler::pt, loop);
   1.129 -    __ delayed()->nop();  // FILLME
   1.130 +    __ cmp_and_brx_short(temp_reg, argslot_reg, Assembler::lessUnsigned, Assembler::pt, loop);
   1.131    }
   1.132  
   1.133    // Now move the argslot down, to point to the opened-up space.
   1.134 @@ -797,9 +770,7 @@
   1.135      __ ld_ptr(           Address(temp_reg, 0     ), temp2_reg);
   1.136      __ st_ptr(temp2_reg, Address(temp_reg, offset)           );
   1.137      __ sub(temp_reg, wordSize, temp_reg);
   1.138 -    __ cmp(temp_reg, Gargs);
   1.139 -    __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pt, L_loop);
   1.140 -    __ delayed()->nop();  // FILLME
   1.141 +    __ cmp_and_brx_short(temp_reg, Gargs, Assembler::greaterEqualUnsigned, Assembler::pt, L_loop);
   1.142    }
   1.143  
   1.144    // And adjust the argslot address to point at the deletion point.
   1.145 @@ -848,8 +819,7 @@
   1.146      __ delayed()->nop();
   1.147      __ ld_ptr(          Address(argslot_reg, 0), temp_reg);
   1.148      __ st_ptr(temp_reg, Address(Gargs,       0));
   1.149 -    __ ba(false, L_break);
   1.150 -    __ delayed()->nop();  // FILLME
   1.151 +    __ ba_short(L_break);
   1.152      __ BIND(L_plural);
   1.153  
   1.154      // Loop for 2 or more:
   1.155 @@ -863,9 +833,7 @@
   1.156      __ sub(Gargs,   wordSize, Gargs  );
   1.157      __ ld_ptr(           Address(top_reg, 0), temp2_reg);
   1.158      __ st_ptr(temp2_reg, Address(Gargs,   0));
   1.159 -    __ cmp(top_reg, argslot_reg);
   1.160 -    __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop);
   1.161 -    __ delayed()->nop();  // FILLME
   1.162 +    __ cmp_and_brx_short(top_reg, argslot_reg, Assembler::greaterUnsigned, Assembler::pt, L_loop);
   1.163      __ BIND(L_break);
   1.164    }
   1.165    BLOCK_COMMENT("} push_arg_slots");
   1.166 @@ -897,17 +865,13 @@
   1.167        __ br(Assembler::lessEqual, false, Assembler::pn, L_bad);
   1.168        __ delayed()->nop();
   1.169      }
   1.170 -    __ cmp(bottom_reg, top_reg);
   1.171 -    __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_ok);
   1.172 -    __ delayed()->nop();
   1.173 +    __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_ok);
   1.174      __ BIND(L_bad);
   1.175      __ stop("valid bounds (copy up)");
   1.176      __ BIND(L_ok);
   1.177    }
   1.178  #endif
   1.179 -  __ cmp(bottom_reg, top_reg);
   1.180 -  __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pn, L_break);
   1.181 -  __ delayed()->nop();
   1.182 +  __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::greaterEqualUnsigned, Assembler::pn, L_break);
   1.183    // work top down to bottom, copying contiguous data upwards
   1.184    // In pseudo-code:
   1.185    //   while (--top >= bottom) *(top + distance) = *(top + 0);
   1.186 @@ -916,9 +880,7 @@
   1.187    __ sub(top_reg, wordSize, top_reg);
   1.188    __ ld_ptr(           Address(top_reg, 0     ), temp2_reg);
   1.189    __ st_ptr(temp2_reg, Address(top_reg, offset)           );
   1.190 -  __ cmp(top_reg, bottom_reg);
   1.191 -  __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop);
   1.192 -  __ delayed()->nop();  // FILLME
   1.193 +  __ cmp_and_brx_short(top_reg, bottom_reg, Assembler::greaterUnsigned, Assembler::pt, L_loop);
   1.194    assert(Interpreter::stackElementSize == wordSize, "else change loop");
   1.195    __ BIND(L_break);
   1.196    BLOCK_COMMENT("} move_arg_slots_up");
   1.197 @@ -951,17 +913,13 @@
   1.198        __ br(Assembler::greaterEqual, false, Assembler::pn, L_bad);
   1.199        __ delayed()->nop();
   1.200      }
   1.201 -    __ cmp(bottom_reg, top_reg);
   1.202 -    __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_ok);
   1.203 -    __ delayed()->nop();
   1.204 +    __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_ok);
   1.205      __ BIND(L_bad);
   1.206      __ stop("valid bounds (copy down)");
   1.207      __ BIND(L_ok);
   1.208    }
   1.209  #endif
   1.210 -  __ cmp(bottom_reg, top_reg);
   1.211 -  __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pn, L_break);
   1.212 -  __ delayed()->nop();
   1.213 +  __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::greaterEqualUnsigned, Assembler::pn, L_break);
   1.214    // work bottom up to top, copying contiguous data downwards
   1.215    // In pseudo-code:
   1.216    //   while (bottom < top) *(bottom - distance) = *(bottom + 0), bottom++;
   1.217 @@ -970,9 +928,7 @@
   1.218    __ ld_ptr(           Address(bottom_reg, 0     ), temp2_reg);
   1.219    __ st_ptr(temp2_reg, Address(bottom_reg, offset)           );
   1.220    __ add(bottom_reg, wordSize, bottom_reg);
   1.221 -  __ cmp(bottom_reg, top_reg);
   1.222 -  __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_loop);
   1.223 -  __ delayed()->nop();  // FILLME
   1.224 +  __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_loop);
   1.225    assert(Interpreter::stackElementSize == wordSize, "else change loop");
   1.226    __ BIND(L_break);
   1.227    BLOCK_COMMENT("} move_arg_slots_down");
   1.228 @@ -1329,9 +1285,7 @@
   1.229  
   1.230        Label L_done;
   1.231        __ ld_ptr(vmarg, O2_scratch);
   1.232 -      __ tst(O2_scratch);
   1.233 -      __ brx(Assembler::zero, false, Assembler::pn, L_done);  // No cast if null.
   1.234 -      __ delayed()->nop();
   1.235 +      __ br_null_short(O2_scratch, Assembler::pn, L_done);  // No cast if null.
   1.236        __ load_klass(O2_scratch, O2_scratch);
   1.237  
   1.238        // Live at this point:
   1.239 @@ -1436,8 +1390,7 @@
   1.240  
   1.241        // this path is taken for int->byte, int->short
   1.242        __ sra(O1_scratch, G5_vminfo, O1_scratch);
   1.243 -      __ ba(false, done);
   1.244 -      __ delayed()->nop();
   1.245 +      __ ba_short(done);
   1.246  
   1.247        __ bind(zero_extend);
   1.248        // this is taken for int->char
   1.249 @@ -1860,9 +1813,7 @@
   1.250            BLOCK_COMMENT("verify collect_count_constant {");
   1.251            __ load_method_handle_vmslots(O3_scratch, G3_method_handle, O2_scratch);
   1.252            Label L_count_ok;
   1.253 -          __ cmp(O3_scratch, collect_count_constant);
   1.254 -          __ br(Assembler::equal, false, Assembler::pt, L_count_ok);
   1.255 -          __ delayed()->nop();
   1.256 +          __ cmp_and_br_short(O3_scratch, collect_count_constant, Assembler::equal, Assembler::pt, L_count_ok);
   1.257            __ stop("bad vminfo in AMH.conv");
   1.258            __ BIND(L_count_ok);
   1.259            BLOCK_COMMENT("} verify collect_count_constant");
   1.260 @@ -1909,9 +1860,7 @@
   1.261            BLOCK_COMMENT("verify dest_slot_constant {");
   1.262            extract_conversion_vminfo(_masm, RicochetFrame::L5_conversion, O3_scratch);
   1.263            Label L_vminfo_ok;
   1.264 -          __ cmp(O3_scratch, dest_slot_constant);
   1.265 -          __ br(Assembler::equal, false, Assembler::pt, L_vminfo_ok);
   1.266 -          __ delayed()->nop();
   1.267 +          __ cmp_and_br_short(O3_scratch, dest_slot_constant, Assembler::equal, Assembler::pt, L_vminfo_ok);
   1.268            __ stop("bad vminfo in AMH.conv");
   1.269            __ BIND(L_vminfo_ok);
   1.270            BLOCK_COMMENT("} verify dest_slot_constant");
   1.271 @@ -1951,14 +1900,10 @@
   1.272        // If there are variable parameters, use dynamic checks to skip around the whole mess.
   1.273        Label L_done;
   1.274        if (keep3_count.is_register()) {
   1.275 -        __ tst(keep3_count.as_register());
   1.276 -        __ br(Assembler::zero, false, Assembler::pn, L_done);
   1.277 -        __ delayed()->nop();
   1.278 +        __ cmp_and_br_short(keep3_count.as_register(), 0, Assembler::equal, Assembler::pn, L_done);
   1.279        }
   1.280        if (close_count.is_register()) {
   1.281 -        __ cmp(close_count.as_register(), open_count);
   1.282 -        __ br(Assembler::equal, false, Assembler::pn, L_done);
   1.283 -        __ delayed()->nop();
   1.284 +        __ cmp_and_br_short(close_count.as_register(), open_count, Assembler::equal, Assembler::pn, L_done);
   1.285        }
   1.286  
   1.287        if (move_keep3 && fix_arg_base) {
   1.288 @@ -1999,8 +1944,7 @@
   1.289          }
   1.290  
   1.291          if (emit_guard) {
   1.292 -          __ ba(false, L_done);  // assumes emit_move_up is true also
   1.293 -          __ delayed()->nop();
   1.294 +          __ ba_short(L_done);  // assumes emit_move_up is true also
   1.295            __ BIND(L_move_up);
   1.296          }
   1.297  
   1.298 @@ -2133,8 +2077,7 @@
   1.299  
   1.300  #ifdef ASSERT
   1.301        { Label L_ok;
   1.302 -        __ br_notnull(O7_temp, false, Assembler::pt, L_ok);
   1.303 -        __ delayed()->nop();
   1.304 +        __ br_notnull_short(O7_temp, Assembler::pt, L_ok);
   1.305          __ stop("bad method handle return");
   1.306          __ BIND(L_ok);
   1.307        }
   1.308 @@ -2192,11 +2135,10 @@
   1.309          Label L_skip;
   1.310          if (length_constant < 0) {
   1.311            load_conversion_vminfo(_masm, G3_amh_conversion, O3_scratch);
   1.312 -          __ br_zero(Assembler::notZero, false, Assembler::pn, O3_scratch, L_skip);
   1.313 -          __ delayed()->nop();
   1.314 +          __ cmp_zero_and_br(Assembler::notZero, O3_scratch, L_skip);
   1.315 +          __ delayed()->nop(); // to avoid back-to-back cbcond instructions
   1.316          }
   1.317 -        __ br_null(O1_array, false, Assembler::pn, L_array_is_empty);
   1.318 -        __ delayed()->nop();
   1.319 +        __ br_null_short(O1_array, Assembler::pn, L_array_is_empty);
   1.320          __ BIND(L_skip);
   1.321        }
   1.322        __ null_check(O1_array, oopDesc::klass_offset_in_bytes());
   1.323 @@ -2210,8 +2152,7 @@
   1.324        Label L_ok_array_klass, L_bad_array_klass, L_bad_array_length;
   1.325        __ check_klass_subtype(O2_array_klass, O3_klass, O4_scratch, G5_scratch, L_ok_array_klass);
   1.326        // If we get here, the type check failed!
   1.327 -      __ ba(false, L_bad_array_klass);
   1.328 -      __ delayed()->nop();
   1.329 +      __ ba_short(L_bad_array_klass);
   1.330        __ BIND(L_ok_array_klass);
   1.331  
   1.332        // Check length.
   1.333 @@ -2247,8 +2188,7 @@
   1.334          __ BIND(L_array_is_empty);
   1.335          remove_arg_slots(_masm, -stack_move_unit() * array_slots,
   1.336                           O0_argslot, O1_scratch, O2_scratch, O3_scratch);
   1.337 -        __ ba(false, L_args_done);  // no spreading to do
   1.338 -        __ delayed()->nop();
   1.339 +        __ ba_short(L_args_done);  // no spreading to do
   1.340          __ BIND(L_insert_arg_space);
   1.341          // come here in the usual case, stack_move < 0 (2 or more spread arguments)
   1.342          // Live: O1_array, O2_argslot_limit, O3_stack_move
   1.343 @@ -2289,9 +2229,7 @@
   1.344                         Address(O1_source, 0), Address(O4_fill_ptr, 0),
   1.345                         O2_scratch);  // must be an even register for !_LP64 long moves (uses O2/O3)
   1.346          __ add(O1_source, type2aelembytes(elem_type), O1_source);
   1.347 -        __ cmp(O4_fill_ptr, O0_argslot);
   1.348 -        __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop);
   1.349 -        __ delayed()->nop();  // FILLME
   1.350 +        __ cmp_and_brx_short(O4_fill_ptr, O0_argslot, Assembler::greaterUnsigned, Assembler::pt, L_loop);
   1.351        } else if (length_constant == 0) {
   1.352          // nothing to copy
   1.353        } else {

mercurial