< prev index next >

src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp

Print this page
rev 12379 : 8162338: AArch64: Intrinsify fused mac operations
Reviewed-by:

*** 1053,1063 **** int LIR_Assembler::array_element_size(BasicType type) const { int elem_size = type2aelembytes(type); return exact_log2(elem_size); } ! void LIR_Assembler::emit_op3(LIR_Op3* op) { Register Rdividend = op->in_opr1()->as_register(); Register Rdivisor = op->in_opr2()->as_register(); Register Rscratch = op->in_opr3()->as_register(); Register Rresult = op->result_opr()->as_register(); int divisor = -1; --- 1053,1063 ---- int LIR_Assembler::array_element_size(BasicType type) const { int elem_size = type2aelembytes(type); return exact_log2(elem_size); } ! void LIR_Assembler::arithmetic_idiv(LIR_Op3* op, bool is_irem) { Register Rdividend = op->in_opr1()->as_register(); Register Rdivisor = op->in_opr2()->as_register(); Register Rscratch = op->in_opr3()->as_register(); Register Rresult = op->result_opr()->as_register(); int divisor = -1;
*** 1074,1089 **** if (Rdivisor == noreg && is_power_of_2(divisor)) { // convert division by a power of two into some shifts and logical operations } ! if (op->code() == lir_irem) { ! __ corrected_idivl(Rresult, Rdividend, Rdivisor, true, rscratch1); ! } else if (op->code() == lir_idiv) { ! __ corrected_idivl(Rresult, Rdividend, Rdivisor, false, rscratch1); ! } else ! ShouldNotReachHere(); } void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) { #ifdef ASSERT assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label"); --- 1074,1108 ---- if (Rdivisor == noreg && is_power_of_2(divisor)) { // convert division by a power of two into some shifts and logical operations } ! __ corrected_idivl(Rresult, Rdividend, Rdivisor, is_irem, rscratch1); ! } ! ! void LIR_Assembler::emit_op3(LIR_Op3* op) { ! switch (op->code()) { ! case lir_idiv: ! arithmetic_idiv(op, false); ! break; ! case lir_irem: ! arithmetic_idiv(op, true); ! break; ! case lir_fmad: ! __ fmaddd(op->result_opr()->as_double_reg(), ! op->in_opr1()->as_double_reg(), ! op->in_opr2()->as_double_reg(), ! op->in_opr3()->as_double_reg()); ! break; ! case lir_fmaf: ! __ fmadds(op->result_opr()->as_float_reg(), ! op->in_opr1()->as_float_reg(), ! op->in_opr2()->as_float_reg(), ! op->in_opr3()->as_float_reg()); ! break; ! default: ShouldNotReachHere(); break; ! } } void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) { #ifdef ASSERT assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label");
< prev index next >