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 {