typedef unsigned long long u64;
void my_memset(char *a, char c, unsigned n) {
unsigned char v = (unsigned char)c;
u64 i = 0;
while (i < n && (((u64)(a + i)) & 15ULL)) a[i++] = (char)v;
__asm__ volatile(
"movd %0, %%xmm0\n\t"
"punpcklbw %%xmm0, %%xmm0\n\t"
"punpcklwd %%xmm0, %%xmm0\n\t"
"pshufd $0, %%xmm0, %%xmm0\n\t"
"1:\n\t"
"cmpq %2, %1\n\t"
"jbe 2f\n\t"
"movdqu %%xmm0, (%0,%1)\n\t"
"movdqu %%xmm0, 16(%0,%1)\n\t"
"movdqu %%xmm0, 32(%0,%1)\n\t"
"movdqu %%xmm0, 48(%0,%1)\n\t"
"movdqu %%xmm0, 64(%0,%1)\n\t"
"movdqu %%xmm0, 80(%0,%1)\n\t"
"movdqu %%xmm0, 96(%0,%1)\n\t"
"movdqu %%xmm0, 112(%0,%1)\n\t"
"addq $128, %1\n\t"
"jmp 1b\n\t"
"2:\n\t"
: "+r"(a), "+r"(i)
: "r"((u64)n)
: "xmm0", "memory");
for (; i + 16 <= n; i += 16) {
__asm__ volatile("movdqu %%xmm0, (%0,%1)" :: "r"(a), "r"(i) : "memory");
}
u64 nn = n;
for (; i < nn; i++) a[i] = (char)v;
}
| Compilation | N/A | N/A | Compile Error | Score: N/A | 显示更多 |