@@ -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 );
@@ -3820,6 +3828,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
3820
3828
char * name ;
3821
3829
3822
3830
pindex = ainfo -> pindex ;
3831
+ LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
3823
3832
3824
3833
switch (ainfo -> storage ) {
3825
3834
case LLVMArgVtypeInReg :
@@ -3878,6 +3887,16 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
3878
3887
case LLVMArgVtypeAsScalar :
3879
3888
g_assert_not_reached ();
3880
3889
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
+ }
3881
3900
case LLVMArgGsharedvtFixed : {
3882
3901
/* These are non-gsharedvt arguments passed by ref, the rest of the IR treats them as scalars */
3883
3902
LLVMValueRef arg = LLVMGetParam (ctx -> lmethod , pindex );
@@ -4411,6 +4430,10 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
4411
4430
case LLVMArgVtypeAsScalar :
4412
4431
g_assert_not_reached ();
4413
4432
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 ;
4414
4437
case LLVMArgGsharedvtFixed :
4415
4438
case LLVMArgGsharedvtFixedVtype :
4416
4439
g_assert (addresses [reg ]);
@@ -4560,6 +4583,11 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
4560
4583
case LLVMArgGsharedvtFixedVtype :
4561
4584
values [ins -> dreg ] = LLVMBuildLoad (builder , convert_full (ctx , addresses [call -> inst .dreg ], LLVMPointerType (type_to_llvm_type (ctx , sig -> ret ), 0 ), FALSE), "" );
4562
4585
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 ;
4563
4591
default :
4564
4592
if (sig -> ret -> type != MONO_TYPE_VOID )
4565
4593
/* If the method returns an unsigned value, need to zext it */
@@ -5686,7 +5714,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
5686
5714
switch (linfo -> ret .storage ) {
5687
5715
case LLVMArgNormal :
5688
5716
case LLVMArgVtypeInReg :
5689
- case LLVMArgVtypeAsScalar : {
5717
+ case LLVMArgVtypeAsScalar :
5718
+ case LLVMArgWasmVtypeAsScalar : {
5690
5719
LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method )));
5691
5720
LLVMValueRef retval = LLVMGetUndef (ret_type );
5692
5721
gboolean src_in_reg = FALSE;
@@ -5743,6 +5772,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
5743
5772
retval = LLVMBuildLoad (builder , LLVMBuildBitCast (builder , addresses [ins -> sreg1 ], LLVMPointerType (ret_type , 0 ), "" ), "" );
5744
5773
}
5745
5774
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 ;
5746
5779
}
5747
5780
LLVMBuildRet (builder , retval );
5748
5781
break ;
@@ -12158,6 +12191,7 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
12158
12191
case LLVMArgGsharedvtVariable :
12159
12192
case LLVMArgGsharedvtFixed :
12160
12193
case LLVMArgGsharedvtFixedVtype :
12194
+ case LLVMArgWasmVtypeAsScalar :
12161
12195
MONO_INST_NEW (cfg , ins , OP_LLVM_OUTARG_VT );
12162
12196
ins -> dreg = mono_alloc_ireg (cfg );
12163
12197
ins -> sreg1 = in -> dreg ;
0 commit comments