< prev index next >

src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp

Print this page




 562     Rdivisor = op->in_opr2()->as_register();
 563   } else {
 564     divisor = op->in_opr2()->as_constant_ptr()->as_jint();
 565     assert(Assembler::is_simm13(divisor), "can only handle simm13");
 566   }
 567 
 568   assert(Rdividend != Rscratch, "");
 569   assert(Rdivisor  != Rscratch, "");
 570   assert(op->code() == lir_idiv || op->code() == lir_irem, "Must be irem or idiv");
 571 
 572   if (Rdivisor == noreg && is_power_of_2(divisor)) {
 573     // convert division by a power of two into some shifts and logical operations
 574     if (op->code() == lir_idiv) {
 575       if (divisor == 2) {
 576         __ srl(Rdividend, 31, Rscratch);
 577       } else {
 578         __ sra(Rdividend, 31, Rscratch);
 579         __ and3(Rscratch, divisor - 1, Rscratch);
 580       }
 581       __ add(Rdividend, Rscratch, Rscratch);
 582       __ sra(Rscratch, log2_intptr(divisor), Rresult);
 583       return;
 584     } else {
 585       if (divisor == 2) {
 586         __ srl(Rdividend, 31, Rscratch);
 587       } else {
 588         __ sra(Rdividend, 31, Rscratch);
 589         __ and3(Rscratch, divisor - 1,Rscratch);
 590       }
 591       __ add(Rdividend, Rscratch, Rscratch);
 592       __ andn(Rscratch, divisor - 1,Rscratch);
 593       __ sub(Rdividend, Rscratch, Rresult);
 594       return;
 595     }
 596   }
 597 
 598   __ sra(Rdividend, 31, Rscratch);
 599   __ wry(Rscratch);
 600 
 601   add_debug_info_for_div0_here(op->info());
 602 




 562     Rdivisor = op->in_opr2()->as_register();
 563   } else {
 564     divisor = op->in_opr2()->as_constant_ptr()->as_jint();
 565     assert(Assembler::is_simm13(divisor), "can only handle simm13");
 566   }
 567 
 568   assert(Rdividend != Rscratch, "");
 569   assert(Rdivisor  != Rscratch, "");
 570   assert(op->code() == lir_idiv || op->code() == lir_irem, "Must be irem or idiv");
 571 
 572   if (Rdivisor == noreg && is_power_of_2(divisor)) {
 573     // convert division by a power of two into some shifts and logical operations
 574     if (op->code() == lir_idiv) {
 575       if (divisor == 2) {
 576         __ srl(Rdividend, 31, Rscratch);
 577       } else {
 578         __ sra(Rdividend, 31, Rscratch);
 579         __ and3(Rscratch, divisor - 1, Rscratch);
 580       }
 581       __ add(Rdividend, Rscratch, Rscratch);
 582       __ sra(Rscratch, log2_int(divisor), Rresult);
 583       return;
 584     } else {
 585       if (divisor == 2) {
 586         __ srl(Rdividend, 31, Rscratch);
 587       } else {
 588         __ sra(Rdividend, 31, Rscratch);
 589         __ and3(Rscratch, divisor - 1,Rscratch);
 590       }
 591       __ add(Rdividend, Rscratch, Rscratch);
 592       __ andn(Rscratch, divisor - 1,Rscratch);
 593       __ sub(Rdividend, Rscratch, Rresult);
 594       return;
 595     }
 596   }
 597 
 598   __ sra(Rdividend, 31, Rscratch);
 599   __ wry(Rscratch);
 600 
 601   add_debug_info_for_div0_here(op->info());
 602 


< prev index next >