Skip to content

Commit d89493a

Browse files
committed
Implement gsharedvt-in support.
1 parent e81c022 commit d89493a

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

src/mono/mono/mini/mini-amd64-gsharedvt.c

+20-14
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ get_arg_slots (ArgInfo *ainfo, int **out_slots, gboolean is_source_argument)
163163
break;
164164
case ArgInDoubleSSEReg:
165165
case ArgInFloatSSEReg:
166+
case ArgSIMDInSSEReg:
166167
nsrc = 1;
167168
src = g_malloc (nsrc * sizeof (int));
168169
src [0] = map_freg (sreg);
@@ -224,20 +225,21 @@ static void
224225
handle_marshal_when_dst_gsharedvt (ArgInfo *src_info, int *arg_marshal)
225226
{
226227
switch (src_info->storage) {
227-
case ArgInIReg:
228-
case ArgInDoubleSSEReg:
229-
case ArgInFloatSSEReg:
230-
case ArgValuetypeInReg:
231-
case ArgOnStack:
232-
*arg_marshal = GSHAREDVT_ARG_BYVAL_TO_BYREF;
233-
break;
234-
case ArgValuetypeAddrInIReg:
235-
case ArgValuetypeAddrOnStack:
236-
*arg_marshal = GSHAREDVT_ARG_NONE;
237-
break;
238-
default:
239-
NOT_IMPLEMENTED; // See above
240-
break;
228+
case ArgInIReg:
229+
case ArgInDoubleSSEReg:
230+
case ArgInFloatSSEReg:
231+
case ArgSIMDInSSEReg:
232+
case ArgValuetypeInReg:
233+
case ArgOnStack:
234+
*arg_marshal = GSHAREDVT_ARG_BYVAL_TO_BYREF;
235+
break;
236+
case ArgValuetypeAddrInIReg:
237+
case ArgValuetypeAddrOnStack:
238+
*arg_marshal = GSHAREDVT_ARG_NONE;
239+
break;
240+
default:
241+
NOT_IMPLEMENTED; // See above
242+
break;
241243
}
242244
}
243245

@@ -331,6 +333,7 @@ mono_arch_get_gsharedvt_call_info (MonoMemoryManager *mem_manager, gpointer addr
331333
case ArgInIReg:
332334
case ArgInDoubleSSEReg:
333335
case ArgInFloatSSEReg:
336+
case ArgSIMDInSSEReg:
334337
case ArgValuetypeInReg:
335338
case ArgOnStack:
336339
nsrc = get_arg_slots (src_info, &src, TRUE);
@@ -500,6 +503,9 @@ mono_arch_get_gsharedvt_call_info (MonoMemoryManager *mem_manager, gpointer addr
500503
case ArgInFloatSSEReg:
501504
info->ret_marshal = GSHAREDVT_RET_R8;
502505
break;
506+
case ArgSIMDInSSEReg:
507+
info->ret_marshal = GSHAREDVT_RET_SIMD;
508+
break;
503509
case ArgValuetypeAddrInIReg:
504510
break;
505511
default:

src/mono/mono/mini/mini-amd64-gsharedvt.h

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ typedef enum {
3737
GSHAREDVT_RET_I8, // 8 byte integer
3838
GSHAREDVT_RET_IREGS_1, // Load in first return register
3939
GSHAREDVT_RET_R8, // Double
40+
GSHAREDVT_RET_SIMD, // SIMD
4041
GSHAREDVT_RET_NUM,
4142
} GSharedVtRetMarshal;
4243

src/mono/mono/mini/tramp-amd64-gsharedvt.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot)
224224

225225
/*callconv in regs */
226226
caller_reg_area_offset = offset;
227-
reg_area_size = ALIGN_TO ((n_arg_regs + n_arg_fregs) * 8, MONO_ARCH_FRAME_ALIGNMENT);
227+
reg_area_size = ALIGN_TO ((n_arg_regs * 8) + (n_arg_fregs * 16), MONO_ARCH_FRAME_ALIGNMENT);
228228
offset += reg_area_size;
229229

230230
framesize = offset;
@@ -266,7 +266,7 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot)
266266
amd64_mov_membase_reg (code, AMD64_RSP, caller_reg_area_offset + i * 8, param_regs [i], sizeof (target_mgreg_t));
267267

268268
for (i = 0; i < n_arg_fregs; ++i)
269-
amd64_sse_movsd_membase_reg (code, AMD64_RSP, caller_reg_area_offset + (i + n_arg_regs) * 8, i);
269+
amd64_sse_movups_membase_reg (code, AMD64_RSP, caller_reg_area_offset + (n_arg_regs * 8) + (i * 16), i);
270270

271271
/* TODO Allocate stack area used to pass arguments to the method */
272272

@@ -411,6 +411,9 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot)
411411
case GSHAREDVT_RET_R8:
412412
amd64_sse_movsd_reg_membase (code, AMD64_XMM0, AMD64_R11, 0);
413413
break;
414+
case GSHAREDVT_RET_SIMD:
415+
amd64_sse_movups_reg_membase (code, AMD64_XMM0, AMD64_R11, 0);
416+
break;
414417
default:
415418
x86_breakpoint (code); /* can't handle specific case */
416419
}

0 commit comments

Comments
 (0)