|
@@ -82,10 +82,15 @@ typedef enum {
|
|
MOVSD,
|
|
MOVSD,
|
|
MOVSS,
|
|
MOVSS,
|
|
COMISD,
|
|
COMISD,
|
|
|
|
+ COMISS,
|
|
ADDSD,
|
|
ADDSD,
|
|
SUBSD,
|
|
SUBSD,
|
|
MULSD,
|
|
MULSD,
|
|
DIVSD,
|
|
DIVSD,
|
|
|
|
+ ADDSS,
|
|
|
|
+ SUBSS,
|
|
|
|
+ MULSS,
|
|
|
|
+ DIVSS,
|
|
XORPD,
|
|
XORPD,
|
|
CVTSI2SD,
|
|
CVTSI2SD,
|
|
CVTSI2SS,
|
|
CVTSI2SS,
|
|
@@ -405,10 +410,15 @@ static opform OP_FORMS[_CPU_LAST] = {
|
|
{ "MOVSD", 0xF20F10, 0xF20F11 },
|
|
{ "MOVSD", 0xF20F10, 0xF20F11 },
|
|
{ "MOVSS", 0xF30F10, 0xF30F11 },
|
|
{ "MOVSS", 0xF30F10, 0xF30F11 },
|
|
{ "COMISD", 0x660F2F },
|
|
{ "COMISD", 0x660F2F },
|
|
|
|
+ { "COMISS", LONG_OP(0x0F2F) },
|
|
{ "ADDSD", 0xF20F58 },
|
|
{ "ADDSD", 0xF20F58 },
|
|
{ "SUBSD", 0xF20F5C },
|
|
{ "SUBSD", 0xF20F5C },
|
|
{ "MULSD", 0xF20F59 },
|
|
{ "MULSD", 0xF20F59 },
|
|
{ "DIVSD", 0xF20F5E },
|
|
{ "DIVSD", 0xF20F5E },
|
|
|
|
+ { "ADDSS", 0xF30F58 },
|
|
|
|
+ { "SUBSS", 0xF30F5C },
|
|
|
|
+ { "MULSS", 0xF30F59 },
|
|
|
|
+ { "DIVSS", 0xF30F5E },
|
|
{ "XORPD", 0x660F57 },
|
|
{ "XORPD", 0x660F57 },
|
|
{ "CVTSI2SD", 0xF20F2A },
|
|
{ "CVTSI2SD", 0xF20F2A },
|
|
{ "CVTSI2SS", 0xF30F2A },
|
|
{ "CVTSI2SS", 0xF30F2A },
|
|
@@ -1352,25 +1362,26 @@ static preg *op_binop( jit_ctx *ctx, vreg *dst, vreg *a, vreg *b, hl_opcode *op
|
|
preg *pa = fetch(a), *pb = fetch(b), *out = NULL;
|
|
preg *pa = fetch(a), *pb = fetch(b), *out = NULL;
|
|
CpuOp o;
|
|
CpuOp o;
|
|
if( IS_FLOAT(a) ) {
|
|
if( IS_FLOAT(a) ) {
|
|
|
|
+ bool isf32 = a->t->kind == HF32;
|
|
switch( op->op ) {
|
|
switch( op->op ) {
|
|
- case OAdd: o = ADDSD; break;
|
|
|
|
- case OSub: o = SUBSD; break;
|
|
|
|
- case OMul: o = MULSD; break;
|
|
|
|
- case OSDiv: o = DIVSD; break;
|
|
|
|
|
|
+ case OAdd: o = isf32 ? ADDSS : ADDSD; break;
|
|
|
|
+ case OSub: o = isf32 ? SUBSS : SUBSD; break;
|
|
|
|
+ case OMul: o = isf32 ? MULSS : MULSD; break;
|
|
|
|
+ case OSDiv: o = isf32 ? DIVSS : DIVSD; break;
|
|
case OJSLt:
|
|
case OJSLt:
|
|
case OJSGte:
|
|
case OJSGte:
|
|
case OJSLte:
|
|
case OJSLte:
|
|
case OJSGt:
|
|
case OJSGt:
|
|
case OJEq:
|
|
case OJEq:
|
|
case OJNotEq:
|
|
case OJNotEq:
|
|
- o = COMISD;
|
|
|
|
|
|
+ o = isf32 ? COMISS : COMISD;
|
|
break;
|
|
break;
|
|
case OSMod:
|
|
case OSMod:
|
|
{
|
|
{
|
|
int args[] = { a->stack.id, b->stack.id };
|
|
int args[] = { a->stack.id, b->stack.id };
|
|
int size = prepare_call_args(ctx,2,args,ctx->vregs,true,0);
|
|
int size = prepare_call_args(ctx,2,args,ctx->vregs,true,0);
|
|
void *mod_fun;
|
|
void *mod_fun;
|
|
- if( a->t->kind == HF32 ) mod_fun = fmodf; else mod_fun = fmod;
|
|
|
|
|
|
+ if( isf32 ) mod_fun = fmodf; else mod_fun = fmod;
|
|
call_native(ctx,mod_fun,size);
|
|
call_native(ctx,mod_fun,size);
|
|
store_result(ctx,dst);
|
|
store_result(ctx,dst);
|
|
return fetch(dst);
|
|
return fetch(dst);
|