[PATCH 2/2] webservices/tests: Implement floating point handling for ARM (try 2)

André Hentschel nerv at dawncrow.de
Sat Nov 11 07:45:15 CST 2017


Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
 dlls/webservices/tests/writer.c | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c
index 79b60d1..9254be9 100644
--- a/dlls/webservices/tests/writer.c
+++ b/dlls/webservices/tests/writer.c
@@ -2203,28 +2203,35 @@ static void test_text_types(void)
     WsFreeWriter( writer );
 }
 
-static BOOL get_fpword( unsigned short *ret )
+static BOOL get_fpword( unsigned long *ret )
 {
 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-    unsigned short fpword;
+    unsigned long fpword;
     __asm__ __volatile__( "fstcw %0" : "=m" (fpword) );
+    *ret = fpword & 0xffff;
+    return TRUE;
+#elif defined(__arm__)
+    unsigned long fpword;
+    __asm__ __volatile__( "vmrs %0, fpscr" : "=r" (fpword) );
     *ret = fpword;
     return TRUE;
 #endif
     return FALSE;
 }
 
-static void set_fpword( unsigned short fpword )
+static void set_fpword( unsigned long fpword )
 {
 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
     __asm__ __volatile__( "fldcw %0" : : "m" (fpword) );
+#elif defined(__arm__)
+    __asm__ __volatile__( "vmsr	fpscr, %0" : : "r" (fpword) );
 #endif
 }
 
 static void test_double(void)
 {
     WS_XML_STRING localname = {1, (BYTE *)"t"}, ns = {0, NULL};
-    unsigned short fpword;
+    unsigned long fpword;
     static const struct
     {
         double      val;
@@ -2318,10 +2325,17 @@ static void test_double(void)
         WsFreeWriter( writer );
         return;
     }
-    ok( fpword == 0x27f, "got %04x\n", fpword );
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+    ok( fpword == 0x27f, "got %04lx\n", fpword );
     set_fpword( 0x1f7f );
     get_fpword( &fpword );
-    ok( fpword == 0x1f7f, "got %04x\n", fpword );
+    ok( fpword == 0x1f7f, "got %04lx\n", fpword );
+#elif defined(__arm__)
+    ok( fpword == 0, "got %08lx\n", fpword );
+    set_fpword( 0x00c00000 );
+    get_fpword( &fpword );
+    ok( fpword == 0x00c00000, "got %08lx\n", fpword );
+#endif
 
     hr = set_output( writer );
     ok( hr == S_OK, "got %08x\n", hr );
@@ -2337,8 +2351,13 @@ static void test_double(void)
     check_output( writer, "<t>100000000000000</t>", __LINE__ );
 
     get_fpword( &fpword );
-    ok( fpword == 0x1f7f, "got %04x\n", fpword );
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+    ok( fpword == 0x1f7f, "got %04lx\n", fpword );
     set_fpword( 0x27f );
+#elif defined(__arm__)
+    ok( fpword == 0x00c00000, "got %08lx\n", fpword );
+    set_fpword( 0 );
+#endif
 
     WsFreeWriter( writer );
 }
-- 
2.7.4




More information about the wine-devel mailing list