< 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 >