Wed, 22 Mar 2017 07:13:07 -0400
[C2] Redefine memory operands for MIPS.
src/cpu/mips/vm/mips_64.ad | file | annotate | diff | comparison | revisions |
1.1 --- a/src/cpu/mips/vm/mips_64.ad Wed Mar 22 04:54:35 2017 -0400 1.2 +++ b/src/cpu/mips/vm/mips_64.ad Wed Mar 22 07:13:07 2017 -0400 1.3 @@ -5164,61 +5164,29 @@ 1.4 %} 1.5 1.6 //----------Memory Operands---------------------------------------------------- 1.7 -// Indirect Memory Operand 1.8 -operand indirect(mRegP reg) %{ 1.9 +operand baseOffset16(mRegP reg, immL16 off) 1.10 +%{ 1.11 constraint(ALLOC_IN_RC(p_reg)); 1.12 - match(reg); 1.13 - 1.14 - format %{ "[$reg] @ indirect" %} 1.15 + match(AddP reg off); 1.16 + 1.17 + op_cost(5); 1.18 + format %{ "[$reg + $off (16-bit)] @ baseOffset16" %} 1.19 interface(MEMORY_INTER) %{ 1.20 base($reg); 1.21 - index(0x0); /* NO_INDEX */ 1.22 - scale(0x0); 1.23 - disp(0x0); 1.24 - %} 1.25 -%} 1.26 - 1.27 -// Indirect Memory Plus Short Offset Operand 1.28 -operand indOffset8(mRegP reg, immL8 off) 1.29 -%{ 1.30 - constraint(ALLOC_IN_RC(p_reg)); 1.31 - match(AddP reg off); 1.32 - 1.33 - op_cost(10); 1.34 - format %{ "[$reg + $off (8-bit)] @ indOffset8" %} 1.35 - interface(MEMORY_INTER) %{ 1.36 - base($reg); 1.37 - index(0x0); /* NO_INDEX */ 1.38 + index(0x0); 1.39 scale(0x0); 1.40 disp($off); 1.41 %} 1.42 %} 1.43 1.44 -// Indirect Memory Times Scale Plus Index Register 1.45 -operand indIndexScale(mRegP reg, mRegL lreg, immI2 scale) 1.46 -%{ 1.47 +operand gsBaseIndexOffset8(mRegP base, mRegL index, immL8 off) 1.48 +%{ 1.49 + predicate(UseLoongsonISA); 1.50 constraint(ALLOC_IN_RC(p_reg)); 1.51 - match(AddP reg (LShiftL lreg scale)); 1.52 - 1.53 - op_cost(10); 1.54 - format %{"[$reg + $lreg << $scale] @ indIndexScale" %} 1.55 - interface(MEMORY_INTER) %{ 1.56 - base($reg); 1.57 - index($lreg); 1.58 - scale($scale); 1.59 - disp(0x0); 1.60 - %} 1.61 -%} 1.62 - 1.63 - 1.64 -// [base + index + offset] 1.65 -operand baseIndexOffset8(mRegP base, mRegL index, immL8 off) 1.66 -%{ 1.67 - constraint(ALLOC_IN_RC(p_reg)); 1.68 + match(AddP (AddP base index) off); 1.69 + 1.70 op_cost(5); 1.71 - match(AddP (AddP base index) off); 1.72 - 1.73 - format %{ "[$base + $index + $off (8-bit)] @ baseIndexOffset8" %} 1.74 + format %{ "[$base + $index + $off (8-bit)] @ gsBaseIndexOffset8" %} 1.75 interface(MEMORY_INTER) %{ 1.76 base($base); 1.77 index($index); 1.78 @@ -5227,14 +5195,14 @@ 1.79 %} 1.80 %} 1.81 1.82 -// [base + index + offset] 1.83 -operand baseIndexOffset8_convI2L(mRegP base, mRegI index, immL8 off) 1.84 -%{ 1.85 +operand gsBaseIndexI2LOffset8(mRegP base, mRegI index, immL8 off) 1.86 +%{ 1.87 + predicate(UseLoongsonISA); 1.88 constraint(ALLOC_IN_RC(p_reg)); 1.89 + match(AddP (AddP base (ConvI2L index)) off); 1.90 + 1.91 op_cost(5); 1.92 - match(AddP (AddP base (ConvI2L index)) off); 1.93 - 1.94 - format %{ "[$base + $index + $off (8-bit)] @ baseIndexOffset8_convI2L" %} 1.95 + format %{ "[$base + $index + $off (8-bit)] @ gsBaseIndexI2LOffset8" %} 1.96 interface(MEMORY_INTER) %{ 1.97 base($base); 1.98 index($index); 1.99 @@ -5243,112 +5211,13 @@ 1.100 %} 1.101 %} 1.102 1.103 -// Indirect Memory Times Scale Plus Index Register Plus Offset Operand 1.104 -operand indIndexScaleOffset8(mRegP reg, immL8 off, mRegL lreg, immI2 scale) 1.105 -%{ 1.106 - constraint(ALLOC_IN_RC(p_reg)); 1.107 - match(AddP (AddP reg (LShiftL lreg scale)) off); 1.108 - 1.109 - op_cost(10); 1.110 - format %{"[$reg + $off + $lreg << $scale] @ indIndexScaleOffset8" %} 1.111 - interface(MEMORY_INTER) %{ 1.112 - base($reg); 1.113 - index($lreg); 1.114 - scale($scale); 1.115 - disp($off); 1.116 - %} 1.117 -%} 1.118 - 1.119 -operand indIndexScaleOffset8_convI2L(mRegP reg, immL8 off, mRegI ireg, immI2 scale) 1.120 -%{ 1.121 - constraint(ALLOC_IN_RC(p_reg)); 1.122 - match(AddP (AddP reg (LShiftL (ConvI2L ireg) scale)) off); 1.123 - 1.124 - op_cost(10); 1.125 - format %{"[$reg + $off + $ireg << $scale] @ indIndexScaleOffset8_convI2L" %} 1.126 - interface(MEMORY_INTER) %{ 1.127 - base($reg); 1.128 - index($ireg); 1.129 - scale($scale); 1.130 - disp($off); 1.131 - %} 1.132 -%} 1.133 - 1.134 -// [base + index<<scale + offset] 1.135 -operand basePosIndexScaleOffset8(mRegP base, mRegI index, immL8 off, immI_0_31 scale) 1.136 -%{ 1.137 - constraint(ALLOC_IN_RC(p_reg)); 1.138 - //predicate(n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); 1.139 - op_cost(10); 1.140 - match(AddP (AddP base (LShiftL (ConvI2L index) scale)) off); 1.141 - 1.142 - format %{ "[$base + $index << $scale + $off (8-bit)] @ basePosIndexScaleOffset8" %} 1.143 - interface(MEMORY_INTER) %{ 1.144 - base($base); 1.145 - index($index); 1.146 - scale($scale); 1.147 - disp($off); 1.148 - %} 1.149 -%} 1.150 - 1.151 -// Indirect Memory Times Scale Plus Index Register Plus Offset Operand 1.152 -operand indIndexScaleOffsetNarrow(mRegN reg, immL8 off, mRegL lreg, immI2 scale) 1.153 -%{ 1.154 - predicate(Universe::narrow_oop_shift() == 0); 1.155 - constraint(ALLOC_IN_RC(p_reg)); 1.156 - match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off); 1.157 - 1.158 - op_cost(10); 1.159 - format %{"[$reg + $off + $lreg << $scale] @ indIndexScaleOffsetNarrow" %} 1.160 - interface(MEMORY_INTER) %{ 1.161 - base($reg); 1.162 - index($lreg); 1.163 - scale($scale); 1.164 - disp($off); 1.165 - %} 1.166 -%} 1.167 - 1.168 -// [base + index<<scale + offset] for compressd Oops 1.169 -operand indPosIndexI2LScaleOffset8Narrow(mRegN base, mRegI index, immL8 off, immI_0_31 scale) 1.170 -%{ 1.171 - constraint(ALLOC_IN_RC(p_reg)); 1.172 - //predicate(Universe::narrow_oop_shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); 1.173 - predicate(Universe::narrow_oop_shift() == 0); 1.174 - op_cost(10); 1.175 - match(AddP (AddP (DecodeN base) (LShiftL (ConvI2L index) scale)) off); 1.176 - 1.177 - format %{ "[$base + $index << $scale + $off (8-bit)] @ indPosIndexI2LScaleOffset8Narrow" %} 1.178 - interface(MEMORY_INTER) %{ 1.179 - base($base); 1.180 - index($index); 1.181 - scale($scale); 1.182 - disp($off); 1.183 - %} 1.184 -%} 1.185 - 1.186 -//FIXME: I think it's better to limit the immI to be 16-bit at most! 1.187 -// Indirect Memory Plus Long Offset Operand 1.188 -operand indOffset32(mRegP reg, immL32 off) %{ 1.189 - constraint(ALLOC_IN_RC(p_reg)); 1.190 - op_cost(20); 1.191 - match(AddP reg off); 1.192 - 1.193 - format %{ "[$reg + $off (32-bit)] @ indOffset32" %} 1.194 - interface(MEMORY_INTER) %{ 1.195 - base($reg); 1.196 - index(0x0); /* NO_INDEX */ 1.197 - scale(0x0); 1.198 - disp($off); 1.199 - %} 1.200 -%} 1.201 - 1.202 -// Indirect Memory Plus Index Register 1.203 -operand indIndex(mRegP addr, mRegL index) %{ 1.204 +operand gsBaseIndexOffset0(mRegP addr, mRegL index) %{ 1.205 + predicate(UseLoongsonISA); 1.206 constraint(ALLOC_IN_RC(p_reg)); 1.207 match(AddP addr index); 1.208 1.209 - op_cost(20); 1.210 - format %{"[$addr + $index] @ indIndex" %} 1.211 + op_cost(10); 1.212 + format %{"[$addr + $index] @ gsBaseIndexOffset0" %} 1.213 interface(MEMORY_INTER) %{ 1.214 base($addr); 1.215 index($index); 1.216 @@ -5357,14 +5226,12 @@ 1.217 %} 1.218 %} 1.219 1.220 -operand indirectNarrowKlass(mRegN reg) 1.221 -%{ 1.222 - predicate(Universe::narrow_klass_shift() == 0); 1.223 +operand baseOffset0(mRegP reg) %{ 1.224 constraint(ALLOC_IN_RC(p_reg)); 1.225 op_cost(10); 1.226 - match(DecodeNKlass reg); 1.227 - 1.228 - format %{ "[$reg] @ indirectNarrowKlass" %} 1.229 + match(reg); 1.230 + 1.231 + format %{ "[$reg] @ baseOffset0" %} 1.232 interface(MEMORY_INTER) %{ 1.233 base($reg); 1.234 index(0x0); 1.235 @@ -5373,14 +5240,14 @@ 1.236 %} 1.237 %} 1.238 1.239 -operand indOffset8NarrowKlass(mRegN reg, immL8 off) 1.240 -%{ 1.241 - predicate(Universe::narrow_klass_shift() == 0); 1.242 +operand baseOffset16Narrow(mRegN reg, immL16 off) 1.243 +%{ 1.244 + predicate(Universe::narrow_oop_base() == 0 && Universe::narrow_oop_shift() == 0); 1.245 constraint(ALLOC_IN_RC(p_reg)); 1.246 - op_cost(10); 1.247 - match(AddP (DecodeNKlass reg) off); 1.248 - 1.249 - format %{ "[$reg + $off (8-bit)] @ indOffset8NarrowKlass" %} 1.250 + match(AddP (DecodeN reg) off); 1.251 + 1.252 + op_cost(5); 1.253 + format %{ "[$reg + $off (16-bit)] @ baseOffset16Narrow" %} 1.254 interface(MEMORY_INTER) %{ 1.255 base($reg); 1.256 index(0x0); 1.257 @@ -5389,14 +5256,46 @@ 1.258 %} 1.259 %} 1.260 1.261 -operand indOffset32NarrowKlass(mRegN reg, immL32 off) 1.262 -%{ 1.263 - predicate(Universe::narrow_klass_shift() == 0); 1.264 +operand gsBaseIndexOffset8Narrow(mRegN reg, mRegL lreg, immL8 off) 1.265 +%{ 1.266 + predicate(UseLoongsonISA && Universe::narrow_oop_base() == 0 && Universe::narrow_oop_shift() == 0); 1.267 constraint(ALLOC_IN_RC(p_reg)); 1.268 + match(AddP (AddP (DecodeN reg) lreg) off); 1.269 + 1.270 + op_cost(5); 1.271 + format %{"[$reg + $off + $lreg] @ gsBaseIndexOffset8Narrow" %} 1.272 + interface(MEMORY_INTER) %{ 1.273 + base($reg); 1.274 + index($lreg); 1.275 + scale(0x0); 1.276 + disp($off); 1.277 + %} 1.278 +%} 1.279 + 1.280 +operand baseOffset0Narrow(mRegN reg) 1.281 +%{ 1.282 + predicate(Universe::narrow_oop_base() == 0 && Universe::narrow_oop_shift() == 0); 1.283 + constraint(ALLOC_IN_RC(p_reg)); 1.284 + match(DecodeN reg); 1.285 + 1.286 op_cost(10); 1.287 + format %{ "[$reg] @ baseOffset0Narrow" %} 1.288 + interface(MEMORY_INTER) %{ 1.289 + base($reg); 1.290 + index(0x0); 1.291 + scale(0x0); 1.292 + disp(0x0); 1.293 + %} 1.294 +%} 1.295 + 1.296 +operand baseOffset16NarrowKlass(mRegN reg, immL16 off) 1.297 +%{ 1.298 + predicate(Universe::narrow_klass_base() == 0 && Universe::narrow_klass_shift() == 0); 1.299 + constraint(ALLOC_IN_RC(p_reg)); 1.300 match(AddP (DecodeNKlass reg) off); 1.301 1.302 - format %{ "[$reg + $off (32-bit)] @ indOffset32NarrowKlass" %} 1.303 + op_cost(5); 1.304 + format %{ "[$reg + $off (16-bit)] @ baseOffset16NarrowKlass" %} 1.305 interface(MEMORY_INTER) %{ 1.306 base($reg); 1.307 index(0x0); 1.308 @@ -5405,14 +5304,30 @@ 1.309 %} 1.310 %} 1.311 1.312 -operand indIndexOffsetNarrowKlass(mRegN reg, mRegL lreg, immL32 off) 1.313 -%{ 1.314 - predicate(Universe::narrow_klass_shift() == 0); 1.315 +operand baseOffset0NarrowKlass(mRegN reg) 1.316 +%{ 1.317 + predicate(Universe::narrow_klass_base() == 0 && Universe::narrow_klass_shift() == 0); 1.318 + constraint(ALLOC_IN_RC(p_reg)); 1.319 + match(DecodeNKlass reg); 1.320 + 1.321 + op_cost(10); 1.322 + format %{ "[$reg] @ baseOffset0NarrowKlass" %} 1.323 + interface(MEMORY_INTER) %{ 1.324 + base($reg); 1.325 + index(0x0); 1.326 + scale(0x0); 1.327 + disp(0x0); 1.328 + %} 1.329 +%} 1.330 + 1.331 +operand gsBaseIndexOffset8NarrowKlass(mRegN reg, mRegL lreg, immL8 off) 1.332 +%{ 1.333 + predicate(UseLoongsonISA && Universe::narrow_klass_base() == 0 && Universe::narrow_klass_shift() == 0); 1.334 constraint(ALLOC_IN_RC(p_reg)); 1.335 match(AddP (AddP (DecodeNKlass reg) lreg) off); 1.336 1.337 - op_cost(10); 1.338 - format %{"[$reg + $off + $lreg] @ indIndexOffsetNarrowKlass" %} 1.339 + op_cost(5); 1.340 + format %{"[$reg + $off + $lreg] @ gsBaseIndexOffset8NarrowKlass" %} 1.341 interface(MEMORY_INTER) %{ 1.342 base($reg); 1.343 index($lreg); 1.344 @@ -5421,14 +5336,14 @@ 1.345 %} 1.346 %} 1.347 1.348 -operand indIndexNarrowKlass(mRegN reg, mRegL lreg) 1.349 -%{ 1.350 - predicate(Universe::narrow_klass_shift() == 0); 1.351 +operand gsBaseIndexOffset0NarrowKlass(mRegN reg, mRegL lreg) 1.352 +%{ 1.353 + predicate(UseLoongsonISA && Universe::narrow_klass_base() == 0 && Universe::narrow_klass_shift() == 0); 1.354 constraint(ALLOC_IN_RC(p_reg)); 1.355 match(AddP (DecodeNKlass reg) lreg); 1.356 1.357 op_cost(10); 1.358 - format %{"[$reg + $lreg] @ indIndexNarrowKlass" %} 1.359 + format %{"[$reg + $lreg] @ gsBaseIndexOffset0NarrowKlass" %} 1.360 interface(MEMORY_INTER) %{ 1.361 base($reg); 1.362 index($lreg); 1.363 @@ -5437,100 +5352,26 @@ 1.364 %} 1.365 %} 1.366 1.367 -// Indirect Memory Operand 1.368 -operand indirectNarrow(mRegN reg) 1.369 -%{ 1.370 - predicate(Universe::narrow_oop_shift() == 0); 1.371 - constraint(ALLOC_IN_RC(p_reg)); 1.372 - op_cost(10); 1.373 - match(DecodeN reg); 1.374 - 1.375 - format %{ "[$reg] @ indirectNarrow" %} 1.376 - interface(MEMORY_INTER) %{ 1.377 - base($reg); 1.378 - index(0x0); 1.379 - scale(0x0); 1.380 - disp(0x0); 1.381 - %} 1.382 -%} 1.383 - 1.384 -// Indirect Memory Plus Short Offset Operand 1.385 -operand indOffset8Narrow(mRegN reg, immL8 off) 1.386 -%{ 1.387 - predicate(Universe::narrow_oop_shift() == 0); 1.388 - constraint(ALLOC_IN_RC(p_reg)); 1.389 - op_cost(10); 1.390 - match(AddP (DecodeN reg) off); 1.391 - 1.392 - format %{ "[$reg + $off (8-bit)] @ indOffset8Narrow" %} 1.393 - interface(MEMORY_INTER) %{ 1.394 - base($reg); 1.395 - index(0x0); 1.396 - scale(0x0); 1.397 - disp($off); 1.398 - %} 1.399 -%} 1.400 - 1.401 -// Indirect Memory Plus Index Register Plus Offset Operand 1.402 -operand indIndexOffset8Narrow(mRegN reg, mRegL lreg, immL8 off) 1.403 -%{ 1.404 - predicate(Universe::narrow_oop_shift() == 0); 1.405 - constraint(ALLOC_IN_RC(p_reg)); 1.406 - match(AddP (AddP (DecodeN reg) lreg) off); 1.407 - 1.408 - op_cost(10); 1.409 - format %{"[$reg + $off + $lreg] @ indIndexOffset8Narrow" %} 1.410 - interface(MEMORY_INTER) %{ 1.411 - base($reg); 1.412 - index($lreg); 1.413 - scale(0x0); 1.414 - disp($off); 1.415 - %} 1.416 -%} 1.417 - 1.418 -//----------Load Long Memory Operands------------------------------------------ 1.419 -// The load-long idiom will use it's address expression again after loading 1.420 -// the first word of the long. If the load-long destination overlaps with 1.421 -// registers used in the addressing expression, the 2nd half will be loaded 1.422 -// from a clobbered address. Fix this by requiring that load-long use 1.423 -// address registers that do not overlap with the load-long target. 1.424 - 1.425 -// load-long support 1.426 -operand load_long_RegP() %{ 1.427 - constraint(ALLOC_IN_RC(p_reg)); 1.428 - match(RegP); 1.429 - match(mRegP); 1.430 - op_cost(100); 1.431 - format %{ %} 1.432 - interface(REG_INTER); 1.433 -%} 1.434 - 1.435 -// Indirect Memory Operand Long 1.436 -operand load_long_indirect(load_long_RegP reg) %{ 1.437 - constraint(ALLOC_IN_RC(p_reg)); 1.438 - match(reg); 1.439 - 1.440 - format %{ "[$reg]" %} 1.441 - interface(MEMORY_INTER) %{ 1.442 - base($reg); 1.443 - index(0x0); 1.444 - scale(0x0); 1.445 - disp(0x0); 1.446 - %} 1.447 -%} 1.448 - 1.449 -// Indirect Memory Plus Long Offset Operand 1.450 -operand load_long_indOffset32(load_long_RegP reg, immL32 off) %{ 1.451 - match(AddP reg off); 1.452 - 1.453 - format %{ "[$reg + $off]" %} 1.454 - interface(MEMORY_INTER) %{ 1.455 - base($reg); 1.456 - index(0x0); 1.457 - scale(0x0); 1.458 - disp($off); 1.459 - %} 1.460 -%} 1.461 + 1.462 +//------------------------OPERAND CLASSES-------------------------------------- 1.463 +opclass memory( 1.464 + baseOffset16, 1.465 + gsBaseIndexOffset8, 1.466 + gsBaseIndexI2LOffset8, 1.467 + gsBaseIndexOffset0, 1.468 + baseOffset0, 1.469 + 1.470 + baseOffset16Narrow, 1.471 + gsBaseIndexOffset8Narrow, 1.472 + baseOffset0Narrow, 1.473 + 1.474 + baseOffset16NarrowKlass, 1.475 + baseOffset0NarrowKlass, 1.476 + gsBaseIndexOffset8NarrowKlass, 1.477 + gsBaseIndexOffset0NarrowKlass 1.478 +); 1.479 + 1.480 + 1.481 1.482 //----------Conditional Branch Operands---------------------------------------- 1.483 // Comparison Op - This is the operation of the comparison, and is limited to 1.484 @@ -5584,55 +5425,6 @@ 1.485 %} 1.486 %} 1.487 1.488 -/* 1.489 -// Comparison Code, unsigned compare. Used by FP also, with 1.490 -// C2 (unordered) turned into GT or LT already. The other bits 1.491 -// C0 and C3 are turned into Carry & Zero flags. 1.492 -operand cmpOpU() %{ 1.493 - match(Bool); 1.494 - 1.495 - format %{ "" %} 1.496 - interface(COND_INTER) %{ 1.497 - equal(0x4); 1.498 - not_equal(0x5); 1.499 - less(0x2); 1.500 - greater_equal(0x3); 1.501 - less_equal(0x6); 1.502 - greater(0x7); 1.503 - %} 1.504 -%} 1.505 -*/ 1.506 -/* 1.507 -// Comparison Code for FP conditional move 1.508 -operand cmpOp_fcmov() %{ 1.509 - match(Bool); 1.510 - 1.511 - format %{ "" %} 1.512 - interface(COND_INTER) %{ 1.513 - equal (0x01); 1.514 - not_equal (0x02); 1.515 - greater (0x03); 1.516 - greater_equal(0x04); 1.517 - less (0x05); 1.518 - less_equal (0x06); 1.519 - %} 1.520 -%} 1.521 - 1.522 -// Comparision Code used in long compares 1.523 -operand cmpOp_commute() %{ 1.524 - match(Bool); 1.525 - 1.526 - format %{ "" %} 1.527 - interface(COND_INTER) %{ 1.528 - equal(0x4); 1.529 - not_equal(0x5); 1.530 - less(0xF); 1.531 - greater_equal(0xE); 1.532 - less_equal(0xD); 1.533 - greater(0xC); 1.534 - %} 1.535 -%} 1.536 -*/ 1.537 1.538 //----------Special Memory Operands-------------------------------------------- 1.539 // Stack Slot Operand - This operand is used for loading and storing temporary 1.540 @@ -5702,12 +5494,6 @@ 1.541 disp($reg); // Stack Offset 1.542 %} 1.543 %} 1.544 - 1.545 - 1.546 -//------------------------OPERAND CLASSES-------------------------------------- 1.547 -//opclass memory( direct, indirect, indOffset16, indOffset32, indOffset32X, indIndexOffset ); 1.548 -opclass memory( indirect, indirectNarrow, indOffset8, indOffset32, indIndex, indIndexScale, load_long_indirect, load_long_indOffset32, baseIndexOffset8, baseIndexOffset8_convI2L, indIndexScaleOffset8, indIndexScaleOffset8_convI2L, basePosIndexScaleOffset8, indIndexScaleOffsetNarrow, indPosIndexI2LScaleOffset8Narrow, indOffset8Narrow, indIndexOffset8Narrow); 1.549 - 1.550 1.551 //----------PIPELINE----------------------------------------------------------- 1.552 // Rules which define the behavior of the target architectures pipeline. 1.553 @@ -12779,72 +12565,6 @@ 1.554 ins_pipe( pipe_jump ); 1.555 %} 1.556 1.557 -instruct leaP8Narrow(mRegP dst, indOffset8Narrow mem) 1.558 -%{ 1.559 - predicate(Universe::narrow_oop_shift() == 0); 1.560 - match(Set dst mem); 1.561 - 1.562 - ins_cost(110); 1.563 - format %{ "leaq $dst, $mem\t# ptr off8narrow @ leaP8Narrow" %} 1.564 - ins_encode %{ 1.565 - Register dst = $dst$$Register; 1.566 - Register base = as_Register($mem$$base); 1.567 - int disp = $mem$$disp; 1.568 - 1.569 - __ daddiu(dst, base, disp); 1.570 - %} 1.571 - ins_pipe( ialu_regI_imm16 ); 1.572 -%} 1.573 - 1.574 -instruct leaPPosIdxScaleOff8(mRegP dst, basePosIndexScaleOffset8 mem) 1.575 -%{ 1.576 - match(Set dst mem); 1.577 - 1.578 - ins_cost(110); 1.579 - format %{ "leaq $dst, $mem\t# @ PosIdxScaleOff8" %} 1.580 - ins_encode %{ 1.581 - Register dst = $dst$$Register; 1.582 - Register base = as_Register($mem$$base); 1.583 - Register index = as_Register($mem$$index); 1.584 - int scale = $mem$$scale; 1.585 - int disp = $mem$$disp; 1.586 - 1.587 - if (scale == 0) { 1.588 - __ daddu(AT, base, index); 1.589 - __ daddiu(dst, AT, disp); 1.590 - } else { 1.591 - __ dsll(AT, index, scale); 1.592 - __ daddu(AT, base, AT); 1.593 - __ daddiu(dst, AT, disp); 1.594 - } 1.595 - %} 1.596 - 1.597 - ins_pipe( ialu_regI_imm16 ); 1.598 -%} 1.599 - 1.600 -instruct leaPIdxScale(mRegP dst, indIndexScale mem) 1.601 -%{ 1.602 - match(Set dst mem); 1.603 - 1.604 - ins_cost(110); 1.605 - format %{ "leaq $dst, $mem\t# @ leaPIdxScale" %} 1.606 - ins_encode %{ 1.607 - Register dst = $dst$$Register; 1.608 - Register base = as_Register($mem$$base); 1.609 - Register index = as_Register($mem$$index); 1.610 - int scale = $mem$$scale; 1.611 - 1.612 - if (scale == 0) { 1.613 - __ daddu(dst, base, index); 1.614 - } else { 1.615 - __ dsll(AT, index, scale); 1.616 - __ daddu(dst, base, AT); 1.617 - } 1.618 - %} 1.619 - 1.620 - ins_pipe( ialu_regI_imm16 ); 1.621 -%} 1.622 - 1.623 // Jump Direct Conditional - Label defines a relative address from Jcc+1 1.624 instruct jmpLoopEnd(cmpOp cop, mRegI src1, mRegI src2, label labl) %{ 1.625 match(CountedLoopEnd cop (CmpI src1 src2));