[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Tinycc-devel] [PATCH] Eliminate call to memset() on x86-64 when zeroing
From: |
Yao Zi |
Subject: |
[Tinycc-devel] [PATCH] Eliminate call to memset() on x86-64 when zeroing an array |
Date: |
Mon, 11 Sep 2023 11:45:07 +0800 |
See thread "win32: -Wl,-nostdlib: undefined symbol 'memset'"
This patch has been tested on x86-64 Alpine (musl) and all tests are passed.
I do not have a Windows platform, so many thanks if someone could help me test
it.
---
tccgen.c | 5 +++++
x86_64-gen.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git a/tccgen.c b/tccgen.c
index fd0680f..da07675 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -7373,6 +7373,10 @@ static void init_putz(init_params *p, unsigned long c,
int size)
if (p->sec) {
/* nothing to do because globals are already set to zero */
} else {
+#ifdef TCC_TARGET_NATIVE_PUT_ZERO
+ vseti(VT_LOCAL, c);
+ gen_put_zero(size);
+#else
vpush_helper_func(TOK_memset);
vseti(VT_LOCAL, c);
#ifdef TCC_TARGET_ARM
@@ -7383,6 +7387,7 @@ static void init_putz(init_params *p, unsigned long c,
int size)
vpushs(size);
#endif
gfunc_call(3);
+#endif
}
}
diff --git a/x86_64-gen.c b/x86_64-gen.c
index e04df10..fae6f54 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -109,7 +109,9 @@ enum {
#define PROMOTE_RET
#define TCC_TARGET_NATIVE_STRUCT_COPY
+#define TCC_TARGET_NATIVE_PUT_ZERO
ST_FUNC void gen_struct_copy(int size);
+ST_FUNC void gen_put_zero(int size);
/******************************************************/
#else /* ! TARGET_DEFS_ONLY */
@@ -2325,6 +2327,42 @@ ST_FUNC void gen_struct_copy(int size)
vpop();
}
+ST_FUNC void gen_put_zero(int size)
+{
+ int n = size / PTR_SIZE;
+
+#ifdef TCC_TARGET_PE
+ o(0x57); /* push rdi */
+#endif
+
+ vpushi(0);
+ gv2(RC_RDI, RC_RAX);
+
+ if (n <= 4) {
+ for (; n; n--)
+ o(0xab48);
+ } else {
+ vpushi(n);
+ gv(RC_RCX);
+ o(0xab48f3);
+ vpop();
+ }
+
+ if (size & 0x04)
+ o(0xab);
+ if (size & 0x02)
+ o(0xab66);
+ if (size & 0x01)
+ o(0xaa);
+
+#ifdef TCC_TARGET_PE
+ o(0x5f); /* pop rdi */
+#endif
+
+ vpop();
+ vpop();
+}
+
/* end of x86-64 code generator */
/*************************************************************/
#endif /* ! TARGET_DEFS_ONLY */
--
2.42.0
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Tinycc-devel] [PATCH] Eliminate call to memset() on x86-64 when zeroing an array,
Yao Zi <=