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

Reply via email to