Mercurial > hg > truffle
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 } |