kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }