Some of j.l.Math::* functions can't be redefined (dynamically instrumented): is it expected?

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Apr 30 08:33:59 PDT 2013


 > Shouldn't StrictMath counterparts be intrinsified instead? At least,
 > when class redefinition is allowed.

No, we can't do that. Think about StrictMath as reference implementation 
in java which produces exactly the same results on all platforms. Where 
non-strict math is for using hardware instructions to get best 
performance and may produce not the same result (but with variation not 
bigger then in java specification).

"Unlike some of the numeric methods of class StrictMath, all 
implementations of the equivalent functions of class Math are not 
defined to return the bit-for-bit same results. This relaxation permits 
better-performing implementations where strict reproducibility is not 
required.

By default many of the Math methods simply call the equivalent method in 
StrictMath for their implementation. Code generators are encouraged to 
use platform-specific native libraries or microprocessor instructions, 
where available, to provide higher-performance implementations of Math 
methods. Such higher-performance implementations still must conform to 
the specification for Math."

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html

Vladimir K

On 4/30/13 6:17 AM, Vladimir Ivanov wrote:
> Hi,
>
> I stumbled upon a fact that some of Math.* functions, though they are
> written in Java, can't be instrumented/redefined (using
> j.l.i.Instrumentation or JVMTI RedefineClasses).
>
> Looking at the code, I see that the interpreter handles such functions
> specially:
> src/share/vm/interpreter/interpreter.cpp:
> ...
> 184 AbstractInterpreter::MethodKind
> AbstractInterpreter::method_kind(methodHandle m) {
> ...
> 228   switch (m->intrinsic_id()) {
> 229     case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
> ...
>
> but
>
> src/share/classes/java/lang/Math.java:
> ...
> 138    public static double sin(double a) {
> 139        return StrictMath.sin(a); // default impl. delegates to
> StrictMath
> 140    }
> ...
>
> and
>
> src/share/classes/java/lang/StrictMath.java:
> ...
> 110     public static native double sin(double a);
> ...
>
> Shouldn't StrictMath counterparts be intrinsified instead? At least,
> when class redefinition is allowed.
> Best regards,
> Vladimir Ivanov


More information about the hotspot-runtime-dev mailing list