Index: vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (revision 646261) +++ vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (working copy) @@ -1166,6 +1166,14 @@ }else if (targetKind==OpndKind_Mem && sourceKind==OpndKind_FPReg){ targetOpnd->setMemOpndAlignment(Opnd::MemOpndAlignment_16); return newInst(Mnemonic_FSTP, targetOpnd, sourceOpnd); + }else if (targetKind==OpndKind_XMMReg && (sourceKind==OpndKind_Mem || sourceKind==OpndKind_GPReg)){ + if (sourceKind==OpndKind_Mem) + sourceOpnd->setMemOpndAlignment(Opnd::MemOpndAlignment_16); + return newInst(Mnemonic_MOVD, targetOpnd, sourceOpnd); + }else if ((targetKind==OpndKind_Mem || targetKind==OpndKind_GPReg) && sourceKind==OpndKind_XMMReg){ + if (targetKind==OpndKind_Mem) + targetOpnd->setMemOpndAlignment(Opnd::MemOpndAlignment_16); + return newInst(Mnemonic_MOVD, targetOpnd, sourceOpnd); }else if ( (targetKind==OpndKind_FPReg && sourceKind==OpndKind_XMMReg)|| (targetKind==OpndKind_XMMReg && sourceKind==OpndKind_FPReg) Index: vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp (revision 646261) +++ vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp (working copy) @@ -107,6 +107,8 @@ DECLARE_HELPER_INLINER(String_compareTo_Handler_x_String_x_I); DECLARE_HELPER_INLINER(String_regionMatches_Handler_x_I_x_String_x_I_x_I_x_Z); DECLARE_HELPER_INLINER(String_indexOf_Handler_x_String_x_I_x_I); +DECLARE_HELPER_INLINER(Float_floatToRawIntBits_x_F_x_I); +DECLARE_HELPER_INLINER(Float_intBitsToFloat_x_I_x_F); void APIMagicsHandlerSession::runImpl() { CompilationContext* cc = getCompilationContext(); @@ -152,6 +154,12 @@ } else if (!strcmp(methodName, "numberOfTrailingZeros") && !strcmp(signature, "(J)I")) { handlers.push_back(new (tmpMM) Long_numberOfTrailingZeros_Handler_x_J_x_I(irm, callInst, md)); } + } else if (!strcmp(className, "java/lang/Float")) { + if (!strcmp(methodName, "floatToRawIntBits") && !strcmp(signature, "(F)I")) { + handlers.push_back(new (tmpMM) Float_floatToRawIntBits_x_F_x_I(irm, callInst, md)); + } else if (!strcmp(methodName, "intBitsToFloat") && !strcmp(signature, "(I)F")) { + handlers.push_back(new (tmpMM) Float_intBitsToFloat_x_I_x_F(irm, callInst, md)); + } } else if (mathAsMagic && !strcmp(className, "java/lang/Math")) { if (!strcmp(signature, "(D)D")) { if (!strcmp(methodName, "sqrt")) { @@ -254,6 +262,24 @@ callInst->unlink(); } +void Float_floatToRawIntBits_x_F_x_I::run() { + + Opnd* arg = getCallSrc(callInst, 0); + Opnd* res = getCallDst(callInst); + + irm->newCopyPseudoInst(Mnemonic_MOV, res, arg)->insertBefore(callInst); + callInst->unlink(); +} + +void Float_intBitsToFloat_x_I_x_F::run() { + + Opnd* arg = getCallSrc(callInst, 0); + Opnd* res = getCallDst(callInst); + + irm->newCopyPseudoInst(Mnemonic_MOV, res, arg)->insertBefore(callInst); + callInst->unlink(); +} + void Math_Handler_x_D_x_D::run() { Opnd* arg = getCallSrc(callInst, 0); Opnd* res = getCallDst(callInst);