src/cpu/x86/vm/interpreter_x86_32.cpp

Print this page
rev 3227 : 7133857: exp() and pow() should use the x87 ISA on x86
Summary: use x87 instructions to implement exp() and pow() in interpreter/c1/c2.
Reviewed-by:


 164         __ trigfunc('t');
 165         break;
 166     case Interpreter::java_lang_math_sqrt:
 167         __ fsqrt();
 168         break;
 169     case Interpreter::java_lang_math_abs:
 170         __ fabs();
 171         break;
 172     case Interpreter::java_lang_math_log:
 173         __ flog();
 174         // Store to stack to convert 80bit precision back to 64bits
 175         __ push_fTOS();
 176         __ pop_fTOS();
 177         break;
 178     case Interpreter::java_lang_math_log10:
 179         __ flog10();
 180         // Store to stack to convert 80bit precision back to 64bits
 181         __ push_fTOS();
 182         __ pop_fTOS();
 183         break;













 184     default                              :
 185         ShouldNotReachHere();
 186   }
 187 
 188   // return double result in xmm0 for interpreter and compilers.
 189   if (UseSSE >= 2) {
 190     __ subptr(rsp, 2*wordSize);
 191     __ fstp_d(Address(rsp, 0));
 192     __ movdbl(xmm0, Address(rsp, 0));
 193     __ addptr(rsp, 2*wordSize);
 194   }
 195 
 196   // done, result in FPU ST(0) or XMM0
 197   __ pop(rdi);                               // get return address
 198   __ mov(rsp, rsi);                          // set sp to sender sp
 199   __ jmp(rdi);
 200 
 201   return entry_point;
 202 }
 203 




 164         __ trigfunc('t');
 165         break;
 166     case Interpreter::java_lang_math_sqrt:
 167         __ fsqrt();
 168         break;
 169     case Interpreter::java_lang_math_abs:
 170         __ fabs();
 171         break;
 172     case Interpreter::java_lang_math_log:
 173         __ flog();
 174         // Store to stack to convert 80bit precision back to 64bits
 175         __ push_fTOS();
 176         __ pop_fTOS();
 177         break;
 178     case Interpreter::java_lang_math_log10:
 179         __ flog10();
 180         // Store to stack to convert 80bit precision back to 64bits
 181         __ push_fTOS();
 182         __ pop_fTOS();
 183         break;
 184     case Interpreter::java_lang_math_pow:
 185       __ fld_d(Address(rsp, 3*wordSize)); // second argument
 186       __ pow_or_exp(false, 0);
 187       // Store to stack to convert 80bit precision back to 64bits
 188       __ push_fTOS();
 189       __ pop_fTOS();
 190       break;
 191     case Interpreter::java_lang_math_exp:
 192       __ pow_or_exp(true, 0);
 193       // Store to stack to convert 80bit precision back to 64bits
 194       __ push_fTOS();
 195       __ pop_fTOS();
 196       break;
 197     default                              :
 198         ShouldNotReachHere();
 199   }
 200 
 201   // return double result in xmm0 for interpreter and compilers.
 202   if (UseSSE >= 2) {
 203     __ subptr(rsp, 2*wordSize);
 204     __ fstp_d(Address(rsp, 0));
 205     __ movdbl(xmm0, Address(rsp, 0));
 206     __ addptr(rsp, 2*wordSize);
 207   }
 208 
 209   // done, result in FPU ST(0) or XMM0
 210   __ pop(rdi);                               // get return address
 211   __ mov(rsp, rsi);                          // set sp to sender sp
 212   __ jmp(rdi);
 213 
 214   return entry_point;
 215 }
 216