@@ -1568,6 +1568,10 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
1568
1568
vretaddr = TRUE;
1569
1569
ret_type = LLVMVoidType ();
1570
1570
break ;
1571
+ case LLVMArgWasmVtypeAsScalar :
1572
+ g_assert (cinfo -> ret .esize );
1573
+ ret_type = LLVMIntType (cinfo -> ret .esize * 8 );
1574
+ break ;
1571
1575
default :
1572
1576
break ;
1573
1577
}
@@ -1685,6 +1689,10 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
1685
1689
case LLVMArgVtypeAsScalar :
1686
1690
g_assert_not_reached ();
1687
1691
break ;
1692
+ case LLVMArgWasmVtypeAsScalar :
1693
+ g_assert (ainfo -> esize );
1694
+ param_types [pindex ++ ] = LLVMIntType (ainfo -> esize * 8 );
1695
+ break ;
1688
1696
case LLVMArgGsharedvtFixed :
1689
1697
case LLVMArgGsharedvtFixedVtype :
1690
1698
param_types [pindex ++ ] = LLVMPointerType (type_to_llvm_arg_type (ctx , ainfo -> type ), 0 );
@@ -3825,6 +3833,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
3825
3833
char * name ;
3826
3834
3827
3835
pindex = ainfo -> pindex ;
3836
+ LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
3828
3837
3829
3838
switch (ainfo -> storage ) {
3830
3839
case LLVMArgVtypeInReg :
@@ -3883,6 +3892,16 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
3883
3892
case LLVMArgVtypeAsScalar :
3884
3893
g_assert_not_reached ();
3885
3894
break ;
3895
+ case LLVMArgWasmVtypeAsScalar : {
3896
+ MonoType * t = mini_get_underlying_type (ainfo -> type );
3897
+
3898
+ /* The argument is received as a scalar */
3899
+ ctx -> addresses [reg ] = build_alloca (ctx , t );
3900
+
3901
+ LLVMValueRef dest = convert (ctx , ctx -> addresses [reg ], LLVMPointerType (LLVMIntType (ainfo -> esize * 8 ), 0 ));
3902
+ LLVMBuildStore (ctx -> builder , arg , dest );
3903
+ break ;
3904
+ }
3886
3905
case LLVMArgGsharedvtFixed : {
3887
3906
/* These are non-gsharedvt arguments passed by ref, the rest of the IR treats them as scalars */
3888
3907
LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
@@ -4416,6 +4435,10 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
4416
4435
case LLVMArgVtypeAsScalar :
4417
4436
g_assert_not_reached ();
4418
4437
break ;
4438
+ case LLVMArgWasmVtypeAsScalar :
4439
+ g_assert (addresses [reg ]);
4440
+ args [pindex ] = LLVMBuildLoad (ctx -> builder , convert (ctx , addresses [reg ], LLVMPointerType (LLVMIntType (ainfo -> esize * 8 ), 0 )), "" );
4441
+ break ;
4419
4442
case LLVMArgGsharedvtFixed :
4420
4443
case LLVMArgGsharedvtFixedVtype :
4421
4444
g_assert (addresses [reg ]);
@@ -4565,6 +4588,11 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
4565
4588
case LLVMArgGsharedvtFixedVtype :
4566
4589
values [ins -> dreg ] = LLVMBuildLoad (builder , convert_full (ctx , addresses [call -> inst .dreg ], LLVMPointerType (type_to_llvm_type (ctx , sig -> ret ), 0 ), FALSE), "" );
4567
4590
break ;
4591
+ case LLVMArgWasmVtypeAsScalar :
4592
+ if (!addresses [call -> inst .dreg ])
4593
+ addresses [call -> inst .dreg ] = build_alloca (ctx , sig -> ret );
4594
+ LLVMBuildStore (builder , lcall , convert_full (ctx , addresses [call -> inst .dreg ], LLVMPointerType (LLVMTypeOf (lcall ), 0 ), FALSE));
4595
+ break ;
4568
4596
default :
4569
4597
if (sig -> ret -> type != MONO_TYPE_VOID )
4570
4598
/* If the method returns an unsigned value, need to zext it */
@@ -5691,7 +5719,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
5691
5719
switch (linfo -> ret .storage ) {
5692
5720
case LLVMArgNormal :
5693
5721
case LLVMArgVtypeInReg :
5694
- case LLVMArgVtypeAsScalar : {
5722
+ case LLVMArgVtypeAsScalar :
5723
+ case LLVMArgWasmVtypeAsScalar : {
5695
5724
LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method )));
5696
5725
LLVMValueRef retval = LLVMGetUndef (ret_type );
5697
5726
gboolean src_in_reg = FALSE;
@@ -5748,6 +5777,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
5748
5777
retval = LLVMBuildLoad (builder , LLVMBuildBitCast (builder , addresses [ins -> sreg1 ], LLVMPointerType (ret_type , 0 ), "" ), "" );
5749
5778
}
5750
5779
break ;
5780
+ case LLVMArgWasmVtypeAsScalar :
5781
+ g_assert (addresses [ins -> sreg1 ]);
5782
+ retval = LLVMBuildLoad (builder , LLVMBuildBitCast (builder , addresses [ins -> sreg1 ], LLVMPointerType (ret_type , 0 ), "" ), "" );
5783
+ break ;
5751
5784
}
5752
5785
LLVMBuildRet (builder , retval );
5753
5786
break ;
@@ -12163,6 +12196,7 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
12163
12196
case LLVMArgGsharedvtVariable :
12164
12197
case LLVMArgGsharedvtFixed :
12165
12198
case LLVMArgGsharedvtFixedVtype :
12199
+ case LLVMArgWasmVtypeAsScalar :
12166
12200
MONO_INST_NEW (cfg , ins , OP_LLVM_OUTARG_VT );
12167
12201
ins -> dreg = mono_alloc_ireg (cfg );
12168
12202
ins -> sreg1 = in -> dreg ;
0 commit comments