about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/base.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/base.rs b/src/base.rs
index ba7c82d24c5..8b5ae9e0541 100644
--- a/src/base.rs
+++ b/src/base.rs
@@ -837,10 +837,21 @@ fn codegen_stmt<'tcx>(
           dst,
           count,
         }) => {
-            let dst = codegen_operand(fx, dst).load_scalar(fx);
+            let dst = codegen_operand(fx, dst);
+            let pointee = dst
+              .layout()
+              .pointee_info_at(fx, rustc_target::abi::Size::ZERO)
+              .expect("Expected pointer");
+            let dst = dst.load_scalar(fx);
             let src = codegen_operand(fx, src).load_scalar(fx);
             let count = codegen_operand(fx, count).load_scalar(fx);
-            fx.bcx.call_memcpy(fx.cx.module.target_config(), dst, src, count);
+            let elem_size: u64 = pointee.size.bytes();
+            let bytes = if elem_size != 1 {
+               fx.bcx.ins().imul_imm(count, elem_size as i64)
+            } else {
+               count
+            };
+            fx.bcx.call_memcpy(fx.cx.module.target_config(), dst, src, bytes);
         }
     }
 }