@@ -1568,6 +1568,10 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
15681568 vretaddr = TRUE;
15691569 ret_type = LLVMVoidType ();
15701570 break ;
1571+ case LLVMArgWasmVtypeAsScalar :
1572+ g_assert (cinfo -> ret .esize );
1573+ ret_type = LLVMIntType (cinfo -> ret .esize * 8 );
1574+ break ;
15711575 default :
15721576 break ;
15731577 }
@@ -1685,6 +1689,10 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
16851689 case LLVMArgVtypeAsScalar :
16861690 g_assert_not_reached ();
16871691 break ;
1692+ case LLVMArgWasmVtypeAsScalar :
1693+ g_assert (ainfo -> esize );
1694+ param_types [pindex ++ ] = LLVMIntType (ainfo -> esize * 8 );
1695+ break ;
16881696 case LLVMArgGsharedvtFixed :
16891697 case LLVMArgGsharedvtFixedVtype :
16901698 param_types [pindex ++ ] = LLVMPointerType (type_to_llvm_arg_type (ctx , ainfo -> type ), 0 );
@@ -3820,6 +3828,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
38203828 char * name ;
38213829
38223830 pindex = ainfo -> pindex ;
3831+ LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
38233832
38243833 switch (ainfo -> storage ) {
38253834 case LLVMArgVtypeInReg :
@@ -3878,6 +3887,16 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
38783887 case LLVMArgVtypeAsScalar :
38793888 g_assert_not_reached ();
38803889 break ;
3890+ case LLVMArgWasmVtypeAsScalar : {
3891+ MonoType * t = mini_get_underlying_type (ainfo -> type );
3892+
3893+ /* The argument is received as a scalar */
3894+ ctx -> addresses [reg ] = build_alloca (ctx , t );
3895+
3896+ LLVMValueRef dest = convert (ctx , ctx -> addresses [reg ], LLVMPointerType (LLVMIntType (ainfo -> esize * 8 ), 0 ));
3897+ LLVMBuildStore (ctx -> builder , arg , dest );
3898+ break ;
3899+ }
38813900 case LLVMArgGsharedvtFixed : {
38823901 /* These are non-gsharedvt arguments passed by ref, the rest of the IR treats them as scalars */
38833902 LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
@@ -4411,6 +4430,10 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
44114430 case LLVMArgVtypeAsScalar :
44124431 g_assert_not_reached ();
44134432 break ;
4433+ case LLVMArgWasmVtypeAsScalar :
4434+ g_assert (addresses [reg ]);
4435+ args [pindex ] = LLVMBuildLoad (ctx -> builder , convert (ctx , addresses [reg ], LLVMPointerType (LLVMIntType (ainfo -> esize * 8 ), 0 )), "" );
4436+ break ;
44144437 case LLVMArgGsharedvtFixed :
44154438 case LLVMArgGsharedvtFixedVtype :
44164439 g_assert (addresses [reg ]);
@@ -4560,6 +4583,11 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
45604583 case LLVMArgGsharedvtFixedVtype :
45614584 values [ins -> dreg ] = LLVMBuildLoad (builder , convert_full (ctx , addresses [call -> inst .dreg ], LLVMPointerType (type_to_llvm_type (ctx , sig -> ret ), 0 ), FALSE), "" );
45624585 break ;
4586+ case LLVMArgWasmVtypeAsScalar :
4587+ if (!addresses [call -> inst .dreg ])
4588+ addresses [call -> inst .dreg ] = build_alloca (ctx , sig -> ret );
4589+ LLVMBuildStore (builder , lcall , convert_full (ctx , addresses [call -> inst .dreg ], LLVMPointerType (LLVMTypeOf (lcall ), 0 ), FALSE));
4590+ break ;
45634591 default :
45644592 if (sig -> ret -> type != MONO_TYPE_VOID )
45654593 /* If the method returns an unsigned value, need to zext it */
@@ -5686,7 +5714,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
56865714 switch (linfo -> ret .storage ) {
56875715 case LLVMArgNormal :
56885716 case LLVMArgVtypeInReg :
5689- case LLVMArgVtypeAsScalar : {
5717+ case LLVMArgVtypeAsScalar :
5718+ case LLVMArgWasmVtypeAsScalar : {
56905719 LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method )));
56915720 LLVMValueRef retval = LLVMGetUndef (ret_type );
56925721 gboolean src_in_reg = FALSE;
@@ -5743,6 +5772,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
57435772 retval = LLVMBuildLoad (builder , LLVMBuildBitCast (builder , addresses [ins -> sreg1 ], LLVMPointerType (ret_type , 0 ), "" ), "" );
57445773 }
57455774 break ;
5775+ case LLVMArgWasmVtypeAsScalar :
5776+ g_assert (addresses [ins -> sreg1 ]);
5777+ retval = LLVMBuildLoad (builder , LLVMBuildBitCast (builder , addresses [ins -> sreg1 ], LLVMPointerType (ret_type , 0 ), "" ), "" );
5778+ break ;
57465779 }
57475780 LLVMBuildRet (builder , retval );
57485781 break ;
@@ -12158,6 +12191,7 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
1215812191 case LLVMArgGsharedvtVariable :
1215912192 case LLVMArgGsharedvtFixed :
1216012193 case LLVMArgGsharedvtFixedVtype :
12194+ case LLVMArgWasmVtypeAsScalar :
1216112195 MONO_INST_NEW (cfg , ins , OP_LLVM_OUTARG_VT );
1216212196 ins -> dreg = mono_alloc_ireg (cfg );
1216312197 ins -> sreg1 = in -> dreg ;
0 commit comments