< prev index next >
src/hotspot/cpu/x86/x86_64.ad
Print this page
@@ -12004,10 +12004,21 @@
opcode(0x85);
ins_encode(REX_reg_mem(src, mem), OpcP, reg_mem(src, mem));
ins_pipe(ialu_cr_reg_mem);
%}
+// Fold array properties check
+instruct testI_mem_imm(rFlagsReg cr, memory mem, immI con, immI0 zero)
+%{
+ match(Set cr (CmpI (AndI (CastN2I (LoadNKlass mem)) con) zero));
+
+ format %{ "testl $mem, $con" %}
+ opcode(0xF7, 0x00);
+ ins_encode(REX_mem(mem), OpcP, RM_opc_mem(0x00, mem), Con32(con));
+ ins_pipe(ialu_mem_imm);
+%}
+
// 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));
@@ -12310,10 +12321,21 @@
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);
+%}
+
+// 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);
%}
// Manifest a CmpL result in an integer register. Very painful.
// This is the test to avoid.
instruct cmpL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags)
< prev index next >