Mercurial > hg > truffle
comparison src/cpu/x86/vm/assembler_x86.cpp @ 6141:e7715c222897
7174532: jdk/test/java/lang/Math/WorstCaseTests.java failing on x86
Summary: increase precision on x86 for the steps of the computation of exp and pow.
Reviewed-by: kvn
author | roland |
---|---|
date | Tue, 12 Jun 2012 10:02:36 +0200 |
parents | e2961d14584b |
children | 8c92982cbbc4 |
comparison
equal
deleted
inserted
replaced
6140:d5dded5d1e0d | 6141:e7715c222897 |
---|---|
6925 movl(Address(rsp,0),0); | 6925 movl(Address(rsp,0),0); |
6926 fmul_d(Address(rsp,0)); // Stack: 2^X ... | 6926 fmul_d(Address(rsp,0)); // Stack: 2^X ... |
6927 addptr(rsp,sizeof(jdouble)); | 6927 addptr(rsp,sizeof(jdouble)); |
6928 } | 6928 } |
6929 | 6929 |
6930 void MacroAssembler::increase_precision() { | |
6931 subptr(rsp, BytesPerWord); | |
6932 fnstcw(Address(rsp, 0)); | |
6933 movl(rax, Address(rsp, 0)); | |
6934 orl(rax, 0x300); | |
6935 push(rax); | |
6936 fldcw(Address(rsp, 0)); | |
6937 pop(rax); | |
6938 } | |
6939 | |
6940 void MacroAssembler::restore_precision() { | |
6941 fldcw(Address(rsp, 0)); | |
6942 addptr(rsp, BytesPerWord); | |
6943 } | |
6944 | |
6930 void MacroAssembler::fast_pow() { | 6945 void MacroAssembler::fast_pow() { |
6931 // computes X^Y = 2^(Y * log2(X)) | 6946 // computes X^Y = 2^(Y * log2(X)) |
6932 // if fast computation is not possible, result is NaN. Requires | 6947 // if fast computation is not possible, result is NaN. Requires |
6933 // fallback from user of this macro. | 6948 // fallback from user of this macro. |
6949 // increase precision for intermediate steps of the computation | |
6950 increase_precision(); | |
6934 fyl2x(); // Stack: (Y*log2(X)) ... | 6951 fyl2x(); // Stack: (Y*log2(X)) ... |
6935 pow_exp_core_encoding(); // Stack: exp(X) ... | 6952 pow_exp_core_encoding(); // Stack: exp(X) ... |
6953 restore_precision(); | |
6936 } | 6954 } |
6937 | 6955 |
6938 void MacroAssembler::fast_exp() { | 6956 void MacroAssembler::fast_exp() { |
6939 // computes exp(X) = 2^(X * log2(e)) | 6957 // computes exp(X) = 2^(X * log2(e)) |
6940 // if fast computation is not possible, result is NaN. Requires | 6958 // if fast computation is not possible, result is NaN. Requires |
6941 // fallback from user of this macro. | 6959 // fallback from user of this macro. |
6960 // increase precision for intermediate steps of the computation | |
6961 increase_precision(); | |
6942 fldl2e(); // Stack: log2(e) X ... | 6962 fldl2e(); // Stack: log2(e) X ... |
6943 fmulp(1); // Stack: (X*log2(e)) ... | 6963 fmulp(1); // Stack: (X*log2(e)) ... |
6944 pow_exp_core_encoding(); // Stack: exp(X) ... | 6964 pow_exp_core_encoding(); // Stack: exp(X) ... |
6965 restore_precision(); | |
6945 } | 6966 } |
6946 | 6967 |
6947 void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) { | 6968 void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) { |
6948 // kills rax, rcx, rdx | 6969 // kills rax, rcx, rdx |
6949 // pow and exp needs 2 extra registers on the fpu stack. | 6970 // pow and exp needs 2 extra registers on the fpu stack. |