@@ -1427,15 +1427,18 @@ convert (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype)
1427
1427
}
1428
1428
1429
1429
static void
1430
- emit_memset (EmitContext *ctx, LLVMValueRef v , LLVMValueRef size, int alignment)
1430
+ emit_memset (EmitContext *ctx, LLVMValueRef dest, LLVMValueRef val , LLVMValueRef size, int alignment)
1431
1431
{
1432
1432
LLVMValueRef args [5];
1433
1433
int aindex = 0;
1434
1434
1435
- args [aindex ++] = v;
1436
- args [aindex ++] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
1435
+ args [aindex ++] = dest;
1436
+ if (val)
1437
+ args [aindex ++] = val;
1438
+ else
1439
+ args [aindex ++] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
1437
1440
args [aindex ++] = size;
1438
- args [aindex ++] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
1441
+ args [aindex ++] = LLVMConstInt (LLVMInt1Type (), 0, FALSE); // is_volatile
1439
1442
call_intrins (ctx, INTRINS_MEMSET, args, "");
1440
1443
}
1441
1444
@@ -6159,7 +6162,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
6159
6162
* load it into registers.
6160
6163
*/
6161
6164
LLVMValueRef buf = build_alloca_llvm_type_name (ctx, pointer_type (ret_type), 0, "ret_buf");
6162
- emit_memset (ctx, buf, LLVMSizeOf (ret_type), 1);
6165
+ emit_memset (ctx, buf, NULL, LLVMSizeOf (ret_type), 1);
6163
6166
6164
6167
int width = mono_type_size (sig->ret, NULL);
6165
6168
LLVMValueRef args [] = {
@@ -7000,7 +7003,7 @@ MONO_RESTORE_WARNING
7000
7003
v = mono_llvm_build_alloca (builder, LLVMInt8Type (), const_int32 (size), MONO_ARCH_FRAME_ALIGNMENT, "");
7001
7004
7002
7005
if (ins->flags & MONO_INST_INIT)
7003
- emit_memset (ctx, v, const_int32 (size), MONO_ARCH_FRAME_ALIGNMENT);
7006
+ emit_memset (ctx, v, NULL, const_int32 (size), MONO_ARCH_FRAME_ALIGNMENT);
7004
7007
7005
7008
values [ins->dreg] = v;
7006
7009
break;
@@ -7013,7 +7016,7 @@ MONO_RESTORE_WARNING
7013
7016
v = mono_llvm_build_alloca (builder, LLVMInt8Type (), size, MONO_ARCH_FRAME_ALIGNMENT, "");
7014
7017
7015
7018
if (ins->flags & MONO_INST_INIT)
7016
- emit_memset (ctx, v, size, MONO_ARCH_FRAME_ALIGNMENT);
7019
+ emit_memset (ctx, v, NULL, size, MONO_ARCH_FRAME_ALIGNMENT);
7017
7020
values [ins->dreg] = v;
7018
7021
break;
7019
7022
}
@@ -7231,6 +7234,19 @@ MONO_RESTORE_WARNING
7231
7234
call_intrins (ctx, INTRINS_MEMMOVE, args, "");
7232
7235
break;
7233
7236
}
7237
+ case OP_MEMSET_ZERO: {
7238
+ LLVMValueRef dest = convert (ctx, values [ins->sreg1], pointer_type (LLVMInt8Type ()));
7239
+ LLVMValueRef size = convert (ctx, values [ins->sreg2], LLVMInt64Type ());
7240
+ emit_memset (ctx, dest, NULL, size, MONO_ARCH_FRAME_ALIGNMENT);
7241
+ break;
7242
+ }
7243
+ case OP_MEMSET: {
7244
+ LLVMValueRef dest = convert (ctx, values [ins->sreg1], pointer_type (LLVMInt8Type ()));
7245
+ LLVMValueRef val = convert (ctx, values [ins->sreg2], LLVMInt8Type ());
7246
+ LLVMValueRef size = convert (ctx, values [ins->sreg3], LLVMInt64Type ());
7247
+ emit_memset (ctx, dest, val, size, MONO_ARCH_FRAME_ALIGNMENT);
7248
+ break;
7249
+ }
7234
7250
case OP_NOT_REACHED:
7235
7251
LLVMBuildUnreachable (builder);
7236
7252
has_terminator = TRUE;
@@ -7863,7 +7879,7 @@ MONO_RESTORE_WARNING
7863
7879
addresses [ins->dreg] = create_address (ctx, build_named_alloca (ctx, m_class_get_byval_arg (klass), "vzero"), etype);
7864
7880
}
7865
7881
LLVMValueRef ptr = build_ptr_cast (builder, addresses [ins->dreg]->value, pointer_type (LLVMInt8Type ()));
7866
- emit_memset (ctx, ptr, const_int32 (mono_class_value_size (klass, NULL)), 0);
7882
+ emit_memset (ctx, ptr, NULL, const_int32 (mono_class_value_size (klass, NULL)), 0);
7867
7883
break;
7868
7884
}
7869
7885
case OP_DUMMY_VZERO:
0 commit comments