Skip to content

Commit 87d57e2

Browse files
committed
Have mono handle ConvertToIntegerNative for Double and Single
1 parent b274938 commit 87d57e2

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

src/mono/mono/mini/intrinsics.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,67 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
23222322
return ins;
23232323
}
23242324
}
2325+
} else if ((cmethod->klass == mono_defaults.double_class) || (cmethod->klass == mono_defaults.single_class)) {
2326+
MonoGenericContext *method_context = mono_method_get_context (cmethod);
2327+
if (!strcmp (cmethod->name, "ConvertToIntegerNative") &&
2328+
method_context != NULL &&
2329+
method_context->method_inst->type_argc == 1) {
2330+
int opcode = 0;
2331+
MonoTypeEnum tto_type = method_context->method_inst->type_argv [0]->type;
2332+
MonoStackType tto_stack = STACK_I4;
2333+
switch (tto_type) {
2334+
case MONO_TYPE_I:
2335+
if (TARGET_SIZEOF_VOID_P == 4) {
2336+
opcode = OP_FCONV_TO_I4;
2337+
} else {
2338+
opcode = OP_FCONV_TO_I8;
2339+
tto_stack = STACK_I8;
2340+
}
2341+
break;
2342+
case MONO_TYPE_I1:
2343+
opcode = OP_FCONV_TO_I1;
2344+
break;
2345+
case MONO_TYPE_I2:
2346+
opcode = OP_FCONV_TO_I2;
2347+
break;
2348+
case MONO_TYPE_I4:
2349+
opcode = OP_FCONV_TO_I4;
2350+
break;
2351+
case MONO_TYPE_I8:
2352+
opcode = OP_FCONV_TO_I8;
2353+
tto_stack = STACK_I8;
2354+
break;
2355+
case MONO_TYPE_U:
2356+
if (TARGET_SIZEOF_VOID_P == 4) {
2357+
opcode = OP_FCONV_TO_U4;
2358+
} else {
2359+
opcode = OP_FCONV_TO_U8;
2360+
tto_stack = STACK_I8;
2361+
}
2362+
break;
2363+
case MONO_TYPE_U1:
2364+
opcode = OP_FCONV_TO_U1;
2365+
break;
2366+
case MONO_TYPE_U2:
2367+
opcode = OP_FCONV_TO_U2;
2368+
break;
2369+
case MONO_TYPE_U4:
2370+
opcode = OP_FCONV_TO_U4;
2371+
break;
2372+
case MONO_TYPE_U8:
2373+
opcode = OP_FCONV_TO_U8;
2374+
tto_stack = STACK_I8;
2375+
break;
2376+
default: return NULL;
2377+
}
2378+
2379+
if (opcode != 0) {
2380+
int ireg = mono_alloc_ireg (cfg);
2381+
EMIT_NEW_UNALU (cfg, ins, opcode, ireg, args [0]->dreg);
2382+
ins->type = tto_stack;
2383+
return ins;
2384+
}
2385+
}
23252386
}
23262387

23272388
ins = mono_emit_simd_intrinsics (cfg, cmethod, fsig, args);

0 commit comments

Comments
 (0)