7738 7739 ins_cost(300); 7740 format %{ "IMUL $dst,$src,$imm" %} 7741 opcode(0x69); /* 69 /r id */ 7742 ins_encode( OpcSE(imm), RegMem( dst, src ), Con8or32( imm ) ); 7743 ins_pipe( ialu_reg_mem_alu0 ); 7744 %} 7745 7746 // Multiply Memory 7747 instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{ 7748 match(Set dst (MulI dst (LoadI src))); 7749 effect(KILL cr); 7750 7751 ins_cost(350); 7752 format %{ "IMUL $dst,$src" %} 7753 opcode(0xAF, 0x0F); 7754 ins_encode( OpcS, OpcP, RegMem( dst, src) ); 7755 ins_pipe( ialu_reg_mem_alu0 ); 7756 %} 7757 7758 // Multiply Register Int to Long 7759 instruct mulI2L(eADXRegL dst, eAXRegI src, nadxRegI src1, eFlagsReg flags) %{ 7760 // Basic Idea: long = (long)int * (long)int 7761 match(Set dst (MulL (ConvI2L src) (ConvI2L src1))); 7762 effect(DEF dst, USE src, USE src1, KILL flags); 7763 7764 ins_cost(300); 7765 format %{ "IMUL $dst,$src1" %} 7766 7767 ins_encode( long_int_multiply( dst, src1 ) ); 7768 ins_pipe( ialu_reg_reg_alu0 ); 7769 %} 7770 7771 instruct mulIS_eReg(eADXRegL dst, immL_32bits mask, eFlagsReg flags, eAXRegI src, nadxRegI src1) %{ 7772 // Basic Idea: long = (int & 0xffffffffL) * (int & 0xffffffffL) 7773 match(Set dst (MulL (AndL (ConvI2L src) mask) (AndL (ConvI2L src1) mask))); 7774 effect(KILL flags); 7775 7776 ins_cost(300); 7777 format %{ "MUL $dst,$src1" %} | 7738 7739 ins_cost(300); 7740 format %{ "IMUL $dst,$src,$imm" %} 7741 opcode(0x69); /* 69 /r id */ 7742 ins_encode( OpcSE(imm), RegMem( dst, src ), Con8or32( imm ) ); 7743 ins_pipe( ialu_reg_mem_alu0 ); 7744 %} 7745 7746 // Multiply Memory 7747 instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{ 7748 match(Set dst (MulI dst (LoadI src))); 7749 effect(KILL cr); 7750 7751 ins_cost(350); 7752 format %{ "IMUL $dst,$src" %} 7753 opcode(0xAF, 0x0F); 7754 ins_encode( OpcS, OpcP, RegMem( dst, src) ); 7755 ins_pipe( ialu_reg_mem_alu0 ); 7756 %} 7757 7758 instruct mulAddS2I_rReg(rRegI dst, rRegI src1, rRegI src2, rRegI src3, eFlagsReg cr) 7759 %{ 7760 match(Set dst (MulAddS2I (Binary dst src1) (Binary src2 src3))); 7761 effect(KILL cr, KILL src2); 7762 7763 expand %{ mulI_rReg(dst, src1, cr); 7764 mulI_rReg(src2, src3, cr); 7765 addI_rReg(dst, src2, cr); %} 7766 %} 7767 7768 // Multiply Register Int to Long 7769 instruct mulI2L(eADXRegL dst, eAXRegI src, nadxRegI src1, eFlagsReg flags) %{ 7770 // Basic Idea: long = (long)int * (long)int 7771 match(Set dst (MulL (ConvI2L src) (ConvI2L src1))); 7772 effect(DEF dst, USE src, USE src1, KILL flags); 7773 7774 ins_cost(300); 7775 format %{ "IMUL $dst,$src1" %} 7776 7777 ins_encode( long_int_multiply( dst, src1 ) ); 7778 ins_pipe( ialu_reg_reg_alu0 ); 7779 %} 7780 7781 instruct mulIS_eReg(eADXRegL dst, immL_32bits mask, eFlagsReg flags, eAXRegI src, nadxRegI src1) %{ 7782 // Basic Idea: long = (int & 0xffffffffL) * (int & 0xffffffffL) 7783 match(Set dst (MulL (AndL (ConvI2L src) mask) (AndL (ConvI2L src1) mask))); 7784 effect(KILL flags); 7785 7786 ins_cost(300); 7787 format %{ "MUL $dst,$src1" %} |