1.1 --- a/src/cpu/x86/vm/x86_64.ad Wed Mar 11 14:16:13 2009 -0700 1.2 +++ b/src/cpu/x86/vm/x86_64.ad Thu Mar 12 10:37:46 2009 -0700 1.3 @@ -326,7 +326,6 @@ 1.4 R9, R9_H, 1.5 R10, R10_H, 1.6 R11, R11_H, 1.7 - R12, R12_H, 1.8 R13, R13_H, 1.9 R14, R14_H); 1.10 1.11 @@ -340,7 +339,6 @@ 1.12 R9, R9_H, 1.13 R10, R10_H, 1.14 R11, R11_H, 1.15 - R12, R12_H, 1.16 R13, R13_H, 1.17 R14, R14_H); 1.18 1.19 @@ -354,7 +352,6 @@ 1.20 R9, R9_H, 1.21 R10, R10_H, 1.22 R11, R11_H, 1.23 - R12, R12_H, 1.24 R13, R13_H, 1.25 R14, R14_H); 1.26 1.27 @@ -444,9 +441,6 @@ 1.28 // Singleton class for RDX long register 1.29 reg_class long_rdx_reg(RDX, RDX_H); 1.30 1.31 -// Singleton class for R12 long register 1.32 -reg_class long_r12_reg(R12, R12_H); 1.33 - 1.34 // Class for all int registers (except RSP) 1.35 reg_class int_reg(RAX, 1.36 RDX, 1.37 @@ -1842,7 +1836,9 @@ 1.38 { 1.39 if (UseCompressedOops) { 1.40 st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes() #%d]\t", oopDesc::klass_offset_in_bytes()); 1.41 - st->print_cr("leaq rscratch1, [r12_heapbase, r, Address::times_8, 0]"); 1.42 + if (Universe::narrow_oop_shift() != 0) { 1.43 + st->print_cr("leaq rscratch1, [r12_heapbase, r, Address::times_8, 0]"); 1.44 + } 1.45 st->print_cr("cmpq rax, rscratch1\t # Inline cache check"); 1.46 } else { 1.47 st->print_cr("cmpq rax, [j_rarg0 + oopDesc::klass_offset_in_bytes() #%d]\t" 1.48 @@ -1891,7 +1887,11 @@ 1.49 uint MachUEPNode::size(PhaseRegAlloc* ra_) const 1.50 { 1.51 if (UseCompressedOops) { 1.52 - return OptoBreakpoint ? 19 : 20; 1.53 + if (Universe::narrow_oop_shift() == 0) { 1.54 + return OptoBreakpoint ? 15 : 16; 1.55 + } else { 1.56 + return OptoBreakpoint ? 19 : 20; 1.57 + } 1.58 } else { 1.59 return OptoBreakpoint ? 11 : 12; 1.60 } 1.61 @@ -2593,21 +2593,19 @@ 1.62 __ movl(Rrcx, Address(Rrdi, arrayOopDesc::length_offset_in_bytes())); 1.63 __ addptr(Rrdi, arrayOopDesc::base_offset_in_bytes(T_OBJECT)); 1.64 if (UseCompressedOops) { 1.65 + __ push(Rrax); 1.66 __ encode_heap_oop(Rrax); 1.67 __ repne_scanl(); 1.68 - __ jcc(Assembler::notEqual, cmiss); 1.69 - __ decode_heap_oop(Rrax); 1.70 + __ pop(Rrax); 1.71 + __ jccb(Assembler::notEqual, miss); 1.72 __ movptr(Address(Rrsi, 1.73 sizeof(oopDesc) + 1.74 Klass::secondary_super_cache_offset_in_bytes()), 1.75 Rrax); 1.76 __ jmp(hit); 1.77 - __ bind(cmiss); 1.78 - __ decode_heap_oop(Rrax); 1.79 - __ jmp(miss); 1.80 } else { 1.81 __ repne_scan(); 1.82 - __ jcc(Assembler::notEqual, miss); 1.83 + __ jccb(Assembler::notEqual, miss); 1.84 __ movptr(Address(Rrsi, 1.85 sizeof(oopDesc) + 1.86 Klass::secondary_super_cache_offset_in_bytes()), 1.87 @@ -4906,15 +4904,6 @@ 1.88 interface(REG_INTER); 1.89 %} 1.90 1.91 - 1.92 -operand r12RegL() %{ 1.93 - constraint(ALLOC_IN_RC(long_r12_reg)); 1.94 - match(RegL); 1.95 - 1.96 - format %{ %} 1.97 - interface(REG_INTER); 1.98 -%} 1.99 - 1.100 operand rRegN() %{ 1.101 constraint(ALLOC_IN_RC(int_reg)); 1.102 match(RegN); 1.103 @@ -5289,21 +5278,6 @@ 1.104 %} 1.105 %} 1.106 1.107 -// Indirect Narrow Oop Plus Offset Operand 1.108 -operand indNarrowOopOffset(rRegN src, immL32 off) %{ 1.109 - constraint(ALLOC_IN_RC(ptr_reg)); 1.110 - match(AddP (DecodeN src) off); 1.111 - 1.112 - op_cost(10); 1.113 - format %{"[R12 + $src << 3 + $off] (compressed oop addressing)" %} 1.114 - interface(MEMORY_INTER) %{ 1.115 - base(0xc); // R12 1.116 - index($src); 1.117 - scale(0x3); 1.118 - disp($off); 1.119 - %} 1.120 -%} 1.121 - 1.122 // Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand 1.123 operand indPosIndexScaleOffset(any_RegP reg, immL32 off, rRegI idx, immI2 scale) 1.124 %{ 1.125 @@ -5321,6 +5295,158 @@ 1.126 %} 1.127 %} 1.128 1.129 +// Indirect Narrow Oop Plus Offset Operand 1.130 +// Note: x86 architecture doesn't support "scale * index + offset" without a base 1.131 +// we can't free r12 even with Universe::narrow_oop_base() == NULL. 1.132 +operand indCompressedOopOffset(rRegN reg, immL32 off) %{ 1.133 + predicate(UseCompressedOops && (Universe::narrow_oop_shift() != 0)); 1.134 + constraint(ALLOC_IN_RC(ptr_reg)); 1.135 + match(AddP (DecodeN reg) off); 1.136 + 1.137 + op_cost(10); 1.138 + format %{"[R12 + $reg << 3 + $off] (compressed oop addressing)" %} 1.139 + interface(MEMORY_INTER) %{ 1.140 + base(0xc); // R12 1.141 + index($reg); 1.142 + scale(0x3); 1.143 + disp($off); 1.144 + %} 1.145 +%} 1.146 + 1.147 +// Indirect Memory Operand 1.148 +operand indirectNarrow(rRegN reg) 1.149 +%{ 1.150 + predicate(Universe::narrow_oop_shift() == 0); 1.151 + constraint(ALLOC_IN_RC(ptr_reg)); 1.152 + match(DecodeN reg); 1.153 + 1.154 + format %{ "[$reg]" %} 1.155 + interface(MEMORY_INTER) %{ 1.156 + base($reg); 1.157 + index(0x4); 1.158 + scale(0x0); 1.159 + disp(0x0); 1.160 + %} 1.161 +%} 1.162 + 1.163 +// Indirect Memory Plus Short Offset Operand 1.164 +operand indOffset8Narrow(rRegN reg, immL8 off) 1.165 +%{ 1.166 + predicate(Universe::narrow_oop_shift() == 0); 1.167 + constraint(ALLOC_IN_RC(ptr_reg)); 1.168 + match(AddP (DecodeN reg) off); 1.169 + 1.170 + format %{ "[$reg + $off (8-bit)]" %} 1.171 + interface(MEMORY_INTER) %{ 1.172 + base($reg); 1.173 + index(0x4); 1.174 + scale(0x0); 1.175 + disp($off); 1.176 + %} 1.177 +%} 1.178 + 1.179 +// Indirect Memory Plus Long Offset Operand 1.180 +operand indOffset32Narrow(rRegN reg, immL32 off) 1.181 +%{ 1.182 + predicate(Universe::narrow_oop_shift() == 0); 1.183 + constraint(ALLOC_IN_RC(ptr_reg)); 1.184 + match(AddP (DecodeN reg) off); 1.185 + 1.186 + format %{ "[$reg + $off (32-bit)]" %} 1.187 + interface(MEMORY_INTER) %{ 1.188 + base($reg); 1.189 + index(0x4); 1.190 + scale(0x0); 1.191 + disp($off); 1.192 + %} 1.193 +%} 1.194 + 1.195 +// Indirect Memory Plus Index Register Plus Offset Operand 1.196 +operand indIndexOffsetNarrow(rRegN reg, rRegL lreg, immL32 off) 1.197 +%{ 1.198 + predicate(Universe::narrow_oop_shift() == 0); 1.199 + constraint(ALLOC_IN_RC(ptr_reg)); 1.200 + match(AddP (AddP (DecodeN reg) lreg) off); 1.201 + 1.202 + op_cost(10); 1.203 + format %{"[$reg + $off + $lreg]" %} 1.204 + interface(MEMORY_INTER) %{ 1.205 + base($reg); 1.206 + index($lreg); 1.207 + scale(0x0); 1.208 + disp($off); 1.209 + %} 1.210 +%} 1.211 + 1.212 +// Indirect Memory Plus Index Register Plus Offset Operand 1.213 +operand indIndexNarrow(rRegN reg, rRegL lreg) 1.214 +%{ 1.215 + predicate(Universe::narrow_oop_shift() == 0); 1.216 + constraint(ALLOC_IN_RC(ptr_reg)); 1.217 + match(AddP (DecodeN reg) lreg); 1.218 + 1.219 + op_cost(10); 1.220 + format %{"[$reg + $lreg]" %} 1.221 + interface(MEMORY_INTER) %{ 1.222 + base($reg); 1.223 + index($lreg); 1.224 + scale(0x0); 1.225 + disp(0x0); 1.226 + %} 1.227 +%} 1.228 + 1.229 +// Indirect Memory Times Scale Plus Index Register 1.230 +operand indIndexScaleNarrow(rRegN reg, rRegL lreg, immI2 scale) 1.231 +%{ 1.232 + predicate(Universe::narrow_oop_shift() == 0); 1.233 + constraint(ALLOC_IN_RC(ptr_reg)); 1.234 + match(AddP (DecodeN reg) (LShiftL lreg scale)); 1.235 + 1.236 + op_cost(10); 1.237 + format %{"[$reg + $lreg << $scale]" %} 1.238 + interface(MEMORY_INTER) %{ 1.239 + base($reg); 1.240 + index($lreg); 1.241 + scale($scale); 1.242 + disp(0x0); 1.243 + %} 1.244 +%} 1.245 + 1.246 +// Indirect Memory Times Scale Plus Index Register Plus Offset Operand 1.247 +operand indIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegL lreg, immI2 scale) 1.248 +%{ 1.249 + predicate(Universe::narrow_oop_shift() == 0); 1.250 + constraint(ALLOC_IN_RC(ptr_reg)); 1.251 + match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off); 1.252 + 1.253 + op_cost(10); 1.254 + format %{"[$reg + $off + $lreg << $scale]" %} 1.255 + interface(MEMORY_INTER) %{ 1.256 + base($reg); 1.257 + index($lreg); 1.258 + scale($scale); 1.259 + disp($off); 1.260 + %} 1.261 +%} 1.262 + 1.263 +// Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand 1.264 +operand indPosIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegI idx, immI2 scale) 1.265 +%{ 1.266 + constraint(ALLOC_IN_RC(ptr_reg)); 1.267 + predicate(Universe::narrow_oop_shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); 1.268 + match(AddP (AddP (DecodeN reg) (LShiftL (ConvI2L idx) scale)) off); 1.269 + 1.270 + op_cost(10); 1.271 + format %{"[$reg + $off + $idx << $scale]" %} 1.272 + interface(MEMORY_INTER) %{ 1.273 + base($reg); 1.274 + index($idx); 1.275 + scale($scale); 1.276 + disp($off); 1.277 + %} 1.278 +%} 1.279 + 1.280 + 1.281 //----------Special Memory Operands-------------------------------------------- 1.282 // Stack Slot Operand - This operand is used for loading and storing temporary 1.283 // values on the stack where a match requires a value to 1.284 @@ -5488,7 +5614,10 @@ 1.285 1.286 opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex, 1.287 indIndexScale, indIndexScaleOffset, indPosIndexScaleOffset, 1.288 - indNarrowOopOffset); 1.289 + indCompressedOopOffset, 1.290 + indirectNarrow, indOffset8Narrow, indOffset32Narrow, 1.291 + indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow, 1.292 + indIndexScaleOffsetNarrow, indPosIndexScaleOffsetNarrow); 1.293 1.294 //----------PIPELINE----------------------------------------------------------- 1.295 // Rules which define the behavior of the target architectures pipeline. 1.296 @@ -6234,9 +6363,7 @@ 1.297 ins_cost(125); // XXX 1.298 format %{ "movl $dst, $mem\t# compressed ptr" %} 1.299 ins_encode %{ 1.300 - Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.301 - Register dst = as_Register($dst$$reg); 1.302 - __ movl(dst, addr); 1.303 + __ movl($dst$$Register, $mem$$Address); 1.304 %} 1.305 ins_pipe(ialu_reg_mem); // XXX 1.306 %} 1.307 @@ -6262,9 +6389,7 @@ 1.308 ins_cost(125); // XXX 1.309 format %{ "movl $dst, $mem\t# compressed klass ptr" %} 1.310 ins_encode %{ 1.311 - Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.312 - Register dst = as_Register($dst$$reg); 1.313 - __ movl(dst, addr); 1.314 + __ movl($dst$$Register, $mem$$Address); 1.315 %} 1.316 ins_pipe(ialu_reg_mem); // XXX 1.317 %} 1.318 @@ -6418,6 +6543,102 @@ 1.319 ins_pipe(ialu_reg_reg_fat); 1.320 %} 1.321 1.322 +instruct leaPPosIdxScaleOff(rRegP dst, indPosIndexScaleOffset mem) 1.323 +%{ 1.324 + match(Set dst mem); 1.325 + 1.326 + ins_cost(110); 1.327 + format %{ "leaq $dst, $mem\t# ptr posidxscaleoff" %} 1.328 + opcode(0x8D); 1.329 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.330 + ins_pipe(ialu_reg_reg_fat); 1.331 +%} 1.332 + 1.333 +// Load Effective Address which uses Narrow (32-bits) oop 1.334 +instruct leaPCompressedOopOffset(rRegP dst, indCompressedOopOffset mem) 1.335 +%{ 1.336 + predicate(UseCompressedOops && (Universe::narrow_oop_shift() != 0)); 1.337 + match(Set dst mem); 1.338 + 1.339 + ins_cost(110); 1.340 + format %{ "leaq $dst, $mem\t# ptr compressedoopoff32" %} 1.341 + opcode(0x8D); 1.342 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.343 + ins_pipe(ialu_reg_reg_fat); 1.344 +%} 1.345 + 1.346 +instruct leaP8Narrow(rRegP dst, indOffset8Narrow mem) 1.347 +%{ 1.348 + predicate(Universe::narrow_oop_shift() == 0); 1.349 + match(Set dst mem); 1.350 + 1.351 + ins_cost(110); // XXX 1.352 + format %{ "leaq $dst, $mem\t# ptr off8narrow" %} 1.353 + opcode(0x8D); 1.354 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.355 + ins_pipe(ialu_reg_reg_fat); 1.356 +%} 1.357 + 1.358 +instruct leaP32Narrow(rRegP dst, indOffset32Narrow mem) 1.359 +%{ 1.360 + predicate(Universe::narrow_oop_shift() == 0); 1.361 + match(Set dst mem); 1.362 + 1.363 + ins_cost(110); 1.364 + format %{ "leaq $dst, $mem\t# ptr off32narrow" %} 1.365 + opcode(0x8D); 1.366 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.367 + ins_pipe(ialu_reg_reg_fat); 1.368 +%} 1.369 + 1.370 +instruct leaPIdxOffNarrow(rRegP dst, indIndexOffsetNarrow mem) 1.371 +%{ 1.372 + predicate(Universe::narrow_oop_shift() == 0); 1.373 + match(Set dst mem); 1.374 + 1.375 + ins_cost(110); 1.376 + format %{ "leaq $dst, $mem\t# ptr idxoffnarrow" %} 1.377 + opcode(0x8D); 1.378 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.379 + ins_pipe(ialu_reg_reg_fat); 1.380 +%} 1.381 + 1.382 +instruct leaPIdxScaleNarrow(rRegP dst, indIndexScaleNarrow mem) 1.383 +%{ 1.384 + predicate(Universe::narrow_oop_shift() == 0); 1.385 + match(Set dst mem); 1.386 + 1.387 + ins_cost(110); 1.388 + format %{ "leaq $dst, $mem\t# ptr idxscalenarrow" %} 1.389 + opcode(0x8D); 1.390 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.391 + ins_pipe(ialu_reg_reg_fat); 1.392 +%} 1.393 + 1.394 +instruct leaPIdxScaleOffNarrow(rRegP dst, indIndexScaleOffsetNarrow mem) 1.395 +%{ 1.396 + predicate(Universe::narrow_oop_shift() == 0); 1.397 + match(Set dst mem); 1.398 + 1.399 + ins_cost(110); 1.400 + format %{ "leaq $dst, $mem\t# ptr idxscaleoffnarrow" %} 1.401 + opcode(0x8D); 1.402 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.403 + ins_pipe(ialu_reg_reg_fat); 1.404 +%} 1.405 + 1.406 +instruct leaPPosIdxScaleOffNarrow(rRegP dst, indPosIndexScaleOffsetNarrow mem) 1.407 +%{ 1.408 + predicate(Universe::narrow_oop_shift() == 0); 1.409 + match(Set dst mem); 1.410 + 1.411 + ins_cost(110); 1.412 + format %{ "leaq $dst, $mem\t# ptr posidxscaleoffnarrow" %} 1.413 + opcode(0x8D); 1.414 + ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 1.415 + ins_pipe(ialu_reg_reg_fat); 1.416 +%} 1.417 + 1.418 instruct loadConI(rRegI dst, immI src) 1.419 %{ 1.420 match(Set dst src); 1.421 @@ -6528,8 +6749,7 @@ 1.422 effect(KILL cr); 1.423 format %{ "xorq $dst, $src\t# compressed NULL ptr" %} 1.424 ins_encode %{ 1.425 - Register dst = $dst$$Register; 1.426 - __ xorq(dst, dst); 1.427 + __ xorq($dst$$Register, $dst$$Register); 1.428 %} 1.429 ins_pipe(ialu_reg); 1.430 %} 1.431 @@ -6541,11 +6761,10 @@ 1.432 format %{ "movl $dst, $src\t# compressed ptr" %} 1.433 ins_encode %{ 1.434 address con = (address)$src$$constant; 1.435 - Register dst = $dst$$Register; 1.436 if (con == NULL) { 1.437 ShouldNotReachHere(); 1.438 } else { 1.439 - __ set_narrow_oop(dst, (jobject)$src$$constant); 1.440 + __ set_narrow_oop($dst$$Register, (jobject)$src$$constant); 1.441 } 1.442 %} 1.443 ins_pipe(ialu_reg_fat); // XXX 1.444 @@ -6794,12 +7013,25 @@ 1.445 ins_pipe(ialu_mem_reg); 1.446 %} 1.447 1.448 +instruct storeImmP0(memory mem, immP0 zero) 1.449 +%{ 1.450 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.451 + match(Set mem (StoreP mem zero)); 1.452 + 1.453 + ins_cost(125); // XXX 1.454 + format %{ "movq $mem, R12\t# ptr (R12_heapbase==0)" %} 1.455 + ins_encode %{ 1.456 + __ movq($mem$$Address, r12); 1.457 + %} 1.458 + ins_pipe(ialu_mem_reg); 1.459 +%} 1.460 + 1.461 // Store NULL Pointer, mark word, or other simple pointer constant. 1.462 instruct storeImmP(memory mem, immP31 src) 1.463 %{ 1.464 match(Set mem (StoreP mem src)); 1.465 1.466 - ins_cost(125); // XXX 1.467 + ins_cost(150); // XXX 1.468 format %{ "movq $mem, $src\t# ptr" %} 1.469 opcode(0xC7); /* C7 /0 */ 1.470 ins_encode(REX_mem_wide(mem), OpcP, RM_opc_mem(0x00, mem), Con32(src)); 1.471 @@ -6814,14 +7046,55 @@ 1.472 ins_cost(125); // XXX 1.473 format %{ "movl $mem, $src\t# compressed ptr" %} 1.474 ins_encode %{ 1.475 - Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.476 - Register src = as_Register($src$$reg); 1.477 - __ movl(addr, src); 1.478 + __ movl($mem$$Address, $src$$Register); 1.479 %} 1.480 ins_pipe(ialu_mem_reg); 1.481 %} 1.482 1.483 +instruct storeImmN0(memory mem, immN0 zero) 1.484 +%{ 1.485 + predicate(Universe::narrow_oop_base() == NULL); 1.486 + match(Set mem (StoreN mem zero)); 1.487 + 1.488 + ins_cost(125); // XXX 1.489 + format %{ "movl $mem, R12\t# compressed ptr (R12_heapbase==0)" %} 1.490 + ins_encode %{ 1.491 + __ movl($mem$$Address, r12); 1.492 + %} 1.493 + ins_pipe(ialu_mem_reg); 1.494 +%} 1.495 + 1.496 +instruct storeImmN(memory mem, immN src) 1.497 +%{ 1.498 + match(Set mem (StoreN mem src)); 1.499 + 1.500 + ins_cost(150); // XXX 1.501 + format %{ "movl $mem, $src\t# compressed ptr" %} 1.502 + ins_encode %{ 1.503 + address con = (address)$src$$constant; 1.504 + if (con == NULL) { 1.505 + __ movl($mem$$Address, (int32_t)0); 1.506 + } else { 1.507 + __ set_narrow_oop($mem$$Address, (jobject)$src$$constant); 1.508 + } 1.509 + %} 1.510 + ins_pipe(ialu_mem_imm); 1.511 +%} 1.512 + 1.513 // Store Integer Immediate 1.514 +instruct storeImmI0(memory mem, immI0 zero) 1.515 +%{ 1.516 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.517 + match(Set mem (StoreI mem zero)); 1.518 + 1.519 + ins_cost(125); // XXX 1.520 + format %{ "movl $mem, R12\t# int (R12_heapbase==0)" %} 1.521 + ins_encode %{ 1.522 + __ movl($mem$$Address, r12); 1.523 + %} 1.524 + ins_pipe(ialu_mem_reg); 1.525 +%} 1.526 + 1.527 instruct storeImmI(memory mem, immI src) 1.528 %{ 1.529 match(Set mem (StoreI mem src)); 1.530 @@ -6834,6 +7107,19 @@ 1.531 %} 1.532 1.533 // Store Long Immediate 1.534 +instruct storeImmL0(memory mem, immL0 zero) 1.535 +%{ 1.536 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.537 + match(Set mem (StoreL mem zero)); 1.538 + 1.539 + ins_cost(125); // XXX 1.540 + format %{ "movq $mem, R12\t# long (R12_heapbase==0)" %} 1.541 + ins_encode %{ 1.542 + __ movq($mem$$Address, r12); 1.543 + %} 1.544 + ins_pipe(ialu_mem_reg); 1.545 +%} 1.546 + 1.547 instruct storeImmL(memory mem, immL32 src) 1.548 %{ 1.549 match(Set mem (StoreL mem src)); 1.550 @@ -6846,6 +7132,19 @@ 1.551 %} 1.552 1.553 // Store Short/Char Immediate 1.554 +instruct storeImmC0(memory mem, immI0 zero) 1.555 +%{ 1.556 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.557 + match(Set mem (StoreC mem zero)); 1.558 + 1.559 + ins_cost(125); // XXX 1.560 + format %{ "movw $mem, R12\t# short/char (R12_heapbase==0)" %} 1.561 + ins_encode %{ 1.562 + __ movw($mem$$Address, r12); 1.563 + %} 1.564 + ins_pipe(ialu_mem_reg); 1.565 +%} 1.566 + 1.567 instruct storeImmI16(memory mem, immI16 src) 1.568 %{ 1.569 predicate(UseStoreImmI16); 1.570 @@ -6859,6 +7158,19 @@ 1.571 %} 1.572 1.573 // Store Byte Immediate 1.574 +instruct storeImmB0(memory mem, immI0 zero) 1.575 +%{ 1.576 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.577 + match(Set mem (StoreB mem zero)); 1.578 + 1.579 + ins_cost(125); // XXX 1.580 + format %{ "movb $mem, R12\t# short/char (R12_heapbase==0)" %} 1.581 + ins_encode %{ 1.582 + __ movb($mem$$Address, r12); 1.583 + %} 1.584 + ins_pipe(ialu_mem_reg); 1.585 +%} 1.586 + 1.587 instruct storeImmB(memory mem, immI8 src) 1.588 %{ 1.589 match(Set mem (StoreB mem src)); 1.590 @@ -6898,6 +7210,19 @@ 1.591 %} 1.592 1.593 // Store CMS card-mark Immediate 1.594 +instruct storeImmCM0_reg(memory mem, immI0 zero) 1.595 +%{ 1.596 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.597 + match(Set mem (StoreCM mem zero)); 1.598 + 1.599 + ins_cost(125); // XXX 1.600 + format %{ "movb $mem, R12\t# CMS card-mark byte 0 (R12_heapbase==0)" %} 1.601 + ins_encode %{ 1.602 + __ movb($mem$$Address, r12); 1.603 + %} 1.604 + ins_pipe(ialu_mem_reg); 1.605 +%} 1.606 + 1.607 instruct storeImmCM0(memory mem, immI0 src) 1.608 %{ 1.609 match(Set mem (StoreCM mem src)); 1.610 @@ -6931,6 +7256,19 @@ 1.611 %} 1.612 1.613 // Store immediate Float value (it is faster than store from XMM register) 1.614 +instruct storeF0(memory mem, immF0 zero) 1.615 +%{ 1.616 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.617 + match(Set mem (StoreF mem zero)); 1.618 + 1.619 + ins_cost(25); // XXX 1.620 + format %{ "movl $mem, R12\t# float 0. (R12_heapbase==0)" %} 1.621 + ins_encode %{ 1.622 + __ movl($mem$$Address, r12); 1.623 + %} 1.624 + ins_pipe(ialu_mem_reg); 1.625 +%} 1.626 + 1.627 instruct storeF_imm(memory mem, immF src) 1.628 %{ 1.629 match(Set mem (StoreF mem src)); 1.630 @@ -6957,6 +7295,7 @@ 1.631 // Store immediate double 0.0 (it is faster than store from XMM register) 1.632 instruct storeD0_imm(memory mem, immD0 src) 1.633 %{ 1.634 + predicate(!UseCompressedOops || (Universe::narrow_oop_base() != NULL)); 1.635 match(Set mem (StoreD mem src)); 1.636 1.637 ins_cost(50); 1.638 @@ -6966,6 +7305,19 @@ 1.639 ins_pipe(ialu_mem_imm); 1.640 %} 1.641 1.642 +instruct storeD0(memory mem, immD0 zero) 1.643 +%{ 1.644 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.645 + match(Set mem (StoreD mem zero)); 1.646 + 1.647 + ins_cost(25); // XXX 1.648 + format %{ "movq $mem, R12\t# double 0. (R12_heapbase==0)" %} 1.649 + ins_encode %{ 1.650 + __ movq($mem$$Address, r12); 1.651 + %} 1.652 + ins_pipe(ialu_mem_reg); 1.653 +%} 1.654 + 1.655 instruct storeSSI(stackSlotI dst, rRegI src) 1.656 %{ 1.657 match(Set dst src); 1.658 @@ -7192,9 +7544,7 @@ 1.659 effect(KILL cr); 1.660 format %{ "encode_heap_oop_not_null $dst,$src" %} 1.661 ins_encode %{ 1.662 - Register s = $src$$Register; 1.663 - Register d = $dst$$Register; 1.664 - __ encode_heap_oop_not_null(d, s); 1.665 + __ encode_heap_oop_not_null($dst$$Register, $src$$Register); 1.666 %} 1.667 ins_pipe(ialu_reg_long); 1.668 %} 1.669 @@ -7224,7 +7574,11 @@ 1.670 ins_encode %{ 1.671 Register s = $src$$Register; 1.672 Register d = $dst$$Register; 1.673 - __ decode_heap_oop_not_null(d, s); 1.674 + if (s != d) { 1.675 + __ decode_heap_oop_not_null(d, s); 1.676 + } else { 1.677 + __ decode_heap_oop_not_null(d); 1.678 + } 1.679 %} 1.680 ins_pipe(ialu_reg_long); 1.681 %} 1.682 @@ -11389,8 +11743,9 @@ 1.683 1.684 // This will generate a signed flags result. This should be OK since 1.685 // any compare to a zero should be eq/neq. 1.686 -instruct testP_reg_mem(rFlagsReg cr, memory op, immP0 zero) 1.687 -%{ 1.688 +instruct testP_mem(rFlagsReg cr, memory op, immP0 zero) 1.689 +%{ 1.690 + predicate(!UseCompressedOops || (Universe::narrow_oop_base() != NULL)); 1.691 match(Set cr (CmpP (LoadP op) zero)); 1.692 1.693 ins_cost(500); // XXX 1.694 @@ -11401,13 +11756,24 @@ 1.695 ins_pipe(ialu_cr_reg_imm); 1.696 %} 1.697 1.698 +instruct testP_mem_reg0(rFlagsReg cr, memory mem, immP0 zero) 1.699 +%{ 1.700 + predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL)); 1.701 + match(Set cr (CmpP (LoadP mem) zero)); 1.702 + 1.703 + format %{ "cmpq R12, $mem\t# ptr (R12_heapbase==0)" %} 1.704 + ins_encode %{ 1.705 + __ cmpq(r12, $mem$$Address); 1.706 + %} 1.707 + ins_pipe(ialu_cr_reg_mem); 1.708 +%} 1.709 1.710 instruct compN_rReg(rFlagsRegU cr, rRegN op1, rRegN op2) 1.711 %{ 1.712 match(Set cr (CmpN op1 op2)); 1.713 1.714 format %{ "cmpl $op1, $op2\t# compressed ptr" %} 1.715 - ins_encode %{ __ cmpl(as_Register($op1$$reg), as_Register($op2$$reg)); %} 1.716 + ins_encode %{ __ cmpl($op1$$Register, $op2$$Register); %} 1.717 ins_pipe(ialu_cr_reg_reg); 1.718 %} 1.719 1.720 @@ -11415,11 +11781,30 @@ 1.721 %{ 1.722 match(Set cr (CmpN src (LoadN mem))); 1.723 1.724 - ins_cost(500); // XXX 1.725 - format %{ "cmpl $src, mem\t# compressed ptr" %} 1.726 + format %{ "cmpl $src, $mem\t# compressed ptr" %} 1.727 ins_encode %{ 1.728 - Address adr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.729 - __ cmpl(as_Register($src$$reg), adr); 1.730 + __ cmpl($src$$Register, $mem$$Address); 1.731 + %} 1.732 + ins_pipe(ialu_cr_reg_mem); 1.733 +%} 1.734 + 1.735 +instruct compN_rReg_imm(rFlagsRegU cr, rRegN op1, immN op2) %{ 1.736 + match(Set cr (CmpN op1 op2)); 1.737 + 1.738 + format %{ "cmpl $op1, $op2\t# compressed ptr" %} 1.739 + ins_encode %{ 1.740 + __ cmp_narrow_oop($op1$$Register, (jobject)$op2$$constant); 1.741 + %} 1.742 + ins_pipe(ialu_cr_reg_imm); 1.743 +%} 1.744 + 1.745 +instruct compN_mem_imm(rFlagsRegU cr, memory mem, immN src) 1.746 +%{ 1.747 + match(Set cr (CmpN src (LoadN mem))); 1.748 + 1.749 + format %{ "cmpl $mem, $src\t# compressed ptr" %} 1.750 + ins_encode %{ 1.751 + __ cmp_narrow_oop($mem$$Address, (jobject)$src$$constant); 1.752 %} 1.753 ins_pipe(ialu_cr_reg_mem); 1.754 %} 1.755 @@ -11432,15 +11817,27 @@ 1.756 ins_pipe(ialu_cr_reg_imm); 1.757 %} 1.758 1.759 -instruct testN_reg_mem(rFlagsReg cr, memory mem, immN0 zero) 1.760 -%{ 1.761 +instruct testN_mem(rFlagsReg cr, memory mem, immN0 zero) 1.762 +%{ 1.763 + predicate(Universe::narrow_oop_base() != NULL); 1.764 match(Set cr (CmpN (LoadN mem) zero)); 1.765 1.766 ins_cost(500); // XXX 1.767 format %{ "testl $mem, 0xffffffff\t# compressed ptr" %} 1.768 ins_encode %{ 1.769 - Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 1.770 - __ cmpl(addr, (int)0xFFFFFFFF); 1.771 + __ cmpl($mem$$Address, (int)0xFFFFFFFF); 1.772 + %} 1.773 + ins_pipe(ialu_cr_reg_mem); 1.774 +%} 1.775 + 1.776 +instruct testN_mem_reg0(rFlagsReg cr, memory mem, immN0 zero) 1.777 +%{ 1.778 + predicate(Universe::narrow_oop_base() == NULL); 1.779 + match(Set cr (CmpN (LoadN mem) zero)); 1.780 + 1.781 + format %{ "cmpl R12, $mem\t# compressed ptr (R12_heapbase==0)" %} 1.782 + ins_encode %{ 1.783 + __ cmpl(r12, $mem$$Address); 1.784 %} 1.785 ins_pipe(ialu_cr_reg_mem); 1.786 %} 1.787 @@ -11472,7 +11869,6 @@ 1.788 %{ 1.789 match(Set cr (CmpL op1 (LoadL op2))); 1.790 1.791 - ins_cost(500); // XXX 1.792 format %{ "cmpq $op1, $op2" %} 1.793 opcode(0x3B); /* Opcode 3B /r */ 1.794 ins_encode(REX_reg_mem_wide(op1, op2), OpcP, reg_mem(op1, op2)); 1.795 @@ -11756,7 +12152,6 @@ 1.796 rdi_RegP result) 1.797 %{ 1.798 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero)); 1.799 - predicate(!UseCompressedOops); // decoding oop kills condition codes 1.800 effect(KILL rcx, KILL result); 1.801 1.802 ins_cost(1000);