From 187eea11978b93ec0f950ee9e3897cef0e0766f0 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 26 Apr 2023 20:16:05 +0300 Subject: [PATCH] use memcpy for non-tiny equal-size copying --- src/singeli/src/copy.singeli | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/singeli/src/copy.singeli b/src/singeli/src/copy.singeli index f6bc3452..7fbd5a22 100644 --- a/src/singeli/src/copy.singeli +++ b/src/singeli/src/copy.singeli @@ -35,7 +35,10 @@ fn copy{X, R}(x: *void, r: *void, l:u64, xRaw: *void) : void = { def RV = [bulk]R def ur = tern{hasarch{'AARCH64'}, 4, 1} - if (R==u64) { + if (X==R and R!=u1) { + if (hasarch{'X86_64'} and l<=bulk) storeBatch{rp, 0, loadBatch{xp, 0, RV}, maskAfter{l}} + else emit{void, 'memcpy', r, x, l*(width{X}/8)} + } else if (R==u64) { # show{'R==u64', X, R} assert{((X==u8) | (X==u16)) | (X==u32)} maskedLoop{bulk, l, {i, M} => { # TODO could maybe read 256 bits and use unpack to write >256