Add SPLIT pass to split 64 bit IR instructions for 32 bit CPUs.

Add generic HIOP instruction for extra backend functionality.
Add support for HIOP to x86 backend.
Use POWI for 64 bit integer x^k, too.
POWI is lowered to a call by SPLIT or the x64 backend.
This commit is contained in:
Mike Pall
2011-02-02 02:29:37 +01:00
parent c539c0cac8
commit b613216efc
14 changed files with 795 additions and 116 deletions

View File

@@ -538,6 +538,13 @@ LJFOLDF(kfold_conv_knum_int_num)
}
}
LJFOLD(CONV KNUM IRCONV_U32_NUM)
LJFOLDF(kfold_conv_knum_u32_num)
{
lua_assert((fins->op2 & IRCONV_TRUNC));
return INTFOLD((int32_t)(uint32_t)knumleft);
}
LJFOLD(CONV KNUM IRCONV_I64_NUM)
LJFOLDF(kfold_conv_knum_i64_num)
{
@@ -805,6 +812,7 @@ LJFOLDF(simplify_conv_u32_num)
}
LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/
LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32*/
LJFOLDF(simplify_conv_i64_num)
{
PHIBARRIER(fleft);
@@ -826,23 +834,6 @@ LJFOLDF(simplify_conv_i64_num)
return NEXTFOLD;
}
LJFOLD(CONV CONV IRCONV_U64_NUM) /* _U32*/
LJFOLDF(simplify_conv_u64_num)
{
PHIBARRIER(fleft);
if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {
#if LJ_TARGET_X64
return fleft->op1;
#else
/* Reduce to a zero-extension. */
fins->op1 = fleft->op1;
fins->op2 = (IRT_U64<<5)|IRT_U32;
return RETRYFOLD;
#endif
}
return NEXTFOLD;
}
/* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */
LJFOLD(TOBIT CONV KNUM)
LJFOLDF(simplify_tobit_conv)