Please review, i'll commit it, just need an OK.
diff --git a/mingw-w64-crt/stdio/vfscanf.c b/mingw-w64-crt/stdio/vfscanf.c
index ece4701..a5da3cf 100644
--- a/mingw-w64-crt/stdio/vfscanf.c
+++ b/mingw-w64-crt/stdio/vfscanf.c
@@ -15,6 +15,39 @@
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
+#if defined(__arm__) || defined(_ARM_)
+int __ms_vfscanf_internal(FILE * __restrict__, const char * __restrict__, va_list);
+asm("\t.text\n"
+ "\t.align 2\n"
+ "\t.thumb_func\n"
+ "\t.globl __ms_vfscanf_internal\n"
+ "__ms_vfscanf_internal:\n\t"
+ "push {r4-r7, lr}\n\t"
+ "mov r4, sp\n\t"
+ "sub r4, r4, #128\n\t"
+
+ "ldr r5, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "ldr r6, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+
+ "mov r3, #116\n\t"
+ "1: ldr r7, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "str r7, [r4]\n\t"
+ "add r4, r4, #4\n\t"
+ "sub r3, r3, #4\n\t"
+ "cmp r3, #0\n\t"
+ "bne 1b\n\t"
+
+ "sub sp, sp, #128\n\t"
+ "mov r2, r5\n\t"
+ "mov r3, r6\n\t"
+ "bl " QUOTE(__MINGW_USYMBOL(fscanf)) "\n\t"
+ "add sp, sp, #128\n\t"
+ "pop {r4-r7, pc}");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
int __ms_vfscanf (FILE * __restrict__ stream, const char * __restrict__ format, va_list arg)
{
int ret;
@@ -84,35 +117,7 @@ int __ms_vfscanf (FILE * __restrict__ stream, const char * __restrict__ format,
"a"(&ret)
: "ebx", "edi");
#elif defined(_ARM_) || defined(__arm__)
- int tmp1, tmp2, tmp3, tmp4, tmp5;
- __asm__ __volatile__ (
- "mov %[t1], sp\n\t"
- "sub %[t1], %[t1], #128\n\t"
- "mov %[t2], %[arg]\n\t"
-
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t4], ip\n\t"
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t5], ip\n\t"
-
- "mov %[t3], #120\n\t"
- "1: ldr ip, [%[t2]], #4\n\t"
- "str ip, [%[t1]], #4\n\t"
- "subs %[t3], %[t3], #4\n\t"
- "bge 1b\n\t"
-
- "sub sp, sp, #128\n\t"
- "mov r0, %[s]\n\t"
- "mov r1, %[format]\n\t"
- "mov r2, %[t4]\n\t"
- "mov r3, %[t5]\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(fscanf)) "\n\t"
- "add sp, sp, #128\n\t"
- "mov %[ret], r0\n\t"
- : [ret] "=r" (ret), [t1] "+r" (tmp1), [t2] "+r" (tmp2), [t3] "+r" (tmp3), [t4] "+r" (tmp4), [t5] "+r" (tmp5)
- : [s] "r" (stream), [format] "r" (format), [arg] "r" (arg)
- : "r0", "r1", "r2", "r3", "ip", "cc", "memory"
- );
+ ret = __ms_vfscanf_internal(stream, format, arg);
#endif
return ret;
diff --git a/mingw-w64-crt/stdio/vfwscanf.c b/mingw-w64-crt/stdio/vfwscanf.c
index eb1c83e..0e3a884 100644
--- a/mingw-w64-crt/stdio/vfwscanf.c
+++ b/mingw-w64-crt/stdio/vfwscanf.c
@@ -12,6 +12,39 @@
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
+#if defined(__arm__) || defined(_ARM_)
+int __ms_vfwscanf_internal(FILE * __restrict__, const char * __restrict__, va_list);
+asm("\t.text\n"
+ "\t.align 2\n"
+ "\t.thumb_func\n"
+ "\t.globl __ms_vfwscanf_internal\n"
+ "__ms_vfwscanf_internal:\n\t"
+ "push {r4-r7, lr}\n\t"
+ "mov r4, sp\n\t"
+ "sub r4, r4, #128\n\t"
+
+ "ldr r5, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "ldr r6, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+
+ "mov r3, #116\n\t"
+ "1: ldr r7, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "str r7, [r4]\n\t"
+ "add r4, r4, #4\n\t"
+ "sub r3, r3, #4\n\t"
+ "cmp r3, #0\n\t"
+ "bne 1b\n\t"
+
+ "sub sp, sp, #128\n\t"
+ "mov r2, r5\n\t"
+ "mov r3, r6\n\t"
+ "bl " QUOTE(__MINGW_USYMBOL(fwscanf)) "\n\t"
+ "add sp, sp, #128\n\t"
+ "pop {r4-r7, pc}");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
int __ms_vfwscanf (FILE * __restrict__ stream, const wchar_t * __restrict__ format,
va_list arg) {
@@ -83,35 +116,7 @@ int __ms_vfwscanf (FILE * __restrict__ stream, const wchar_t * __restrict__ form
"a"(&ret)
: "ebx", "edi");
#elif defined(_ARM_) || defined(__arm__)
- int tmp1, tmp2, tmp3, tmp4, tmp5;
- __asm__ __volatile__ (
- "mov %[t1], sp\n\t"
- "sub %[t1], %[t1], #128\n\t"
- "mov %[t2], %[arg]\n\t"
-
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t4], ip\n\t"
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t5], ip\n\t"
-
- "mov %[t3], #120\n\t"
- "1: ldr ip, [%[t2]], #4\n\t"
- "str ip, [%[t1]], #4\n\t"
- "subs %[t3], %[t3], #4\n\t"
- "bge 1b\n\t"
-
- "sub sp, sp, #128\n\t"
- "mov r0, %[s]\n\t"
- "mov r1, %[format]\n\t"
- "mov r2, %[t4]\n\t"
- "mov r3, %[t5]\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(fwscanf)) "\n\t"
- "add sp, sp, #128\n\t"
- "mov %[ret], r0\n\t"
- : [ret] "=r" (ret), [t1] "+r" (tmp1), [t2] "+r" (tmp2), [t3] "+r" (tmp3), [t4] "+r" (tmp4), [t5] "+r" (tmp5)
- : [s] "r" (stream), [format] "r" (format), [arg] "r" (arg)
- : "r0", "r1", "r2", "r3", "ip", "cc", "memory"
- );
+ ret = __ms_vfwscanf_internal(stream, format, arg);
#endif
return ret;
diff --git a/mingw-w64-crt/stdio/vsscanf.c b/mingw-w64-crt/stdio/vsscanf.c
index 0c148c1..f6c412a 100644
--- a/mingw-w64-crt/stdio/vsscanf.c
+++ b/mingw-w64-crt/stdio/vsscanf.c
@@ -12,6 +12,39 @@
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
+#if defined(__arm__) || defined(_ARM_)
+int __ms_vsscanf_internal(const char * __restrict__, const char * __restrict__, va_list);
+asm("\t.text\n"
+ "\t.align 2\n"
+ "\t.thumb_func\n"
+ "\t.globl __ms_vsscanf_internal\n"
+ "__ms_vsscanf_internal:\n\t"
+ "push {r4-r7, lr}\n\t"
+ "mov r4, sp\n\t"
+ "sub r4, r4, #128\n\t"
+
+ "ldr r5, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "ldr r6, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+
+ "mov r3, #116\n\t"
+ "1: ldr r7, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "str r7, [r4]\n\t"
+ "add r4, r4, #4\n\t"
+ "sub r3, r3, #4\n\t"
+ "cmp r3, #0\n\t"
+ "bne 1b\n\t"
+
+ "sub sp, sp, #128\n\t"
+ "mov r2, r5\n\t"
+ "mov r3, r6\n\t"
+ "bl " QUOTE(__MINGW_USYMBOL(sscanf)) "\n\t"
+ "add sp, sp, #128\n\t"
+ "pop {r4-r7, pc}");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
int __ms_vsscanf (const char * __restrict__ s, const char * __restrict__ format, va_list arg) {
int ret;
#if defined(_AMD64_) || defined(__x86_64__)
@@ -80,35 +113,7 @@ int __ms_vsscanf (const char * __restrict__ s, const char * __restrict__ format,
"a"(&ret)
: "ebx", "edi");
#elif defined(_ARM_) || defined(__arm__)
- int tmp1, tmp2, tmp3, tmp4, tmp5;
- __asm__ __volatile__ (
- "mov %[t1], sp\n\t"
- "sub %[t1], %[t1], #128\n\t"
- "mov %[t2], %[arg]\n\t"
-
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t4], ip\n\t"
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t5], ip\n\t"
-
- "mov %[t3], #120\n\t"
- "1: ldr ip, [%[t2]], #4\n\t"
- "str ip, [%[t1]], #4\n\t"
- "subs %[t3], %[t3], #4\n\t"
- "bge 1b\n\t"
-
- "sub sp, sp, #128\n\t"
- "mov r0, %[s]\n\t"
- "mov r1, %[format]\n\t"
- "mov r2, %[t4]\n\t"
- "mov r3, %[t5]\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(sscanf)) "\n\t"
- "add sp, sp, #128\n\t"
- "mov %[ret], r0\n\t"
- : [ret] "=r" (ret), [t1] "+r" (tmp1), [t2] "+r" (tmp2), [t3] "+r" (tmp3), [t4] "+r" (tmp4), [t5] "+r" (tmp5)
- : [s] "r" (s), [format] "r" (format), [arg] "r" (arg)
- : "r0", "r1", "r2", "r3", "ip", "cc", "memory"
- );
+ ret = __ms_vsscanf_internal(s, format, arg);
#endif
return ret;
diff --git a/mingw-w64-crt/stdio/vswscanf.c b/mingw-w64-crt/stdio/vswscanf.c
index d93ff28..a684f51 100644
--- a/mingw-w64-crt/stdio/vswscanf.c
+++ b/mingw-w64-crt/stdio/vswscanf.c
@@ -12,6 +12,39 @@
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
+#if defined(__arm__) || defined(_ARM_)
+int __ms_vswscanf_internal(FILE * __restrict__, const char * __restrict__, va_list);
+asm("\t.text\n"
+ "\t.align 2\n"
+ "\t.thumb_func\n"
+ "\t.globl __ms_vswscanf_internal\n"
+ "__ms_vswscanf_internal:\n\t"
+ "push {r4-r7, lr}\n\t"
+ "mov r4, sp\n\t"
+ "sub r4, r4, #128\n\t"
+
+ "ldr r5, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "ldr r6, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+
+ "mov r3, #116\n\t"
+ "1: ldr r7, [r2]\n\t"
+ "add r2, r2, #4\n\t"
+ "str r7, [r4]\n\t"
+ "add r4, r4, #4\n\t"
+ "sub r3, r3, #4\n\t"
+ "cmp r3, #0\n\t"
+ "bne 1b\n\t"
+
+ "sub sp, sp, #128\n\t"
+ "mov r2, r5\n\t"
+ "mov r3, r6\n\t"
+ "bl " QUOTE(__MINGW_USYMBOL(swscanf)) "\n\t"
+ "add sp, sp, #128\n\t"
+ "pop {r4-r7, pc}");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
int __ms_vswscanf(const wchar_t * __restrict__ s, const wchar_t * __restrict__ format,
va_list arg)
{
@@ -83,35 +116,7 @@ int __ms_vswscanf(const wchar_t * __restrict__ s, const wchar_t * __restrict__ f
"a"(&ret)
: "ebx", "edi");
#elif defined(_ARM_) || defined(__arm__)
- int tmp1, tmp2, tmp3, tmp4, tmp5;
- __asm__ __volatile__ (
- "mov %[t1], sp\n\t"
- "sub %[t1], %[t1], #128\n\t"
- "mov %[t2], %[arg]\n\t"
-
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t4], ip\n\t"
- "ldr ip, [%[t2]], #4\n\t"
- "mov %[t5], ip\n\t"
-
- "mov %[t3], #120\n\t"
- "1: ldr ip, [%[t2]], #4\n\t"
- "str ip, [%[t1]], #4\n\t"
- "subs %[t3], %[t3], #4\n\t"
- "bge 1b\n\t"
-
- "sub sp, sp, #128\n\t"
- "mov r0, %[s]\n\t"
- "mov r1, %[format]\n\t"
- "mov r2, %[t4]\n\t"
- "mov r3, %[t5]\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(swscanf)) "\n\t"
- "add sp, sp, #128\n\t"
- "mov %[ret], r0\n\t"
- : [ret] "=r" (ret), [t1] "+r" (tmp1), [t2] "+r" (tmp2), [t3] "+r" (tmp3), [t4] "+r" (tmp4), [t5] "+r" (tmp5)
- : [s] "r" (s), [format] "r" (format), [arg] "r" (arg)
- : "r0", "r1", "r2", "r3", "ip", "cc", "memory"
- );
+ ret = __ms_vswscanf_internal(s, format, arg);
#endif
return ret;
}
------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public