equal
deleted
inserted
replaced
2553 |
2553 |
2554 Register lreg = left->as_register(); |
2554 Register lreg = left->as_register(); |
2555 Register dreg = result->as_register(); |
2555 Register dreg = result->as_register(); |
2556 |
2556 |
2557 if (right->is_constant()) { |
2557 if (right->is_constant()) { |
2558 int divisor = right->as_constant_ptr()->as_jint(); |
2558 jint divisor = right->as_constant_ptr()->as_jint(); |
2559 assert(divisor > 0 && is_power_of_2(divisor), "must be"); |
2559 assert(divisor > 0 && is_power_of_2(divisor), "must be"); |
2560 if (code == lir_idiv) { |
2560 if (code == lir_idiv) { |
2561 assert(lreg == rax, "must be rax,"); |
2561 assert(lreg == rax, "must be rax,"); |
2562 assert(temp->as_register() == rdx, "tmp register must be rdx"); |
2562 assert(temp->as_register() == rdx, "tmp register must be rdx"); |
2563 __ cdql(); // sign extend into rdx:rax |
2563 __ cdql(); // sign extend into rdx:rax |
2565 __ subl(lreg, rdx); |
2565 __ subl(lreg, rdx); |
2566 } else { |
2566 } else { |
2567 __ andl(rdx, divisor - 1); |
2567 __ andl(rdx, divisor - 1); |
2568 __ addl(lreg, rdx); |
2568 __ addl(lreg, rdx); |
2569 } |
2569 } |
2570 __ sarl(lreg, log2_intptr(divisor)); |
2570 __ sarl(lreg, log2_jint(divisor)); |
2571 move_regs(lreg, dreg); |
2571 move_regs(lreg, dreg); |
2572 } else if (code == lir_irem) { |
2572 } else if (code == lir_irem) { |
2573 Label done; |
2573 Label done; |
2574 __ mov(dreg, lreg); |
2574 __ mov(dreg, lreg); |
2575 __ andl(dreg, 0x80000000 | (divisor - 1)); |
2575 __ andl(dreg, 0x80000000 | (divisor - 1)); |