1.1 --- a/src/cpu/mips/vm/mips_64.ad Thu May 24 19:24:53 2018 +0800 1.2 +++ b/src/cpu/mips/vm/mips_64.ad Thu May 24 19:26:50 2018 +0800 1.3 @@ -654,7 +654,8 @@ 1.4 bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) { 1.5 int offs = offset - br_size + 4; 1.6 // To be conservative on MIPS 1.7 - return Assembler::is_simm16((offs + 4) >> 2) && Assembler::is_simm16((offs - 4) >> 2); 1.8 + const int safety_zone = 3 * BytesPerInstWord; 1.9 + return Assembler::is_simm16((offs<0 ? offs-safety_zone : offs+safety_zone) >> 2); 1.10 } 1.11 1.12 1.13 @@ -1562,7 +1563,7 @@ 1.14 // Materialize the constant table base. 1.15 address baseaddr = consts_section->start() + -(constant_table.table_base_offset()); 1.16 // RelocationHolder rspec = internal_word_Relocation::spec(baseaddr); 1.17 - __ relocate(relocInfo::internal_pc_type); 1.18 + __ relocate(relocInfo::internal_word_type); 1.19 __ patchable_set48(Rtoc, (long)baseaddr); 1.20 } 1.21 } 1.22 @@ -6698,17 +6699,12 @@ 1.23 format %{ "JMP $labl #@jmpDir_long" %} 1.24 1.25 ins_encode %{ 1.26 - Label &L = *($labl$$label); 1.27 - if(&L) 1.28 - __ b(L); 1.29 - else 1.30 - __ b(int(0)); 1.31 - __ nop(); 1.32 - __ nop(); 1.33 - %} 1.34 - 1.35 - ins_pipe( pipe_jump ); 1.36 - ins_pc_relative(1); 1.37 + Label* L = $labl$$label; 1.38 + __ jmp_far(*L); 1.39 + %} 1.40 + 1.41 + ins_pipe( pipe_jump ); 1.42 + //ins_pc_relative(1); 1.43 %} 1.44 1.45 // Jump Direct Conditional - Label defines a relative address from Jcc+1 1.46 @@ -6721,55 +6717,35 @@ 1.47 ins_encode %{ 1.48 Register op1 = $src1$$Register; 1.49 Register op2 = $src2$$Register; 1.50 - Label &L = *($labl$$label); 1.51 + Label* L = $labl$$label; 1.52 int flag = $cop$$cmpcode; 1.53 1.54 switch(flag) { 1.55 case 0x01: //equal 1.56 - if (&L) 1.57 - __ beq(op1, op2, L); 1.58 - else 1.59 - __ beq(op1, op2, (int)0); 1.60 + __ beq_long(op1, op2, *L); 1.61 break; 1.62 case 0x02: //not_equal 1.63 - if (&L) 1.64 - __ bne(op1, op2, L); 1.65 - else 1.66 - __ bne(op1, op2, (int)0); 1.67 + __ bne_long(op1, op2, *L); 1.68 break; 1.69 case 0x03: //above 1.70 __ slt(AT, op2, op1); 1.71 - if(&L) 1.72 - __ bne(AT, R0, L); 1.73 - else 1.74 - __ bne(AT, R0, (int)0); 1.75 + __ bne_long(AT, R0, *L); 1.76 break; 1.77 case 0x04: //above_equal 1.78 __ slt(AT, op1, op2); 1.79 - if(&L) 1.80 - __ beq(AT, R0, L); 1.81 - else 1.82 - __ beq(AT, R0, (int)0); 1.83 + __ beq_long(AT, R0, *L); 1.84 break; 1.85 case 0x05: //below 1.86 __ slt(AT, op1, op2); 1.87 - if(&L) 1.88 - __ bne(AT, R0, L); 1.89 - else 1.90 - __ bne(AT, R0, (int)0); 1.91 + __ bne_long(AT, R0, *L); 1.92 break; 1.93 case 0x06: //below_equal 1.94 __ slt(AT, op2, op1); 1.95 - if(&L) 1.96 - __ beq(AT, R0, L); 1.97 - else 1.98 - __ beq(AT, R0, (int)0); 1.99 + __ beq_long(AT, R0, *L); 1.100 break; 1.101 default: 1.102 Unimplemented(); 1.103 } 1.104 - __ nop(); 1.105 - __ nop(); 1.106 %} 1.107 ins_pipe( pipe_jump ); 1.108 ins_pc_relative(1); 1.109 @@ -6784,57 +6760,37 @@ 1.110 ins_encode %{ 1.111 Register op1 = $src1$$Register; 1.112 Register op2 = AT; 1.113 - Label &L = *($labl$$label); 1.114 + Label* L = $labl$$label; 1.115 int flag = $cop$$cmpcode; 1.116 1.117 __ move(op2, $src2$$constant); 1.118 1.119 switch(flag) { 1.120 case 0x01: //equal 1.121 - if (&L) 1.122 - __ beq(op1, op2, L); 1.123 - else 1.124 - __ beq(op1, op2, (int)0); 1.125 + __ beq_long(op1, op2, *L); 1.126 break; 1.127 case 0x02: //not_equal 1.128 - if (&L) 1.129 - __ bne(op1, op2, L); 1.130 - else 1.131 - __ bne(op1, op2, (int)0); 1.132 + __ bne_long(op1, op2, *L); 1.133 break; 1.134 case 0x03: //above 1.135 __ slt(AT, op2, op1); 1.136 - if(&L) 1.137 - __ bne(AT, R0, L); 1.138 - else 1.139 - __ bne(AT, R0, (int)0); 1.140 + __ bne_long(AT, R0, *L); 1.141 break; 1.142 case 0x04: //above_equal 1.143 __ slt(AT, op1, op2); 1.144 - if(&L) 1.145 - __ beq(AT, R0, L); 1.146 - else 1.147 - __ beq(AT, R0, (int)0); 1.148 + __ beq_long(AT, R0, *L); 1.149 break; 1.150 case 0x05: //below 1.151 __ slt(AT, op1, op2); 1.152 - if(&L) 1.153 - __ bne(AT, R0, L); 1.154 - else 1.155 - __ bne(AT, R0, (int)0); 1.156 + __ bne_long(AT, R0, *L); 1.157 break; 1.158 case 0x06: //below_equal 1.159 __ slt(AT, op2, op1); 1.160 - if(&L) 1.161 - __ beq(AT, R0, L); 1.162 - else 1.163 - __ beq(AT, R0, (int)0); 1.164 + __ beq_long(AT, R0, *L); 1.165 break; 1.166 default: 1.167 Unimplemented(); 1.168 } 1.169 - __ nop(); 1.170 - __ nop(); 1.171 %} 1.172 ins_pipe( pipe_jump ); 1.173 ins_pc_relative(1); 1.174 @@ -6850,25 +6806,17 @@ 1.175 format %{ "J$cop $labl #mips uses AT as eflag @jmpCon_flags_long" %} 1.176 1.177 ins_encode %{ 1.178 - Label &L = *($labl$$label); 1.179 + Label* L = $labl$$label; 1.180 switch($cop$$cmpcode) { 1.181 case 0x01: //equal 1.182 - if (&L) 1.183 - __ bne(AT, R0, L); 1.184 - else 1.185 - __ bne(AT, R0, (int)0); 1.186 + __ bne_long(AT, R0, *L); 1.187 break; 1.188 case 0x02: //not equal 1.189 - if (&L) 1.190 - __ beq(AT, R0, L); 1.191 - else 1.192 - __ beq(AT, R0, (int)0); 1.193 + __ beq_long(AT, R0, *L); 1.194 break; 1.195 default: 1.196 Unimplemented(); 1.197 } 1.198 - __ nop(); 1.199 - __ nop(); 1.200 %} 1.201 1.202 ins_pipe( pipe_jump ); 1.203 @@ -6886,27 +6834,19 @@ 1.204 ins_encode %{ 1.205 Register op1 = $op1$$Register; 1.206 Register op2 = R0; 1.207 - Label &L = *($labl$$label); 1.208 + Label* L = $labl$$label; 1.209 int flag = $cmp$$cmpcode; 1.210 1.211 switch(flag) { 1.212 case 0x01: //equal 1.213 - if (&L) 1.214 - __ beq(op1, op2, L); 1.215 - else 1.216 - __ beq(op1, op2, (int)0); 1.217 + __ beq_long(op1, op2, *L); 1.218 break; 1.219 case 0x02: //not_equal 1.220 - if (&L) 1.221 - __ bne(op1, op2, L); 1.222 - else 1.223 - __ bne(op1, op2, (int)0); 1.224 + __ bne_long(op1, op2, *L); 1.225 break; 1.226 default: 1.227 Unimplemented(); 1.228 } 1.229 - __ nop(); 1.230 - __ nop(); 1.231 %} 1.232 1.233 ins_pc_relative(1); 1.234 @@ -6924,28 +6864,20 @@ 1.235 ins_encode %{ 1.236 Register op1 = $op1$$Register; 1.237 Register op2 = R0; 1.238 - Label &L = *($labl$$label); 1.239 + Label* L = $labl$$label; 1.240 int flag = $cmp$$cmpcode; 1.241 1.242 switch(flag) 1.243 { 1.244 case 0x01: //equal 1.245 - if (&L) 1.246 - __ beq(op1, op2, L); 1.247 - else 1.248 - __ beq(op1, op2, (int)0); 1.249 + __ beq_long(op1, op2, *L); 1.250 break; 1.251 case 0x02: //not_equal 1.252 - if (&L) 1.253 - __ bne(op1, op2, L); 1.254 - else 1.255 - __ bne(op1, op2, (int)0); 1.256 + __ bne_long(op1, op2, *L); 1.257 break; 1.258 default: 1.259 Unimplemented(); 1.260 } 1.261 - __ nop(); 1.262 - __ nop(); 1.263 %} 1.264 1.265 ins_pc_relative(1); 1.266 @@ -6964,55 +6896,35 @@ 1.267 ins_encode %{ 1.268 Register op1 = $op1$$Register; 1.269 Register op2 = $op2$$Register; 1.270 - Label &L = *($labl$$label); 1.271 + Label* L = $labl$$label; 1.272 int flag = $cmp$$cmpcode; 1.273 1.274 switch(flag) { 1.275 case 0x01: //equal 1.276 - if (&L) 1.277 - __ beq(op1, op2, L); 1.278 - else 1.279 - __ beq(op1, op2, (int)0); 1.280 + __ beq_long(op1, op2, *L); 1.281 break; 1.282 case 0x02: //not_equal 1.283 - if (&L) 1.284 - __ bne(op1, op2, L); 1.285 - else 1.286 - __ bne(op1, op2, (int)0); 1.287 + __ bne_long(op1, op2, *L); 1.288 break; 1.289 case 0x03: //above 1.290 __ sltu(AT, op2, op1); 1.291 - if(&L) 1.292 - __ bne(R0, AT, L); 1.293 - else 1.294 - __ bne(R0, AT, (int)0); 1.295 + __ bne_long(R0, AT, *L); 1.296 break; 1.297 case 0x04: //above_equal 1.298 __ sltu(AT, op1, op2); 1.299 - if(&L) 1.300 - __ beq(AT, R0, L); 1.301 - else 1.302 - __ beq(AT, R0, (int)0); 1.303 + __ beq_long(AT, R0, *L); 1.304 break; 1.305 case 0x05: //below 1.306 __ sltu(AT, op1, op2); 1.307 - if(&L) 1.308 - __ bne(R0, AT, L); 1.309 - else 1.310 - __ bne(R0, AT, (int)0); 1.311 + __ bne_long(R0, AT, *L); 1.312 break; 1.313 case 0x06: //below_equal 1.314 __ sltu(AT, op2, op1); 1.315 - if(&L) 1.316 - __ beq(AT, R0, L); 1.317 - else 1.318 - __ beq(AT, R0, (int)0); 1.319 + __ beq_long(AT, R0, *L); 1.320 break; 1.321 default: 1.322 Unimplemented(); 1.323 } 1.324 - __ nop(); 1.325 - __ nop(); 1.326 %} 1.327 1.328 ins_pc_relative(1); 1.329 @@ -7029,27 +6941,19 @@ 1.330 ins_encode %{ 1.331 Register op1 = $op1$$Register; 1.332 Register op2 = R0; 1.333 - Label &L = *($labl$$label); 1.334 + Label* L = $labl$$label; 1.335 int flag = $cmp$$cmpcode; 1.336 1.337 switch(flag) { 1.338 case 0x01: //equal 1.339 - if (&L) 1.340 - __ beq(op1, op2, L); 1.341 - else 1.342 - __ beq(op1, op2, (int)0); 1.343 + __ beq_long(op1, op2, *L); 1.344 break; 1.345 case 0x02: //not_equal 1.346 - if (&L) 1.347 - __ bne(op1, op2, L); 1.348 - else 1.349 - __ bne(op1, op2, (int)0); 1.350 + __ bne_long(op1, op2, *L); 1.351 break; 1.352 default: 1.353 Unimplemented(); 1.354 } 1.355 - __ nop(); 1.356 - __ nop(); 1.357 %} 1.358 //TODO: pipe_branchP or create pipe_branchN LEE 1.359 ins_pc_relative(1); 1.360 @@ -7066,55 +6970,35 @@ 1.361 ins_encode %{ 1.362 Register op1_reg = $op1$$Register; 1.363 Register op2_reg = $op2$$Register; 1.364 - Label &L = *($labl$$label); 1.365 + Label* L = $labl$$label; 1.366 int flag = $cmp$$cmpcode; 1.367 1.368 switch(flag) { 1.369 case 0x01: //equal 1.370 - if (&L) 1.371 - __ beq(op1_reg, op2_reg, L); 1.372 - else 1.373 - __ beq(op1_reg, op2_reg, (int)0); 1.374 + __ beq_long(op1_reg, op2_reg, *L); 1.375 break; 1.376 case 0x02: //not_equal 1.377 - if (&L) 1.378 - __ bne(op1_reg, op2_reg, L); 1.379 - else 1.380 - __ bne(op1_reg, op2_reg, (int)0); 1.381 + __ bne_long(op1_reg, op2_reg, *L); 1.382 break; 1.383 case 0x03: //above 1.384 __ sltu(AT, op2_reg, op1_reg); 1.385 - if(&L) 1.386 - __ bne(R0, AT, L); 1.387 - else 1.388 - __ bne(R0, AT, (int)0); 1.389 + __ bne_long(R0, AT, *L); 1.390 break; 1.391 case 0x04: //above_equal 1.392 __ sltu(AT, op1_reg, op2_reg); 1.393 - if(&L) 1.394 - __ beq(AT, R0, L); 1.395 - else 1.396 - __ beq(AT, R0, (int)0); 1.397 + __ beq_long(AT, R0, *L); 1.398 break; 1.399 case 0x05: //below 1.400 __ sltu(AT, op1_reg, op2_reg); 1.401 - if(&L) 1.402 - __ bne(R0, AT, L); 1.403 - else 1.404 - __ bne(R0, AT, (int)0); 1.405 + __ bne_long(R0, AT, *L); 1.406 break; 1.407 case 0x06: //below_equal 1.408 __ sltu(AT, op2_reg, op1_reg); 1.409 - if(&L) 1.410 - __ beq(AT, R0, L); 1.411 - else 1.412 - __ beq(AT, R0, (int)0); 1.413 + __ beq_long(AT, R0, *L); 1.414 break; 1.415 default: 1.416 Unimplemented(); 1.417 } 1.418 - __ nop(); 1.419 - __ nop(); 1.420 %} 1.421 ins_pc_relative(1); 1.422 ins_pipe( pipe_alu_branch ); 1.423 @@ -7128,55 +7012,35 @@ 1.424 ins_encode %{ 1.425 Register op1 = $src1$$Register; 1.426 Register op2 = $src2$$Register; 1.427 - Label &L = *($labl$$label); 1.428 + Label* L = $labl$$label; 1.429 int flag = $cmp$$cmpcode; 1.430 1.431 switch(flag) { 1.432 case 0x01: //equal 1.433 - if (&L) 1.434 - __ beq(op1, op2, L); 1.435 - else 1.436 - __ beq(op1, op2, (int)0); 1.437 + __ beq_long(op1, op2, *L); 1.438 break; 1.439 case 0x02: //not_equal 1.440 - if (&L) 1.441 - __ bne(op1, op2, L); 1.442 - else 1.443 - __ bne(op1, op2, (int)0); 1.444 + __ bne_long(op1, op2, *L); 1.445 break; 1.446 case 0x03: //above 1.447 __ sltu(AT, op2, op1); 1.448 - if(&L) 1.449 - __ bne(AT, R0, L); 1.450 - else 1.451 - __ bne(AT, R0, (int)0); 1.452 + __ bne_long(AT, R0, *L); 1.453 break; 1.454 case 0x04: //above_equal 1.455 __ sltu(AT, op1, op2); 1.456 - if(&L) 1.457 - __ beq(AT, R0, L); 1.458 - else 1.459 - __ beq(AT, R0, (int)0); 1.460 + __ beq_long(AT, R0, *L); 1.461 break; 1.462 case 0x05: //below 1.463 __ sltu(AT, op1, op2); 1.464 - if(&L) 1.465 - __ bne(AT, R0, L); 1.466 - else 1.467 - __ bne(AT, R0, (int)0); 1.468 + __ bne_long(AT, R0, *L); 1.469 break; 1.470 case 0x06: //below_equal 1.471 __ sltu(AT, op2, op1); 1.472 - if(&L) 1.473 - __ beq(AT, R0, L); 1.474 - else 1.475 - __ beq(AT, R0, (int)0); 1.476 + __ beq_long(AT, R0, *L); 1.477 break; 1.478 default: 1.479 Unimplemented(); 1.480 } 1.481 - __ nop(); 1.482 - __ nop(); 1.483 %} 1.484 1.485 ins_pc_relative(1); 1.486 @@ -7192,56 +7056,36 @@ 1.487 ins_encode %{ 1.488 Register op1 = $src1$$Register; 1.489 int val = $src2$$constant; 1.490 - Label &L = *($labl$$label); 1.491 + Label* L = $labl$$label; 1.492 int flag = $cmp$$cmpcode; 1.493 1.494 __ move(AT, val); 1.495 switch(flag) { 1.496 case 0x01: //equal 1.497 - if (&L) 1.498 - __ beq(op1, AT, L); 1.499 - else 1.500 - __ beq(op1, AT, (int)0); 1.501 + __ beq_long(op1, AT, *L); 1.502 break; 1.503 case 0x02: //not_equal 1.504 - if (&L) 1.505 - __ bne(op1, AT, L); 1.506 - else 1.507 - __ bne(op1, AT, (int)0); 1.508 + __ bne_long(op1, AT, *L); 1.509 break; 1.510 case 0x03: //above 1.511 __ sltu(AT, AT, op1); 1.512 - if(&L) 1.513 - __ bne(R0, AT, L); 1.514 - else 1.515 - __ bne(R0, AT, (int)0); 1.516 + __ bne_long(R0, AT, *L); 1.517 break; 1.518 case 0x04: //above_equal 1.519 __ sltu(AT, op1, AT); 1.520 - if(&L) 1.521 - __ beq(AT, R0, L); 1.522 - else 1.523 - __ beq(AT, R0, (int)0); 1.524 + __ beq_long(AT, R0, *L); 1.525 break; 1.526 case 0x05: //below 1.527 __ sltu(AT, op1, AT); 1.528 - if(&L) 1.529 - __ bne(R0, AT, L); 1.530 - else 1.531 - __ bne(R0, AT, (int)0); 1.532 + __ bne_long(R0, AT, *L); 1.533 break; 1.534 case 0x06: //below_equal 1.535 __ sltu(AT, AT, op1); 1.536 - if(&L) 1.537 - __ beq(AT, R0, L); 1.538 - else 1.539 - __ beq(AT, R0, (int)0); 1.540 + __ beq_long(AT, R0, *L); 1.541 break; 1.542 default: 1.543 Unimplemented(); 1.544 } 1.545 - __ nop(); 1.546 - __ nop(); 1.547 %} 1.548 1.549 ins_pc_relative(1); 1.550 @@ -7256,55 +7100,35 @@ 1.551 ins_encode %{ 1.552 Register op1 = $src1$$Register; 1.553 Register op2 = $src2$$Register; 1.554 - Label &L = *($labl$$label); 1.555 + Label* L = $labl$$label; 1.556 int flag = $cmp$$cmpcode; 1.557 1.558 switch(flag) { 1.559 case 0x01: //equal 1.560 - if (&L) 1.561 - __ beq(op1, op2, L); 1.562 - else 1.563 - __ beq(op1, op2, (int)0); 1.564 + __ beq_long(op1, op2, *L); 1.565 break; 1.566 case 0x02: //not_equal 1.567 - if (&L) 1.568 - __ bne(op1, op2, L); 1.569 - else 1.570 - __ bne(op1, op2, (int)0); 1.571 + __ bne_long(op1, op2, *L); 1.572 break; 1.573 case 0x03: //above 1.574 __ slt(AT, op2, op1); 1.575 - if(&L) 1.576 - __ bne(R0, AT, L); 1.577 - else 1.578 - __ bne(R0, AT, (int)0); 1.579 + __ bne_long(R0, AT, *L); 1.580 break; 1.581 case 0x04: //above_equal 1.582 __ slt(AT, op1, op2); 1.583 - if(&L) 1.584 - __ beq(AT, R0, L); 1.585 - else 1.586 - __ beq(AT, R0, (int)0); 1.587 + __ beq_long(AT, R0, *L); 1.588 break; 1.589 case 0x05: //below 1.590 __ slt(AT, op1, op2); 1.591 - if(&L) 1.592 - __ bne(R0, AT, L); 1.593 - else 1.594 - __ bne(R0, AT, (int)0); 1.595 + __ bne_long(R0, AT, *L); 1.596 break; 1.597 case 0x06: //below_equal 1.598 __ slt(AT, op2, op1); 1.599 - if(&L) 1.600 - __ beq(AT, R0, L); 1.601 - else 1.602 - __ beq(AT, R0, (int)0); 1.603 - break; 1.604 + __ beq_long(AT, R0, *L); 1.605 + break; 1.606 default: 1.607 Unimplemented(); 1.608 } 1.609 - __ nop(); 1.610 - __ nop(); 1.611 %} 1.612 1.613 ins_pc_relative(1); 1.614 @@ -7319,58 +7143,41 @@ 1.615 1.616 ins_encode %{ 1.617 Register op1 = $src1$$Register; 1.618 - Label &L = *($labl$$label); 1.619 + Label* L = $labl$$label; 1.620 int flag = $cmp$$cmpcode; 1.621 1.622 switch(flag) { 1.623 case 0x01: //equal 1.624 - if (&L) 1.625 - __ beq(op1, R0, L); 1.626 - else 1.627 - __ beq(op1, R0, (int)0); 1.628 + __ beq_long(op1, R0, *L); 1.629 break; 1.630 case 0x02: //not_equal 1.631 - if (&L) 1.632 - __ bne(op1, R0, L); 1.633 - else 1.634 - __ bne(op1, R0, (int)0); 1.635 + __ bne_long(op1, R0, *L); 1.636 break; 1.637 case 0x03: //greater 1.638 - if(&L) 1.639 - __ bgtz(op1, L); 1.640 - else 1.641 - __ bgtz(op1, (int)0); 1.642 + __ slt(AT, R0, op1); 1.643 + __ bne_long(R0, AT, *L); 1.644 break; 1.645 case 0x04: //greater_equal 1.646 - if(&L) 1.647 - __ bgez(op1, L); 1.648 - else 1.649 - __ bgez(op1, (int)0); 1.650 + __ slt(AT, op1, R0); 1.651 + __ beq_long(AT, R0, *L); 1.652 break; 1.653 case 0x05: //less 1.654 - if(&L) 1.655 - __ bltz(op1, L); 1.656 - else 1.657 - __ bltz(op1, (int)0); 1.658 + __ slt(AT, op1, R0); 1.659 + __ bne_long(R0, AT, *L); 1.660 break; 1.661 case 0x06: //less_equal 1.662 - if(&L) 1.663 - __ blez(op1, L); 1.664 - else 1.665 - __ blez(op1, (int)0); 1.666 - break; 1.667 + __ slt(AT, R0, op1); 1.668 + __ beq_long(AT, R0, *L); 1.669 + break; 1.670 default: 1.671 Unimplemented(); 1.672 } 1.673 - __ nop(); 1.674 - __ nop(); 1.675 %} 1.676 1.677 ins_pc_relative(1); 1.678 ins_pipe( pipe_alu_branch ); 1.679 %} 1.680 1.681 - 1.682 instruct branchConI_reg_imm_long(cmpOp cmp, mRegI src1, immI src2, label labl) %{ 1.683 match( If cmp (CmpI src1 src2) ); 1.684 effect(USE labl); 1.685 @@ -7380,56 +7187,36 @@ 1.686 ins_encode %{ 1.687 Register op1 = $src1$$Register; 1.688 int val = $src2$$constant; 1.689 - Label &L = *($labl$$label); 1.690 + Label* L = $labl$$label; 1.691 int flag = $cmp$$cmpcode; 1.692 1.693 __ move(AT, val); 1.694 switch(flag) { 1.695 case 0x01: //equal 1.696 - if (&L) 1.697 - __ beq(op1, AT, L); 1.698 - else 1.699 - __ beq(op1, AT, (int)0); 1.700 + __ beq_long(op1, AT, *L); 1.701 break; 1.702 case 0x02: //not_equal 1.703 - if (&L) 1.704 - __ bne(op1, AT, L); 1.705 - else 1.706 - __ bne(op1, AT, (int)0); 1.707 + __ bne_long(op1, AT, *L); 1.708 break; 1.709 case 0x03: //greater 1.710 __ slt(AT, AT, op1); 1.711 - if(&L) 1.712 - __ bne(R0, AT, L); 1.713 - else 1.714 - __ bne(R0, AT, (int)0); 1.715 + __ bne_long(R0, AT, *L); 1.716 break; 1.717 case 0x04: //greater_equal 1.718 __ slt(AT, op1, AT); 1.719 - if(&L) 1.720 - __ beq(AT, R0, L); 1.721 - else 1.722 - __ beq(AT, R0, (int)0); 1.723 + __ beq_long(AT, R0, *L); 1.724 break; 1.725 case 0x05: //less 1.726 __ slt(AT, op1, AT); 1.727 - if(&L) 1.728 - __ bne(R0, AT, L); 1.729 - else 1.730 - __ bne(R0, AT, (int)0); 1.731 + __ bne_long(R0, AT, *L); 1.732 break; 1.733 case 0x06: //less_equal 1.734 __ slt(AT, AT, op1); 1.735 - if(&L) 1.736 - __ beq(AT, R0, L); 1.737 - else 1.738 - __ beq(AT, R0, (int)0); 1.739 + __ beq_long(AT, R0, *L); 1.740 break; 1.741 default: 1.742 Unimplemented(); 1.743 } 1.744 - __ nop(); 1.745 - __ nop(); 1.746 %} 1.747 1.748 ins_pc_relative(1); 1.749 @@ -7443,49 +7230,32 @@ 1.750 1.751 ins_encode %{ 1.752 Register op1 = $src1$$Register; 1.753 - Label &L = *($labl$$label); 1.754 + Label* L = $labl$$label; 1.755 int flag = $cmp$$cmpcode; 1.756 1.757 switch(flag) { 1.758 case 0x01: //equal 1.759 - if (&L) 1.760 - __ beq(op1, R0, L); 1.761 - else 1.762 - __ beq(op1, R0, (int)0); 1.763 + __ beq_long(op1, R0, *L); 1.764 break; 1.765 case 0x02: //not_equal 1.766 - if (&L) 1.767 - __ bne(op1, R0, L); 1.768 - else 1.769 - __ bne(op1, R0, (int)0); 1.770 + __ bne_long(op1, R0, *L); 1.771 break; 1.772 case 0x03: //above 1.773 - if(&L) 1.774 - __ bne(R0, op1, L); 1.775 - else 1.776 - __ bne(R0, op1, (int)0); 1.777 + __ bne_long(R0, op1, *L); 1.778 break; 1.779 case 0x04: //above_equal 1.780 - if(&L) 1.781 - __ beq(R0, R0, L); 1.782 - else 1.783 - __ beq(R0, R0, (int)0); 1.784 + __ beq_long(R0, R0, *L); 1.785 break; 1.786 case 0x05: //below 1.787 return; 1.788 break; 1.789 case 0x06: //below_equal 1.790 - if(&L) 1.791 - __ beq(op1, R0, L); 1.792 - else 1.793 - __ beq(op1, R0, (int)0); 1.794 + __ beq_long(op1, R0, *L); 1.795 break; 1.796 default: 1.797 Unimplemented(); 1.798 } 1.799 - __ nop(); 1.800 - __ nop(); 1.801 - %} 1.802 + %} 1.803 1.804 ins_pc_relative(1); 1.805 ins_pipe( pipe_alu_branch ); 1.806 @@ -7501,59 +7271,39 @@ 1.807 ins_encode %{ 1.808 Register op1 = $src1$$Register; 1.809 int val = $src2$$constant; 1.810 - Label &L = *($labl$$label); 1.811 + Label* L = $labl$$label; 1.812 int flag = $cmp$$cmpcode; 1.813 1.814 switch(flag) { 1.815 case 0x01: //equal 1.816 __ move(AT, val); 1.817 - if (&L) 1.818 - __ beq(op1, AT, L); 1.819 - else 1.820 - __ beq(op1, AT, (int)0); 1.821 + __ beq_long(op1, AT, *L); 1.822 break; 1.823 case 0x02: //not_equal 1.824 __ move(AT, val); 1.825 - if (&L) 1.826 - __ bne(op1, AT, L); 1.827 - else 1.828 - __ bne(op1, AT, (int)0); 1.829 + __ bne_long(op1, AT, *L); 1.830 break; 1.831 case 0x03: //above 1.832 __ move(AT, val); 1.833 __ sltu(AT, AT, op1); 1.834 - if(&L) 1.835 - __ bne(R0, AT, L); 1.836 - else 1.837 - __ bne(R0, AT, (int)0); 1.838 + __ bne_long(R0, AT, *L); 1.839 break; 1.840 case 0x04: //above_equal 1.841 __ sltiu(AT, op1, val); 1.842 - if(&L) 1.843 - __ beq(AT, R0, L); 1.844 - else 1.845 - __ beq(AT, R0, (int)0); 1.846 + __ beq_long(AT, R0, *L); 1.847 break; 1.848 case 0x05: //below 1.849 __ sltiu(AT, op1, val); 1.850 - if(&L) 1.851 - __ bne(R0, AT, L); 1.852 - else 1.853 - __ bne(R0, AT, (int)0); 1.854 + __ bne_long(R0, AT, *L); 1.855 break; 1.856 case 0x06: //below_equal 1.857 __ move(AT, val); 1.858 __ sltu(AT, AT, op1); 1.859 - if(&L) 1.860 - __ beq(AT, R0, L); 1.861 - else 1.862 - __ beq(AT, R0, (int)0); 1.863 + __ beq_long(AT, R0, *L); 1.864 break; 1.865 default: 1.866 Unimplemented(); 1.867 } 1.868 - __ nop(); 1.869 - __ nop(); 1.870 %} 1.871 1.872 ins_pc_relative(1); 1.873 @@ -7571,70 +7321,41 @@ 1.874 Register opr1_reg = as_Register($src1$$reg); 1.875 Register opr2_reg = as_Register($src2$$reg); 1.876 1.877 - Label &target = *($labl$$label); 1.878 + Label* target = $labl$$label; 1.879 int flag = $cmp$$cmpcode; 1.880 1.881 switch(flag) { 1.882 case 0x01: //equal 1.883 - if (&target) 1.884 - __ beq(opr1_reg, opr2_reg, target); 1.885 - else 1.886 - __ beq(opr1_reg, opr2_reg, (int)0); 1.887 - __ delayed()->nop(); 1.888 + __ beq_long(opr1_reg, opr2_reg, *target); 1.889 break; 1.890 1.891 case 0x02: //not_equal 1.892 - if(&target) 1.893 - __ bne(opr1_reg, opr2_reg, target); 1.894 - else 1.895 - __ bne(opr1_reg, opr2_reg, (int)0); 1.896 - __ delayed()->nop(); 1.897 + __ bne_long(opr1_reg, opr2_reg, *target); 1.898 break; 1.899 1.900 case 0x03: //greater 1.901 __ slt(AT, opr2_reg, opr1_reg); 1.902 - if(&target) 1.903 - __ bne(AT, R0, target); 1.904 - else 1.905 - __ bne(AT, R0, (int)0); 1.906 - __ delayed()->nop(); 1.907 + __ bne_long(AT, R0, *target); 1.908 break; 1.909 1.910 case 0x04: //greater_equal 1.911 __ slt(AT, opr1_reg, opr2_reg); 1.912 - if(&target) 1.913 - __ beq(AT, R0, target); 1.914 - else 1.915 - __ beq(AT, R0, (int)0); 1.916 - __ delayed()->nop(); 1.917 - 1.918 + __ beq_long(AT, R0, *target); 1.919 break; 1.920 1.921 case 0x05: //less 1.922 __ slt(AT, opr1_reg, opr2_reg); 1.923 - if(&target) 1.924 - __ bne(AT, R0, target); 1.925 - else 1.926 - __ bne(AT, R0, (int)0); 1.927 - __ delayed()->nop(); 1.928 - 1.929 + __ bne_long(AT, R0, *target); 1.930 break; 1.931 1.932 case 0x06: //less_equal 1.933 __ slt(AT, opr2_reg, opr1_reg); 1.934 - 1.935 - if(&target) 1.936 - __ beq(AT, R0, target); 1.937 - else 1.938 - __ beq(AT, R0, (int)0); 1.939 - __ delayed()->nop(); 1.940 - 1.941 + __ beq_long(AT, R0, *target); 1.942 break; 1.943 1.944 default: 1.945 Unimplemented(); 1.946 } 1.947 - __ nop(); 1.948 %} 1.949 1.950 1.951 @@ -7642,7 +7363,6 @@ 1.952 ins_pipe( pipe_alu_branch ); 1.953 %} 1.954 1.955 - 1.956 instruct branchConL_regL_immL0_long(cmpOp cmp, mRegL src1, immL0 zero, label labl) %{ 1.957 match( If cmp (CmpL src1 zero) ); 1.958 effect(USE labl); 1.959 @@ -7651,58 +7371,43 @@ 1.960 1.961 ins_encode %{ 1.962 Register opr1_reg = as_Register($src1$$reg); 1.963 - Label &target = *($labl$$label); 1.964 + Register opr2_reg = R0; 1.965 + 1.966 + Label* target = $labl$$label; 1.967 int flag = $cmp$$cmpcode; 1.968 1.969 switch(flag) { 1.970 case 0x01: //equal 1.971 - if (&target) 1.972 - __ beq(opr1_reg, R0, target); 1.973 - else 1.974 - __ beq(opr1_reg, R0, int(0)); 1.975 + __ beq_long(opr1_reg, opr2_reg, *target); 1.976 break; 1.977 1.978 case 0x02: //not_equal 1.979 - if(&target) 1.980 - __ bne(opr1_reg, R0, target); 1.981 - else 1.982 - __ bne(opr1_reg, R0, (int)0); 1.983 + __ bne_long(opr1_reg, opr2_reg, *target); 1.984 break; 1.985 1.986 case 0x03: //greater 1.987 - if(&target) 1.988 - __ bgtz(opr1_reg, target); 1.989 - else 1.990 - __ bgtz(opr1_reg, (int)0); 1.991 - break; 1.992 + __ slt(AT, opr2_reg, opr1_reg); 1.993 + __ bne_long(AT, R0, *target); 1.994 + break; 1.995 1.996 case 0x04: //greater_equal 1.997 - if(&target) 1.998 - __ bgez(opr1_reg, target); 1.999 - else 1.1000 - __ bgez(opr1_reg, (int)0); 1.1001 + __ slt(AT, opr1_reg, opr2_reg); 1.1002 + __ beq_long(AT, R0, *target); 1.1003 break; 1.1004 1.1005 case 0x05: //less 1.1006 - __ slt(AT, opr1_reg, R0); 1.1007 - if(&target) 1.1008 - __ bne(AT, R0, target); 1.1009 - else 1.1010 - __ bne(AT, R0, (int)0); 1.1011 + __ slt(AT, opr1_reg, opr2_reg); 1.1012 + __ bne_long(AT, R0, *target); 1.1013 break; 1.1014 1.1015 case 0x06: //less_equal 1.1016 - if (&target) 1.1017 - __ blez(opr1_reg, target); 1.1018 - else 1.1019 - __ blez(opr1_reg, int(0)); 1.1020 + __ slt(AT, opr2_reg, opr1_reg); 1.1021 + __ beq_long(AT, R0, *target); 1.1022 break; 1.1023 1.1024 default: 1.1025 - Unimplemented(); 1.1026 - } 1.1027 - __ delayed()->nop(); 1.1028 - __ nop(); 1.1029 + Unimplemented(); 1.1030 + } 1.1031 %} 1.1032 1.1033 1.1034 @@ -7720,63 +7425,43 @@ 1.1035 Register opr1_reg = as_Register($src1$$reg); 1.1036 Register opr2_reg = AT; 1.1037 1.1038 - Label &target = *($labl$$label); 1.1039 + Label* target = $labl$$label; 1.1040 int flag = $cmp$$cmpcode; 1.1041 1.1042 __ set64(opr2_reg, $src2$$constant); 1.1043 1.1044 switch(flag) { 1.1045 case 0x01: //equal 1.1046 - if (&target) 1.1047 - __ beq(opr1_reg, opr2_reg, target); 1.1048 - else 1.1049 - __ beq(opr1_reg, opr2_reg, (int)0); 1.1050 + __ beq_long(opr1_reg, opr2_reg, *target); 1.1051 break; 1.1052 1.1053 case 0x02: //not_equal 1.1054 - if(&target) 1.1055 - __ bne(opr1_reg, opr2_reg, target); 1.1056 - else 1.1057 - __ bne(opr1_reg, opr2_reg, (int)0); 1.1058 + __ bne_long(opr1_reg, opr2_reg, *target); 1.1059 break; 1.1060 1.1061 case 0x03: //greater 1.1062 __ slt(AT, opr2_reg, opr1_reg); 1.1063 - if(&target) 1.1064 - __ bne(AT, R0, target); 1.1065 - else 1.1066 - __ bne(AT, R0, (int)0); 1.1067 + __ bne_long(AT, R0, *target); 1.1068 break; 1.1069 1.1070 case 0x04: //greater_equal 1.1071 __ slt(AT, opr1_reg, opr2_reg); 1.1072 - if(&target) 1.1073 - __ beq(AT, R0, target); 1.1074 - else 1.1075 - __ beq(AT, R0, (int)0); 1.1076 + __ beq_long(AT, R0, *target); 1.1077 break; 1.1078 1.1079 case 0x05: //less 1.1080 __ slt(AT, opr1_reg, opr2_reg); 1.1081 - if(&target) 1.1082 - __ bne(AT, R0, target); 1.1083 - else 1.1084 - __ bne(AT, R0, (int)0); 1.1085 + __ bne_long(AT, R0, *target); 1.1086 break; 1.1087 1.1088 case 0x06: //less_equal 1.1089 __ slt(AT, opr2_reg, opr1_reg); 1.1090 - if(&target) 1.1091 - __ beq(AT, R0, target); 1.1092 - else 1.1093 - __ beq(AT, R0, (int)0); 1.1094 + __ beq_long(AT, R0, *target); 1.1095 break; 1.1096 1.1097 default: 1.1098 Unimplemented(); 1.1099 } 1.1100 - __ nop(); 1.1101 - __ nop(); 1.1102 %} 1.1103 1.1104 1.1105 @@ -7794,57 +7479,37 @@ 1.1106 ins_encode %{ 1.1107 FloatRegister reg_op1 = $src1$$FloatRegister; 1.1108 FloatRegister reg_op2 = $src2$$FloatRegister; 1.1109 - Label &L = *($labl$$label); 1.1110 + Label* L = $labl$$label; 1.1111 int flag = $cmp$$cmpcode; 1.1112 1.1113 switch(flag) { 1.1114 case 0x01: //equal 1.1115 __ c_eq_s(reg_op1, reg_op2); 1.1116 - if (&L) 1.1117 - __ bc1t(L); 1.1118 - else 1.1119 - __ bc1t((int)0); 1.1120 + __ bc1t_long(*L); 1.1121 break; 1.1122 case 0x02: //not_equal 1.1123 __ c_eq_s(reg_op1, reg_op2); 1.1124 - if (&L) 1.1125 - __ bc1f(L); 1.1126 - else 1.1127 - __ bc1f((int)0); 1.1128 + __ bc1f_long(*L); 1.1129 break; 1.1130 case 0x03: //greater 1.1131 __ c_ule_s(reg_op1, reg_op2); 1.1132 - if(&L) 1.1133 - __ bc1f(L); 1.1134 - else 1.1135 - __ bc1f((int)0); 1.1136 + __ bc1f_long(*L); 1.1137 break; 1.1138 case 0x04: //greater_equal 1.1139 __ c_ult_s(reg_op1, reg_op2); 1.1140 - if(&L) 1.1141 - __ bc1f(L); 1.1142 - else 1.1143 - __ bc1f((int)0); 1.1144 + __ bc1f_long(*L); 1.1145 break; 1.1146 case 0x05: //less 1.1147 __ c_ult_s(reg_op1, reg_op2); 1.1148 - if(&L) 1.1149 - __ bc1t(L); 1.1150 - else 1.1151 - __ bc1t((int)0); 1.1152 + __ bc1t_long(*L); 1.1153 break; 1.1154 case 0x06: //less_equal 1.1155 __ c_ule_s(reg_op1, reg_op2); 1.1156 - if(&L) 1.1157 - __ bc1t(L); 1.1158 - else 1.1159 - __ bc1t((int)0); 1.1160 + __ bc1t_long(*L); 1.1161 break; 1.1162 default: 1.1163 Unimplemented(); 1.1164 } 1.1165 - __ nop(); 1.1166 - __ nop(); 1.1167 %} 1.1168 1.1169 ins_pc_relative(1); 1.1170 @@ -7859,58 +7524,38 @@ 1.1171 ins_encode %{ 1.1172 FloatRegister reg_op1 = $src1$$FloatRegister; 1.1173 FloatRegister reg_op2 = $src2$$FloatRegister; 1.1174 - Label &L = *($labl$$label); 1.1175 + Label* L = $labl$$label; 1.1176 int flag = $cmp$$cmpcode; 1.1177 1.1178 switch(flag) { 1.1179 case 0x01: //equal 1.1180 __ c_eq_d(reg_op1, reg_op2); 1.1181 - if (&L) 1.1182 - __ bc1t(L); 1.1183 - else 1.1184 - __ bc1t((int)0); 1.1185 + __ bc1t_long(*L); 1.1186 break; 1.1187 case 0x02: //not_equal 1.1188 //2016/4/19 aoqi: c_ueq_d cannot distinguish NaN from equal. Double.isNaN(Double) is implemented by 'f != f', so the use of c_ueq_d causes bugs. 1.1189 __ c_eq_d(reg_op1, reg_op2); 1.1190 - if (&L) 1.1191 - __ bc1f(L); 1.1192 - else 1.1193 - __ bc1f((int)0); 1.1194 + __ bc1f_long(*L); 1.1195 break; 1.1196 case 0x03: //greater 1.1197 __ c_ule_d(reg_op1, reg_op2); 1.1198 - if(&L) 1.1199 - __ bc1f(L); 1.1200 - else 1.1201 - __ bc1f((int)0); 1.1202 + __ bc1f_long(*L); 1.1203 break; 1.1204 case 0x04: //greater_equal 1.1205 __ c_ult_d(reg_op1, reg_op2); 1.1206 - if(&L) 1.1207 - __ bc1f(L); 1.1208 - else 1.1209 - __ bc1f((int)0); 1.1210 + __ bc1f_long(*L); 1.1211 break; 1.1212 case 0x05: //less 1.1213 __ c_ult_d(reg_op1, reg_op2); 1.1214 - if(&L) 1.1215 - __ bc1t(L); 1.1216 - else 1.1217 - __ bc1t((int)0); 1.1218 + __ bc1t_long(*L); 1.1219 break; 1.1220 case 0x06: //less_equal 1.1221 __ c_ule_d(reg_op1, reg_op2); 1.1222 - if(&L) 1.1223 - __ bc1t(L); 1.1224 - else 1.1225 - __ bc1t((int)0); 1.1226 + __ bc1t_long(*L); 1.1227 break; 1.1228 default: 1.1229 Unimplemented(); 1.1230 } 1.1231 - __ nop(); 1.1232 - __ nop(); 1.1233 %} 1.1234 1.1235 ins_pc_relative(1); 1.1236 @@ -7934,7 +7579,7 @@ 1.1237 if(&L) 1.1238 __ b(L); 1.1239 else 1.1240 - __ b(int(0)); 1.1241 + __ b(int(0)); 1.1242 __ nop(); 1.1243 %} 1.1244