conv_long_double_s.c (754B)
1 /* Signed long <-> double round-trip: SCVTF (long->double) and FCVTZS 2 * (double->long), using the 64-bit GPR forms. A value above 2^32 forces the 3 * 64-bit register variant. volatile operands defeat folding. 4 * 5 * L = 0x2_0000_0000 = 8589934592 : d = (double)L (scvtf d,x) 6 * back: (long)(d / 0x2_0000_0000) = 1 (fcvtzs x,d) */ 7 int test_main(void) { 8 volatile long L = 0x200000000L; /* 8589934592 */ 9 volatile long M = -84L; 10 double d = (double)L; /* scvtf d,x */ 11 double e = (double)M; /* scvtf d,x (negative) */ 12 long b1 = (long)(d / 8589934592.0); /* 1, fcvtzs x,d */ 13 long b2 = (long)(e / 2.0); /* -42, fcvtzs x,d */ 14 return (int)(-b2 + b1 - 1); /* 42 + 1 - 1 = 42 */ 15 }