Skip to content

Commit f9897c6

Browse files
lifeixwenlingz
authored andcommitted
hv: refine memset
Use enhanced rep fast-string operation to refine memset. Tracked-On: #861 Signed-off-by: Li, Fei1 <fei1.li@intel.com>
1 parent 78e9a84 commit f9897c6

File tree

1 file changed

+14
-25
lines changed

1 file changed

+14
-25
lines changed

hypervisor/lib/memory.c

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -367,33 +367,22 @@ void *memcpy_s(void *d, size_t dmax, const void *s, size_t slen_arg)
367367
return d;
368368
}
369369

370-
void *memset(void *base, uint8_t v, size_t n)
370+
static inline void memset_erms(void *base, uint8_t v, size_t n)
371371
{
372-
uint8_t *dest_p;
373-
size_t n_q;
374-
size_t count;
375-
void *ret;
376-
377-
dest_p = (uint8_t *)base;
378-
379-
if ((dest_p == NULL) || (n == 0U)) {
380-
ret = NULL;
381-
} else {
382-
/* do the few bytes to get uint64_t alignment */
383-
count = n;
384-
for (; (count != 0U) && (((uint64_t)dest_p & 7UL) != 0UL); count--) {
385-
*dest_p = v;
386-
dest_p++;
387-
}
372+
asm volatile("rep ; stosb"
373+
: "+D"(base)
374+
: "a" (v), "c"(n));
375+
}
388376

389-
/* 64-bit mode */
390-
n_q = count >> 3U;
391-
asm volatile("cld ; rep ; stosq ; movl %3,%%ecx ; rep ; stosb"
392-
: "+c"(n_q), "+D"(dest_p)
393-
: "a" (v * 0x0101010101010101U),
394-
"r"((uint32_t)count & 7U));
395-
ret = (void *)dest_p;
377+
void *memset(void *base, uint8_t v, size_t n)
378+
{
379+
/*
380+
* Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended
381+
* to use it when possible.
382+
*/
383+
if ((base != NULL) && (n != 0U)) {
384+
memset_erms(base, v, n);
396385
}
397386

398-
return ret;
387+
return base;
399388
}

0 commit comments

Comments
 (0)