< prev index next >
src/hotspot/cpu/x86/x86_64.ad
Print this page
*** 3935,3944 ****
--- 3935,3960 ----
scale($scale);
disp($off);
%}
%}
+ // Indirect Narrow Oop Operand
+ operand indCompressedOop(rRegN reg) %{
+ predicate(UseCompressedOops && (CompressedOops::shift() == Address::times_8));
+ constraint(ALLOC_IN_RC(ptr_reg));
+ match(DecodeN reg);
+
+ op_cost(10);
+ format %{"[R12 + $reg << 3] (compressed oop addressing)" %}
+ interface(MEMORY_INTER) %{
+ base(0xc); // R12
+ index($reg);
+ scale(0x3);
+ disp(0x0);
+ %}
+ %}
+
// Indirect Narrow Oop Plus Offset Operand
// Note: x86 architecture doesn't support "scale * index + offset" without a base
// we can't free r12 even with CompressedOops::base() == NULL.
operand indCompressedOopOffset(rRegN reg, immL32 off) %{
predicate(UseCompressedOops && (CompressedOops::shift() == Address::times_8));
*** 4471,4481 ****
// multiple operand types with the same basic encoding and format. The classic
// case of this is memory operands.
opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex,
indIndexScale, indPosIndexScale, indIndexScaleOffset, indPosIndexOffset, indPosIndexScaleOffset,
! indCompressedOopOffset,
indirectNarrow, indOffset8Narrow, indOffset32Narrow,
indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow,
indIndexScaleOffsetNarrow, indPosIndexOffsetNarrow, indPosIndexScaleOffsetNarrow);
//----------PIPELINE-----------------------------------------------------------
--- 4487,4497 ----
// multiple operand types with the same basic encoding and format. The classic
// case of this is memory operands.
opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex,
indIndexScale, indPosIndexScale, indIndexScaleOffset, indPosIndexOffset, indPosIndexScaleOffset,
! indCompressedOop, indCompressedOopOffset,
indirectNarrow, indOffset8Narrow, indOffset32Narrow,
indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow,
indIndexScaleOffsetNarrow, indPosIndexOffsetNarrow, indPosIndexScaleOffsetNarrow);
//----------PIPELINE-----------------------------------------------------------
*** 12067,12076 ****
--- 12083,12107 ----
opcode(0xF7, 0x00);
ins_encode(REX_mem(mem), OpcP, RM_opc_mem(0x00, mem), Con32(con));
ins_pipe(ialu_mem_imm);
%}
+ // Clear array property bits
+ instruct clear_property_bits(rRegN dst, memory mem, immU31 mask, rFlagsReg cr)
+ %{
+ match(Set dst (CastI2N (AndI (CastN2I (LoadNKlass mem)) mask)));
+ effect(KILL cr);
+
+ format %{ "movl $dst, $mem\t# clear property bits\n\t"
+ "andl $dst, $mask" %}
+ ins_encode %{
+ __ movl($dst$$Register, $mem$$Address);
+ __ andl($dst$$Register, $mask$$constant);
+ %}
+ ins_pipe(ialu_reg_mem);
+ %}
+
// Unsigned compare Instructions; really, same as signed except they
// produce an rFlagsRegU instead of rFlagsReg.
instruct compU_rReg(rFlagsRegU cr, rRegI op1, rRegI op2)
%{
match(Set cr (CmpU op1 op2));
*** 12380,12390 ****
// Fold array properties check
instruct testL_reg_mem3(rFlagsReg cr, memory mem, rRegL src, immL0 zero)
%{
match(Set cr (CmpL (AndL (CastP2X (LoadKlass mem)) src) zero));
! format %{ "testq $src, $mem" %}
opcode(0x85);
ins_encode(REX_reg_mem_wide(src, mem), OpcP, reg_mem(src, mem));
ins_pipe(ialu_cr_reg_mem);
%}
--- 12411,12421 ----
// Fold array properties check
instruct testL_reg_mem3(rFlagsReg cr, memory mem, rRegL src, immL0 zero)
%{
match(Set cr (CmpL (AndL (CastP2X (LoadKlass mem)) src) zero));
! format %{ "testq $src, $mem\t# test array properties" %}
opcode(0x85);
ins_encode(REX_reg_mem_wide(src, mem), OpcP, reg_mem(src, mem));
ins_pipe(ialu_cr_reg_mem);
%}
< prev index next >