@@ -1427,15 +1427,18 @@ convert (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype)
14271427}
14281428
14291429static 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)
14311431{
14321432 LLVMValueRef args [5];
14331433 int aindex = 0;
14341434
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);
14371440 args [aindex ++] = size;
1438- args [aindex ++] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
1441+ args [aindex ++] = LLVMConstInt (LLVMInt1Type (), 0, FALSE); // is_volatile
14391442 call_intrins (ctx, INTRINS_MEMSET, args, "");
14401443}
14411444
@@ -6159,7 +6162,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
61596162 * load it into registers.
61606163 */
61616164 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);
61636166
61646167 int width = mono_type_size (sig->ret, NULL);
61656168 LLVMValueRef args [] = {
@@ -7000,7 +7003,7 @@ MONO_RESTORE_WARNING
70007003 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), const_int32 (size), MONO_ARCH_FRAME_ALIGNMENT, "");
70017004
70027005 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);
70047007
70057008 values [ins->dreg] = v;
70067009 break;
@@ -7013,7 +7016,7 @@ MONO_RESTORE_WARNING
70137016 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), size, MONO_ARCH_FRAME_ALIGNMENT, "");
70147017
70157018 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);
70177020 values [ins->dreg] = v;
70187021 break;
70197022 }
@@ -7231,6 +7234,19 @@ MONO_RESTORE_WARNING
72317234 call_intrins (ctx, INTRINS_MEMMOVE, args, "");
72327235 break;
72337236 }
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+ }
72347250 case OP_NOT_REACHED:
72357251 LLVMBuildUnreachable (builder);
72367252 has_terminator = TRUE;
@@ -7863,7 +7879,7 @@ MONO_RESTORE_WARNING
78637879 addresses [ins->dreg] = create_address (ctx, build_named_alloca (ctx, m_class_get_byval_arg (klass), "vzero"), etype);
78647880 }
78657881 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);
78677883 break;
78687884 }
78697885 case OP_DUMMY_VZERO:
0 commit comments