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
|