m_formatter.vfpOp(OP_VCVT_FPIVFP, OP_VCVT_FPIVFPb, true, vcvtOp(true, false, true), rd, rm);
}
+ void vcvt_unsignedToFloatingPoint(FPDoubleRegisterID rd, FPSingleRegisterID rm)
+ {
+ // boolean values are 64bit (toInt, unsigned, roundZero)
+ m_formatter.vfpOp(OP_VCVT_FPIVFP, OP_VCVT_FPIVFPb, true, vcvtOp(false, true, false), rd, rm);
+ }
+
void vcvt_floatingPointToUnsigned(FPSingleRegisterID rd, FPDoubleRegisterID rm)
{
// boolean values are 64bit (toInt, unsigned, roundZero)
m_assembler.vmov(fpTempRegister, dataTempRegister, dataTempRegister);
m_assembler.vcvt_signedToFloatingPoint(dest, fpTempRegisterAsSingle());
}
+
+ void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, RegisterID /*scratch*/)
+ {
+ m_assembler.vmov(fpTempRegister, src, src);
+ m_assembler.vcvt_unsignedToFloatingPoint(dest, fpTempRegisterAsSingle());
+ }
void convertFloatToDouble(FPRegisterID src, FPRegisterID dst)
{
dest);
return Assembler::Jump();
case V4IR::UInt32Type:
-#if CPU(X86_64) || CPU(X86)
_as->convertUInt32ToDouble(_as->toUInt32Register(src, Assembler::ScratchRegister),
dest, Assembler::ReturnValueRegister);
-#else
- Q_ASSERT(!"Not supported on this platform!");
-#endif
return Assembler::Jump();
case V4IR::BoolType:
// TODO?
void storeUInt32(RegisterID reg, Pointer addr)
{
// The UInt32 representation in QV4::Value is really convoluted. See also toUInt32Register.
-#if CPU(X86_64) | CPU(X86)
Jump intRange = branch32(GreaterThanOrEqual, reg, TrustedImm32(0));
convertUInt32ToDouble(reg, FPGpr0, ReturnValueRegister);
storeDouble(FPGpr0, addr);
intRange.link(this);
storeInt32(reg, addr);
done.link(this);
-#else
- Q_ASSERT(!"Not tested on this platform!");
- Q_UNUSED(reg)
- Q_UNUSED(addr)
-#endif
}
void storeUInt32(RegisterID reg, V4IR::Temp *target)
void convertUIntToDouble(V4IR::Temp *source, V4IR::Temp *target)
{
if (target->kind == V4IR::Temp::PhysicalRegister) {
-#if CPU(X86_64) || CPU(X86)
_as->convertUInt32ToDouble(_as->toInt32Register(source, Assembler::ScratchRegister),
(Assembler::FPRegisterID) target->index,
Assembler::ScratchRegister);
-#else
- Q_ASSERT(!"Not supported on this platform!");
- Q_UNUSED(source)
- Q_UNUSED(target)
-#endif
} else if (target->kind == V4IR::Temp::StackSlot) {
-#if CPU(X86_64) || CPU(X86)
_as->convertUInt32ToDouble(_as->toUInt32Register(source, Assembler::ScratchRegister),
Assembler::FPGpr0, Assembler::ScratchRegister);
_as->storeDouble(Assembler::FPGpr0, _as->stackSlotPointer(target));
-#else
- Q_ASSERT(!"Not supported on this platform!");
- Q_UNUSED(source)
- Q_UNUSED(target)
-#endif
} else {
Q_UNIMPLEMENTED();
}