From afbfcefb0362ac217b44183eab94c228f5677695 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Thu, 29 Oct 2020 17:14:04 -0700 Subject: [PATCH] Implement new SIMD zero-extend loads. --- lib/compiler-llvm/src/translator/code.rs | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lib/compiler-llvm/src/translator/code.rs b/lib/compiler-llvm/src/translator/code.rs index b20f3f779a2..7a4e1549389 100644 --- a/lib/compiler-llvm/src/translator/code.rs +++ b/lib/compiler-llvm/src/translator/code.rs @@ -7188,6 +7188,54 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> { let res = self.builder.build_bitcast(res, self.intrinsics.i128_ty, ""); self.state.push1(res); } + Operator::V128Load32Zero { ref memarg } => { + let offset = self.state.pop1()?.into_int_value(); + let memory_index = MemoryIndex::from_u32(0); + let effective_address = self.resolve_memory_ptr( + memory_index, + memarg, + self.intrinsics.i32_ptr_ty, + offset, + 4, + )?; + let elem = self.builder.build_load(effective_address, ""); + self.annotate_user_memaccess( + memory_index, + memarg, + 1, + elem.as_instruction_value().unwrap(), + )?; + let res = self.builder.build_int_z_extend( + elem.into_int_value(), + self.intrinsics.i128_ty, + "", + ); + self.state.push1(res); + } + Operator::V128Load64Zero { ref memarg } => { + let offset = self.state.pop1()?.into_int_value(); + let memory_index = MemoryIndex::from_u32(0); + let effective_address = self.resolve_memory_ptr( + memory_index, + memarg, + self.intrinsics.i64_ptr_ty, + offset, + 8, + )?; + let elem = self.builder.build_load(effective_address, ""); + self.annotate_user_memaccess( + memory_index, + memarg, + 1, + elem.as_instruction_value().unwrap(), + )?; + let res = self.builder.build_int_z_extend( + elem.into_int_value(), + self.intrinsics.i128_ty, + "", + ); + self.state.push1(res); + } Operator::V128Load8Splat { ref memarg } => { let offset = self.state.pop1()?.into_int_value(); let memory_index = MemoryIndex::from_u32(0);