Fix vcmpbfp returning that the value is out of bounds for values equal to the bounds.
This commit is contained in:
parent
35a9697af7
commit
abf37ed9be
|
@ -597,20 +597,20 @@ int InstrEmit_vcmpbfp_(PPCHIRBuilder& f, InstrData& i, uint32_t vd, uint32_t va,
|
||||||
// if vA or vB are NaN, the 2 high-order bits are set (0xC0000000)
|
// if vA or vB are NaN, the 2 high-order bits are set (0xC0000000)
|
||||||
Value* va_value = f.LoadVR(va);
|
Value* va_value = f.LoadVR(va);
|
||||||
Value* vb_value = f.LoadVR(vb);
|
Value* vb_value = f.LoadVR(vb);
|
||||||
Value* ge = f.VectorCompareSGE(va_value, vb_value, FLOAT32_TYPE);
|
Value* gt = f.VectorCompareSGT(va_value, vb_value, FLOAT32_TYPE);
|
||||||
Value* le =
|
Value* lt =
|
||||||
f.Not(f.VectorCompareSGT(va_value, f.Neg(vb_value), FLOAT32_TYPE));
|
f.Not(f.VectorCompareSGE(va_value, f.Neg(vb_value), FLOAT32_TYPE));
|
||||||
Value* v =
|
Value* v =
|
||||||
f.Or(f.And(ge, f.LoadConstantVec128(vec128i(0x80000000, 0x80000000,
|
f.Or(f.And(gt, f.LoadConstantVec128(vec128i(0x80000000, 0x80000000,
|
||||||
0x80000000, 0x80000000))),
|
0x80000000, 0x80000000))),
|
||||||
f.And(le, f.LoadConstantVec128(vec128i(0x40000000, 0x40000000,
|
f.And(lt, f.LoadConstantVec128(vec128i(0x40000000, 0x40000000,
|
||||||
0x40000000, 0x40000000))));
|
0x40000000, 0x40000000))));
|
||||||
f.StoreVR(vd, v);
|
f.StoreVR(vd, v);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
// CR0:4 = 0; CR0:5 = VT == 0; CR0:6 = CR0:7 = 0;
|
// CR0:4 = 0; CR0:5 = VT == 0; CR0:6 = CR0:7 = 0;
|
||||||
// If all of the elements are within bounds, CR6[2] is set
|
// If all of the elements are within bounds, CR6[2] is set
|
||||||
// FIXME: Does not affect CR6[0], but the following function does.
|
// FIXME: Does not affect CR6[0], but the following function does.
|
||||||
f.UpdateCR6(f.Or(ge, le));
|
f.UpdateCR6(f.Or(gt, lt));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue