conv_long_double_u.c (803B)
1 /* Unsigned long <-> double round-trip: UCVTF (ulong->double) and FCVTZU 2 * (double->ulong), 64-bit GPR forms. A value with the top bit set forces the 3 * unsigned 64-bit variant. volatile operands defeat folding. 4 * 5 * U = 0x8000_0000_0000_0000 : d = (double)U (ucvtf d,x, unsigned) 6 * back path reduces deterministically with fcvtzu x,d. */ 7 int test_main(void) { 8 volatile unsigned long U = 0x8000000000000000UL; 9 volatile unsigned long V = 84UL; 10 double d = (double)U; /* ucvtf d,x (unsigned, top bit) */ 11 double e = (double)V; /* ucvtf d,x */ 12 unsigned long b1 = (unsigned long)(d / d); /* 1, fcvtzu x,d */ 13 unsigned long b2 = (unsigned long)(e / 2.0); /* 42, fcvtzu x,d */ 14 return (int)(b2 + b1 - 1); /* 42 + 1 - 1 = 42 */ 15 }