src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
changeset 52675 7d3cde494494
parent 51996 84743156e780
child 53171 3ab3cb8a8d41
equal deleted inserted replaced
52674:c9325aa887da 52675:7d3cde494494
  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));