comparison src/cpu/x86/vm/assembler_x86.cpp @ 6087:e2961d14584b

7169934: pow(x,y) or x64 computes incorrect result when x<0 and y is an odd integer Summary: bad test for parity of y in pow(x,y) (c1, interpreter) Reviewed-by: kvn, twisti
author roland
date Mon, 21 May 2012 09:46:02 +0200
parents 6759698e3140
children e7715c222897
comparison
equal deleted inserted replaced
6086:cdd249497b34 6087:e2961d14584b
6952 if (!VM_Version::supports_cmov()) { 6952 if (!VM_Version::supports_cmov()) {
6953 // fcmp needs a temporary so preserve rdx, 6953 // fcmp needs a temporary so preserve rdx,
6954 tmp = rdx; 6954 tmp = rdx;
6955 } 6955 }
6956 Register tmp2 = rax; 6956 Register tmp2 = rax;
6957 NOT_LP64(Register tmp3 = rcx;) 6957 Register tmp3 = rcx;
6958 6958
6959 if (is_exp) { 6959 if (is_exp) {
6960 // Stack: X 6960 // Stack: X
6961 fld_s(0); // duplicate argument for runtime call. Stack: X X 6961 fld_s(0); // duplicate argument for runtime call. Stack: X X
6962 fast_exp(); // Stack: exp(X) X 6962 fast_exp(); // Stack: exp(X) X
7079 bind(integer); 7079 bind(integer);
7080 } 7080 }
7081 #else 7081 #else
7082 { 7082 {
7083 Label integer; 7083 Label integer;
7084 shlq(tmp2, 1); 7084 mov(tmp3, tmp2); // preserve tmp2 for parity check below
7085 shlq(tmp3, 1);
7085 jcc(Assembler::carryClear, integer); 7086 jcc(Assembler::carryClear, integer);
7086 jcc(Assembler::notZero, integer); 7087 jcc(Assembler::notZero, integer);
7087 stop("integer indefinite value shouldn't be seen here"); 7088 stop("integer indefinite value shouldn't be seen here");
7088 bind(integer); 7089 bind(integer);
7089 } 7090 }