From: André Hentschel Subject: [PATCH 2/2] webservices/tests: Implement floating point handling for ARM (try 3) Message-Id: <0ea86f34-b75b-83d1-3d20-79d03d00c364@dawncrow.de> Date: Sat, 11 Nov 2017 16:01:47 +0100 Signed-off-by: André Hentschel --- 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..36cd967 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 = LOWORD(fpword); + 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, "100000000000000", __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