< prev index next >

src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

Print this page




2348   if (value->is_double_xmm()) {
2349     switch(code) {
2350       case lir_abs :
2351         {
2352           if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
2353             __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
2354           }
2355           __ andpd(dest->as_xmm_double_reg(),
2356                     ExternalAddress((address)double_signmask_pool));
2357         }
2358         break;
2359 
2360       case lir_sqrt: __ sqrtsd(dest->as_xmm_double_reg(), value->as_xmm_double_reg()); break;
2361       // all other intrinsics are not available in the SSE instruction set, so FPU is used
2362       default      : ShouldNotReachHere();
2363     }
2364 
2365   } else if (value->is_double_fpu()) {
2366     assert(value->fpu_regnrLo() == 0 && dest->fpu_regnrLo() == 0, "both must be on TOS");
2367     switch(code) {
2368       case lir_log10 : __ flog10() ; break;
2369       case lir_abs   : __ fabs() ; break;
2370       case lir_sqrt  : __ fsqrt(); break;
2371       case lir_tan :
2372         // Should consider not saving rbx, if not necessary
2373         __ trigfunc('t', op->as_Op2()->fpu_stack_size());
2374         break;
2375       default      : ShouldNotReachHere();
2376     }
2377   } else {
2378     Unimplemented();
2379   }
2380 }
2381 
2382 void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
2383   // assert(left->destroys_register(), "check");
2384   if (left->is_single_cpu()) {
2385     Register reg = left->as_register();
2386     if (right->is_constant()) {
2387       int val = right->as_constant_ptr()->as_jint();
2388       switch (code) {
2389         case lir_logic_and: __ andl (reg, val); break;
2390         case lir_logic_or:  __ orl  (reg, val); break;
2391         case lir_logic_xor: __ xorl (reg, val); break;
2392         default: ShouldNotReachHere();
2393       }
2394     } else if (right->is_stack()) {




2348   if (value->is_double_xmm()) {
2349     switch(code) {
2350       case lir_abs :
2351         {
2352           if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
2353             __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
2354           }
2355           __ andpd(dest->as_xmm_double_reg(),
2356                     ExternalAddress((address)double_signmask_pool));
2357         }
2358         break;
2359 
2360       case lir_sqrt: __ sqrtsd(dest->as_xmm_double_reg(), value->as_xmm_double_reg()); break;
2361       // all other intrinsics are not available in the SSE instruction set, so FPU is used
2362       default      : ShouldNotReachHere();
2363     }
2364 
2365   } else if (value->is_double_fpu()) {
2366     assert(value->fpu_regnrLo() == 0 && dest->fpu_regnrLo() == 0, "both must be on TOS");
2367     switch(code) {

2368       case lir_abs   : __ fabs() ; break;
2369       case lir_sqrt  : __ fsqrt(); break;




2370       default      : ShouldNotReachHere();
2371     }
2372   } else {
2373     Unimplemented();
2374   }
2375 }
2376 
2377 void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
2378   // assert(left->destroys_register(), "check");
2379   if (left->is_single_cpu()) {
2380     Register reg = left->as_register();
2381     if (right->is_constant()) {
2382       int val = right->as_constant_ptr()->as_jint();
2383       switch (code) {
2384         case lir_logic_and: __ andl (reg, val); break;
2385         case lir_logic_or:  __ orl  (reg, val); break;
2386         case lir_logic_xor: __ xorl (reg, val); break;
2387         default: ShouldNotReachHere();
2388       }
2389     } else if (right->is_stack()) {


< prev index next >