Skip to content

Commit d699e61

Browse files
author
Mark McCaskey
committed
Implement bulk memory instructions in compiler-llvm
1 parent b7321a5 commit d699e61

File tree

3 files changed

+165
-7
lines changed

3 files changed

+165
-7
lines changed

lib/compiler-llvm/src/translator/code.rs

+82
Original file line numberDiff line numberDiff line change
@@ -9388,6 +9388,88 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
93889388
size.add_attribute(AttributeLoc::Function, self.intrinsics.readonly);
93899389
self.state.push1(size.try_as_basic_value().left().unwrap());
93909390
}
9391+
Operator::MemoryInit { segment, mem } => {
9392+
let (dest, src, len) = self.state.pop3()?;
9393+
let mem = self
9394+
.intrinsics
9395+
.i32_ty
9396+
.const_int(mem.into(), false)
9397+
.as_basic_value_enum();
9398+
let segment = self
9399+
.intrinsics
9400+
.i32_ty
9401+
.const_int(segment.into(), false)
9402+
.as_basic_value_enum();
9403+
self.builder.build_call(
9404+
self.intrinsics.memory_init,
9405+
&[vmctx.as_basic_value_enum(), mem, segment, dest, src, len],
9406+
"",
9407+
);
9408+
}
9409+
Operator::DataDrop { segment } => {
9410+
let segment = self
9411+
.intrinsics
9412+
.i32_ty
9413+
.const_int(segment.into(), false)
9414+
.as_basic_value_enum();
9415+
self.builder.build_call(
9416+
self.intrinsics.data_drop,
9417+
&[vmctx.as_basic_value_enum(), segment],
9418+
"",
9419+
);
9420+
}
9421+
Operator::MemoryCopy { src, dst } => {
9422+
// ignored until we support multiple memories
9423+
let _dst = dst;
9424+
let (memory_copy, src) = if let Some(local_memory_index) = self
9425+
.wasm_module
9426+
.local_memory_index(MemoryIndex::from_u32(src))
9427+
{
9428+
(self.intrinsics.memory_copy, local_memory_index.as_u32())
9429+
} else {
9430+
(self.intrinsics.imported_memory_copy, src)
9431+
};
9432+
9433+
let (dest_pos, src_pos, len) = self.state.pop3()?;
9434+
let src_index = self
9435+
.intrinsics
9436+
.i32_ty
9437+
.const_int(src.into(), false)
9438+
.as_basic_value_enum();
9439+
self.builder.build_call(
9440+
memory_copy,
9441+
&[
9442+
vmctx.as_basic_value_enum(),
9443+
src_index,
9444+
dest_pos,
9445+
src_pos,
9446+
len,
9447+
],
9448+
"",
9449+
);
9450+
}
9451+
Operator::MemoryFill { mem } => {
9452+
let (memory_fill, mem) = if let Some(local_memory_index) = self
9453+
.wasm_module
9454+
.local_memory_index(MemoryIndex::from_u32(mem))
9455+
{
9456+
(self.intrinsics.memory_fill, local_memory_index.as_u32())
9457+
} else {
9458+
(self.intrinsics.imported_memory_fill, mem)
9459+
};
9460+
9461+
let (dst, val, len) = self.state.pop3()?;
9462+
let mem_index = self
9463+
.intrinsics
9464+
.i32_ty
9465+
.const_int(mem.into(), false)
9466+
.as_basic_value_enum();
9467+
self.builder.build_call(
9468+
memory_fill,
9469+
&[vmctx.as_basic_value_enum(), mem_index, dst, val, len],
9470+
"",
9471+
);
9472+
}
93919473
/***************************
93929474
* Reference types.
93939475
* https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md

lib/compiler-llvm/src/translator/intrinsics.rs

+83
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,15 @@ pub struct Intrinsics<'ctx> {
181181
pub imported_table_set: FunctionValue<'ctx>,
182182
pub table_grow: FunctionValue<'ctx>,
183183
pub imported_table_grow: FunctionValue<'ctx>,
184+
pub memory_init: FunctionValue<'ctx>,
185+
pub data_drop: FunctionValue<'ctx>,
184186
pub func_ref: FunctionValue<'ctx>,
185187
pub elem_drop: FunctionValue<'ctx>,
188+
pub memory_copy: FunctionValue<'ctx>,
189+
pub imported_memory_copy: FunctionValue<'ctx>,
190+
pub memory_fill: FunctionValue<'ctx>,
191+
pub imported_memory_fill: FunctionValue<'ctx>,
192+
186193
pub throw_trap: FunctionValue<'ctx>,
187194

188195
// VM builtins.
@@ -594,6 +601,82 @@ impl<'ctx> Intrinsics<'ctx> {
594601
),
595602
None,
596603
),
604+
memory_init: module.add_function(
605+
"wasmer_vm_memory32_init",
606+
void_ty.fn_type(
607+
&[
608+
ctx_ptr_ty.as_basic_type_enum(),
609+
i32_ty_basic,
610+
i32_ty_basic,
611+
i32_ty_basic,
612+
i32_ty_basic,
613+
i32_ty_basic,
614+
],
615+
false,
616+
),
617+
None,
618+
),
619+
memory_copy: module.add_function(
620+
"wasmer_vm_memory32_copy",
621+
void_ty.fn_type(
622+
&[
623+
ctx_ptr_ty.as_basic_type_enum(),
624+
i32_ty_basic,
625+
i32_ty_basic,
626+
i32_ty_basic,
627+
i32_ty_basic,
628+
],
629+
false,
630+
),
631+
None,
632+
),
633+
imported_memory_copy: module.add_function(
634+
"wasmer_vm_imported_memory32_copy",
635+
void_ty.fn_type(
636+
&[
637+
ctx_ptr_ty.as_basic_type_enum(),
638+
i32_ty_basic,
639+
i32_ty_basic,
640+
i32_ty_basic,
641+
i32_ty_basic,
642+
],
643+
false,
644+
),
645+
None,
646+
),
647+
memory_fill: module.add_function(
648+
"wasmer_vm_memory32_fill",
649+
void_ty.fn_type(
650+
&[
651+
ctx_ptr_ty.as_basic_type_enum(),
652+
i32_ty_basic,
653+
i32_ty_basic,
654+
i32_ty_basic,
655+
i32_ty_basic,
656+
],
657+
false,
658+
),
659+
None,
660+
),
661+
imported_memory_fill: module.add_function(
662+
"wasmer_vm_imported_memory32_fill",
663+
void_ty.fn_type(
664+
&[
665+
ctx_ptr_ty.as_basic_type_enum(),
666+
i32_ty_basic,
667+
i32_ty_basic,
668+
i32_ty_basic,
669+
i32_ty_basic,
670+
],
671+
false,
672+
),
673+
None,
674+
),
675+
data_drop: module.add_function(
676+
"wasmer_vm_data_drop",
677+
void_ty.fn_type(&[ctx_ptr_ty.as_basic_type_enum(), i32_ty_basic], false),
678+
None,
679+
),
597680
func_ref: module.add_function(
598681
"wasmer_vm_func_ref",
599682
funcref_ty.fn_type(&[ctx_ptr_ty.as_basic_type_enum(), i32_ty_basic], false),

tests/ignores.txt

-7
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ wasitests::snapshot1::unix_open_special_files on windows
9797

9898
# Updated spectests
9999

100-
# bulk memory
101-
cranelift::spec::bulk
102100
# new simd
103101
cranelift::spec::simd::simd_align
104102
cranelift::spec::simd::simd_conversions
@@ -134,11 +132,6 @@ cranelift::spec::simd::simd_store32_lane
134132
cranelift::spec::simd::simd_store64_lane
135133
cranelift::spec::simd::simd_store8_lane
136134

137-
# bulk memory
138-
llvm::spec::bulk
139-
llvm::spec::memory_copy
140-
llvm::spec::memory_fill
141-
llvm::spec::memory_init
142135
# new simd
143136
llvm::spec::simd::simd_align
144137
llvm::spec::simd::simd_conversions

0 commit comments

Comments
 (0)