NxStream& UserStream::storeVector3(const Vector3& f) { storeFloat(f.X); storeFloat(f.Y); storeFloat(f.Z); return *this; }
static bool genArithOpFloat(CompilationUnit *cUnit, MIR *mir, int vDest, int vSrc1, int vSrc2) { int op = THUMB_BKPT; /* * Don't attempt to optimize register usage since these opcodes call out to * the handlers. */ switch (mir->dalvikInsn.opCode) { case OP_ADD_FLOAT_2ADDR: case OP_ADD_FLOAT: op = THUMB2_VADDS; break; case OP_SUB_FLOAT_2ADDR: case OP_SUB_FLOAT: op = THUMB2_VSUBS; break; case OP_DIV_FLOAT_2ADDR: case OP_DIV_FLOAT: op = THUMB2_VDIVS; break; case OP_MUL_FLOAT_2ADDR: case OP_MUL_FLOAT: op = THUMB2_VMULS; break; case OP_REM_FLOAT_2ADDR: case OP_REM_FLOAT: case OP_NEG_FLOAT: { return genArithOpFloatPortable(cUnit, mir, vDest, vSrc1, vSrc2); } default: return true; } loadFloat(cUnit, vSrc1, fr2); loadFloat(cUnit, vSrc2, fr4); newLIR3(cUnit, op, fr0, fr2, fr4); storeFloat(cUnit, fr0, vDest, 0); return false; }
static bool genConversion(CompilationUnit *cUnit, MIR *mir) { OpCode opCode = mir->dalvikInsn.opCode; int vSrc1Dest = mir->dalvikInsn.vA; int vSrc2 = mir->dalvikInsn.vB; int op = THUMB_BKPT; bool longSrc = false; bool longDest = false; int srcReg; int tgtReg; switch (opCode) { case OP_INT_TO_FLOAT: longSrc = false; longDest = false; op = THUMB2_VCVTIF; break; case OP_FLOAT_TO_INT: longSrc = false; longDest = false; op = THUMB2_VCVTFI; break; case OP_DOUBLE_TO_FLOAT: longSrc = true; longDest = false; op = THUMB2_VCVTDF; break; case OP_FLOAT_TO_DOUBLE: longSrc = false; longDest = true; op = THUMB2_VCVTFD; break; case OP_INT_TO_DOUBLE: longSrc = false; longDest = true; op = THUMB2_VCVTID; break; case OP_DOUBLE_TO_INT: longSrc = true; longDest = false; op = THUMB2_VCVTDI; break; case OP_FLOAT_TO_LONG: case OP_LONG_TO_FLOAT: case OP_DOUBLE_TO_LONG: case OP_LONG_TO_DOUBLE: return genConversionPortable(cUnit, mir); default: return true; } if (longSrc) { srcReg = dr1; loadDouble(cUnit, vSrc2, srcReg); } else { srcReg = fr2; loadFloat(cUnit, vSrc2, srcReg); } if (longDest) { newLIR2(cUnit, op, dr0, srcReg); storeDouble(cUnit, dr0, vSrc1Dest, 0); } else { newLIR2(cUnit, op, fr0, srcReg); storeFloat(cUnit, fr0, vSrc1Dest, 0); } return false; }
/// Store a floating point value wrapper. /// /// \param name1 First name. /// \param name2 Second name. /// \param name3 Third name. /// \param value Vector to store. void storeFloat(char name1, char name2, char name3, const vec3 &value) { storeFloat(name1, value[0]); storeFloat(name2, value[1]); storeFloat(name3, value[2]); }