Please review, i'll split it up and commit it.
Index: mingw-w64-headers/crt/intrin.h
===================================================================
--- mingw-w64-headers/crt/intrin.h (Revision 6627)
+++ mingw-w64-headers/crt/intrin.h (Arbeitskopie)
@@ -1057,7 +1057,7 @@
/* __MACHINEI(__MINGW_EXTENSION unsigned __int64 __readmsr(unsigned __LONG32)) moved to psdk_inc/intrin-impl.h */
/* __MACHINEI(__MINGW_EXTENSION void __writemsr(unsigned __LONG32,unsigned __int64)) moved to psdk_inc/intrin-impl.h */
#ifndef __GNUC__
- __MACHINEI(__MINGW_EXTENSION unsigned __int64 __rdtsc(void))
+ __MACHINEIW64(__MINGW_EXTENSION unsigned __int64 __rdtsc(void))
#endif
/* __MACHINEI(void __movsb(unsigned char *,unsigned char const *,size_t)) moved to psdk_inc/intrin-impl.h */
/* __MACHINEI(void __movsw(unsigned short *,unsigned short const *,size_t)) moved to psdk_inc/intrin-impl.h */
Index: mingw-w64-crt/math/trunc.S
===================================================================
--- mingw-w64-crt/math/trunc.S (Revision 6627)
+++ mingw-w64-crt/math/trunc.S (Arbeitskopie)
@@ -8,14 +8,14 @@
.file "trunc.S"
.text
.p2align 4,,15
-.globl __MINGW_USYMBOL(trunc)
+ .globl __MINGW_USYMBOL(trunc)
.def __MINGW_USYMBOL(trunc); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(trunc)
#endif
__MINGW_USYMBOL(trunc):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $24, %rsp
.seh_stackalloc 24
.seh_endprologue
@@ -75,7 +75,15 @@
addq $24, %rsp
ret
.seh_endproc
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ orr r0, r1, #0x00c00000 /* Round towards Zero */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldl 4(%esp)
subl $8, %esp
fstcw (%esp)
Index: mingw-w64-crt/math/nearbyint.S
===================================================================
--- mingw-w64-crt/math/nearbyint.S (Revision 6627)
+++ mingw-w64-crt/math/nearbyint.S (Arbeitskopie)
@@ -12,10 +12,10 @@
#else
.align 4
#endif
-.globl __MINGW_USYMBOL(nearbyint)
+ .globl __MINGW_USYMBOL(nearbyint)
.def __MINGW_USYMBOL(nearbyint); .scl 2; .type 32; .endef
__MINGW_USYMBOL(nearbyint):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
movsd %xmm0,-16(%rsp)
fldl -16(%rsp)
pushq %rax
@@ -33,7 +33,11 @@
fstpl -16(%rsp)
movsd -16(%rsp),%xmm0
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldl 4(%esp)
pushl %eax
pushl %ecx
Index: mingw-w64-crt/math/floorl.S
===================================================================
--- mingw-w64-crt/math/floorl.S (Revision 6627)
+++ mingw-w64-crt/math/floorl.S (Arbeitskopie)
@@ -12,10 +12,10 @@
#else
.align 4
#endif
-.globl __MINGW_USYMBOL(floorl)
+ .globl __MINGW_USYMBOL(floorl)
.def __MINGW_USYMBOL(floorl); .scl 2; .type 32; .endef
__MINGW_USYMBOL(floorl):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
fldt (%rdx)
subq $24,%rsp
@@ -39,7 +39,16 @@
movq $0,8(%rcx)
fstpt (%rcx)
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldt 4(%esp)
subl $8,%esp
Index: mingw-w64-crt/math/ceill.S
===================================================================
--- mingw-w64-crt/math/ceill.S (Revision 6627)
+++ mingw-w64-crt/math/ceill.S (Arbeitskopie)
@@ -12,10 +12,10 @@
#else
.align 4
#endif
-.globl __MINGW_USYMBOL(ceill)
+ .globl __MINGW_USYMBOL(ceill)
.def __MINGW_USYMBOL(ceill); .scl 2; .type 32; .endef
__MINGW_USYMBOL(ceill):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
fldt (%rdx)
subq $24,%rsp
@@ -39,7 +39,16 @@
movq $0,8(%rcx)
fstpt (%rcx)
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldt 4(%esp)
subl $8,%esp
fstcw 4(%esp)
Index: mingw-w64-crt/math/copysignl.S
===================================================================
--- mingw-w64-crt/math/copysignl.S (Revision 6627)
+++ mingw-w64-crt/math/copysignl.S (Arbeitskopie)
@@ -18,10 +18,10 @@
.align 4
#endif
-.globl __MINGW_USYMBOL(copysignl)
+ .globl __MINGW_USYMBOL(copysignl)
.def __MINGW_USYMBOL(copysignl); .scl 2; .type 32; .endef
__MINGW_USYMBOL(copysignl):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
movq (%rdx), %rax
movq %rax, (%rcx)
movq 8(%rdx), %rax
@@ -32,7 +32,19 @@
movq %rax, 8(%rcx)
movq %rcx, %rax
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ fcmpzd d1
+ fmstat
+ bmi 1f /* jump if d1 is negative */
+ fcmpzd d0
+ fmstat
+ vnegmi.f64 d0, d0 /* negate d0 if it is negative */
+ bx lr
+ 1: fcmpzd d0
+ fmstat
+ vnegpl.f64 d0, d0 /* negate d0 if it is positive */
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
movl 24(%esp),%edx
movl 12(%esp),%eax
andl $0x8000,%edx
Index: mingw-w64-crt/math/fma.S
===================================================================
--- mingw-w64-crt/math/fma.S (Revision 6627)
+++ mingw-w64-crt/math/fma.S (Arbeitskopie)
@@ -13,10 +13,10 @@
.align 4
#endif
.p2align 4,,15
-.globl __MINGW_USYMBOL(fma)
+ .globl __MINGW_USYMBOL(fma)
.def __MINGW_USYMBOL(fma); .scl 2; .type 32; .endef
__MINGW_USYMBOL(fma):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $56, %rsp
movsd %xmm0,(%rsp)
movsd %xmm1,16(%rsp)
@@ -29,7 +29,11 @@
movsd (%rsp),%xmm0
addq $56, %rsp
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ fmacd d2, d0, d1
+ fcpyd d0, d2
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldl 4(%esp)
fmull 12(%esp)
fldl 20(%esp)
Index: mingw-w64-crt/math/floor.S
===================================================================
--- mingw-w64-crt/math/floor.S (Revision 6627)
+++ mingw-w64-crt/math/floor.S (Arbeitskopie)
@@ -8,13 +8,13 @@
.file "floor.S"
.text
.p2align 4,,15
-.globl __MINGW_USYMBOL(floor)
+ .globl __MINGW_USYMBOL(floor)
.def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(floor)
#endif
__MINGW_USYMBOL(floor):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
pushq %rbx
.seh_pushreg %rbx
subq $16, %rsp
@@ -143,7 +143,16 @@
.hugeval:
.long -2013235812
.long 2117592124
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldl 4(%esp)
subl $8,%esp
Index: mingw-w64-crt/math/floorf.S
===================================================================
--- mingw-w64-crt/math/floorf.S (Revision 6627)
+++ mingw-w64-crt/math/floorf.S (Arbeitskopie)
@@ -8,13 +8,13 @@
.file "floorf.S"
.text
.p2align 4,,15
-.globl __MINGW_USYMBOL(floorf)
+ .globl __MINGW_USYMBOL(floorf)
.def __MINGW_USYMBOL(floorf); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(floorf)
#endif
__MINGW_USYMBOL(floorf):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
@@ -27,7 +27,16 @@
ret
.seh_endproc
.def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvt.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
flds 4(%esp)
subl $8,%esp
Index: mingw-w64-crt/math/nearbyintl.S
===================================================================
--- mingw-w64-crt/math/nearbyintl.S (Revision 6627)
+++ mingw-w64-crt/math/nearbyintl.S (Arbeitskopie)
@@ -12,10 +12,10 @@
#else
.align 4
#endif
-.globl __MINGW_USYMBOL(nearbyintl)
+ .globl __MINGW_USYMBOL(nearbyintl)
.def __MINGW_USYMBOL(nearbyintl); .scl 2; .type 32; .endef
__MINGW_USYMBOL(nearbyintl):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
fldt (%rdx)
movq %rcx,%r8
pushq %rax
@@ -34,7 +34,11 @@
movq $0,8(%r8)
fstpt (%r8)
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldt 4(%esp)
pushl %eax
pushl %ecx
Index: mingw-w64-crt/math/fmaf.S
===================================================================
--- mingw-w64-crt/math/fmaf.S (Revision 6627)
+++ mingw-w64-crt/math/fmaf.S (Arbeitskopie)
@@ -13,10 +13,10 @@
.align 2
#endif
.p2align 4,,15
-.globl __MINGW_USYMBOL(fmaf)
+ .globl __MINGW_USYMBOL(fmaf)
.def __MINGW_USYMBOL(fmaf); .scl 2; .type 32; .endef
__MINGW_USYMBOL(fmaf):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $56, %rsp
movss %xmm0,(%rsp)
movss %xmm1,16(%rsp)
@@ -29,7 +29,11 @@
movss (%rsp),%xmm0
addq $56, %rsp
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ fmacs s2, s0, s1
+ fcpys s0, s2
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
flds 4(%esp)
fmuls 8(%esp)
flds 12(%esp)
Index: mingw-w64-crt/math/ceilf.S
===================================================================
--- mingw-w64-crt/math/ceilf.S (Revision 6627)
+++ mingw-w64-crt/math/ceilf.S (Arbeitskopie)
@@ -8,14 +8,14 @@
.file "ceilf.S"
.text
.align 4
-.globl __MINGW_USYMBOL(ceilf)
+ .globl __MINGW_USYMBOL(ceilf)
.def __MINGW_USYMBOL(ceilf); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(ceilf)
#endif
__MINGW_USYMBOL(ceilf):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $24, %rsp
.seh_stackalloc 24
.seh_endprologue
@@ -87,7 +87,16 @@
.align 4
.zeroval:
.long 0
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvt.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
flds 4(%esp)
subl $8,%esp
Index: mingw-w64-crt/math/truncf.S
===================================================================
--- mingw-w64-crt/math/truncf.S (Revision 6627)
+++ mingw-w64-crt/math/truncf.S (Arbeitskopie)
@@ -8,14 +8,14 @@
.file "truncf.S"
.text
.p2align 4,,15
-.globl __MINGW_USYMBOL(truncf)
+ .globl __MINGW_USYMBOL(truncf)
.def __MINGW_USYMBOL(truncf); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(truncf)
#endif
__MINGW_USYMBOL(truncf):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
subq $24, %rsp
.seh_stackalloc 24
.seh_endprologue
@@ -55,7 +55,15 @@
addq $24, %rsp
ret
.seh_endproc
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ orr r0, r1, #0x00c00000 /* Round towards Zero */
+ vmsr fpscr, r0
+ vcvt.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
flds 4(%esp)
subl $8, %esp
fstcw (%esp)
Index: mingw-w64-crt/math/nearbyintf.S
===================================================================
--- mingw-w64-crt/math/nearbyintf.S (Revision 6627)
+++ mingw-w64-crt/math/nearbyintf.S (Arbeitskopie)
@@ -12,10 +12,10 @@
#else
.align 4
#endif
-.globl __MINGW_USYMBOL(nearbyintf)
+ .globl __MINGW_USYMBOL(nearbyintf)
.def __MINGW_USYMBOL(nearbyintf); .scl 2; .type 32; .endef
__MINGW_USYMBOL(nearbyintf):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
movss %xmm0,-12(%rsp)
flds -12(%rsp)
pushq %rax
@@ -33,7 +33,11 @@
fstps -12(%rsp)
movss -12(%rsp),%xmm0
ret
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vcvt.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
flds 4(%esp)
pushl %eax
pushl %ecx
Index: mingw-w64-crt/math/ceil.S
===================================================================
--- mingw-w64-crt/math/ceil.S (Revision 6627)
+++ mingw-w64-crt/math/ceil.S (Arbeitskopie)
@@ -8,14 +8,14 @@
.file "ceil.S"
.text
.align 4
-.globl __MINGW_USYMBOL(ceil)
+ .globl __MINGW_USYMBOL(ceil)
.def __MINGW_USYMBOL(ceil); .scl 2; .type 32; .endef
#ifdef _WIN64
.seh_proc __MINGW_USYMBOL(ceil)
#endif
__MINGW_USYMBOL(ceil):
-#ifdef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
.seh_endprologue
movd %xmm0, %rax
movq %rax, %rcx
@@ -91,7 +91,16 @@
.zero:
.long 0
.long 0
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
+#elif defined(_X86_) || defined(__i386__)
fldl 4(%esp)
subl $8,%esp
Index: mingw-w64-crt/profile/profil.c
===================================================================
--- mingw-w64-crt/profile/profil.c (Revision 6627)
+++ mingw-w64-crt/profile/profil.c (Arbeitskopie)
@@ -43,9 +43,11 @@
ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pc = (size_t) - 1;
if (GetThreadContext (thr, &ctx)) {
-#ifndef _WIN64
+#if defined(_AMD64_) || defined(__x86_64__)
pc = ctx.Eip;
-#else
+#elif defined(_ARM_) || defined(__arm__)
+ pc = ctx.Pc;
+#elif defined(_X86_) || defined(__i386__)
pc = ctx.Rip;
#endif
}
Index: mingw-w64-crt/crt/CRT_fp10.c
===================================================================
--- mingw-w64-crt/crt/CRT_fp10.c (Revision 6627)
+++ mingw-w64-crt/crt/CRT_fp10.c (Arbeitskopie)
@@ -8,11 +8,17 @@
void _fpreset (void)
{
+#if defined(_ARM_) || defined(__arm__)
+ __asm__ __volatile__ (
+ "mov r0, #0x00\n\t" /* INITIAL_FPSCR */
+ "vmsr fpscr, r0\n\t");
+#else
#ifdef __GNUC__
__asm__ ("fninit");
#else /* msvc: */
__asm fninit;
#endif
+#endif
}
#ifdef __GNUC__
------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public