mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
8054054: 8040121 is broken
C++ code pattern from 8040121 is incorrect Reviewed-by: kvn
This commit is contained in:
parent
7a9fc5ff21
commit
e546e2a060
2 changed files with 14 additions and 7 deletions
|
@ -785,7 +785,8 @@ void Compile::FillLocArray( int idx, MachSafePointNode* sfpt, Node *local,
|
|||
// grow downwards in all implementations.
|
||||
// (If, on some machine, the interpreter's Java locals or stack
|
||||
// were to grow upwards, the embedded doubles would be word-swapped.)
|
||||
jlong_accessor acc = { jlong_cast(d) };
|
||||
jlong_accessor acc;
|
||||
acc.long_value = jlong_cast(d);
|
||||
array->append(new ConstantIntValue(acc.words[1]));
|
||||
array->append(new ConstantIntValue(acc.words[0]));
|
||||
#endif
|
||||
|
@ -804,7 +805,8 @@ void Compile::FillLocArray( int idx, MachSafePointNode* sfpt, Node *local,
|
|||
// grow downwards in all implementations.
|
||||
// (If, on some machine, the interpreter's Java locals or stack
|
||||
// were to grow upwards, the embedded doubles would be word-swapped.)
|
||||
jlong_accessor acc = { d };
|
||||
jlong_accessor acc;
|
||||
acc.long_value = d;
|
||||
array->append(new ConstantIntValue(acc.words[1]));
|
||||
array->append(new ConstantIntValue(acc.words[0]));
|
||||
#endif
|
||||
|
|
|
@ -42,29 +42,34 @@ typedef union {
|
|||
} DoubleIntConv;
|
||||
|
||||
static inline int high(double d) {
|
||||
DoubleIntConv x = { d };
|
||||
DoubleIntConv x;
|
||||
x.d = d;
|
||||
return x.split.hi;
|
||||
}
|
||||
|
||||
static inline int low(double d) {
|
||||
DoubleIntConv x = { d };
|
||||
DoubleIntConv x;
|
||||
x.d = d;
|
||||
return x.split.lo;
|
||||
}
|
||||
|
||||
static inline void set_high(double* d, int high) {
|
||||
DoubleIntConv conv = { *d };
|
||||
DoubleIntConv conv;
|
||||
conv.d = *d;
|
||||
conv.split.hi = high;
|
||||
*d = conv.d;
|
||||
}
|
||||
|
||||
static inline void set_low(double* d, int low) {
|
||||
DoubleIntConv conv = { *d };
|
||||
DoubleIntConv conv;
|
||||
conv.d = *d;
|
||||
conv.split.lo = low;
|
||||
*d = conv.d;
|
||||
}
|
||||
|
||||
static double copysignA(double x, double y) {
|
||||
DoubleIntConv convX = { x };
|
||||
DoubleIntConv convX;
|
||||
convX.d = x;
|
||||
convX.split.hi = (convX.split.hi & 0x7fffffff) | (high(y) & 0x80000000);
|
||||
return convX.d;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue