Home | History | Annotate | Download | only in ppc32
      1 
      2 /* This is code generated by xlc -O3 for conversion of a double to an
      3    unsigned 32-bit int, in a "floor" style.  It relies on doing an
      4    fadd with a non-standard rounding mode and so checks that V handles
      5    the rounding mode correctly.  r will be 1 if that is not so. */
      6 
      7 #include <stdio.h>
      8 
      9 extern unsigned int xlc_double_to_u32 ( double );
     10 asm("\n"
     11 ".text\n"
     12 ".global xlc_double_to_u32\n"
     13 ".type xlc_double_to_u32, @function\n"
     14 "xlc_double_to_u32:\n"
     15 "        stwu    %r1,-48(%r1)\n"
     16 "        addis   %r4,%r0,.const_dr@ha\n"
     17 "        addis   %r0,%r0,17376\n"
     18 "        fabs    %f0,%f1\n"
     19 "        addi    %r3,%r0,0\n"
     20 "        mffs    %f3\n"
     21 "        mtfsb1  4*cr7+so\n"
     22 "        lfs     %f2,.const_dr@l(%r4)\n"
     23 "        fcmpu   0,%f1,%f0\n"
     24 "        fadd    %f0,%f0,%f2\n"
     25 "        mtfsf   255,%f3\n"
     26 "        stfd    %f0,24(%r1)\n"
     27 "        bne-    $+0x1c\n"
     28 "        lwz     %r3,24(%r1)\n"
     29 "        subf    %r0,%r3,%r0\n"
     30 "        srawi   %r0,%r0,31\n"
     31 "        ori     %r0,%r0,0x0000\n"
     32 "        lwz     %r4,28(%r1)\n"
     33 "        or      %r3,%r4,%r0\n"
     34 "        addi    %r1,%r1,48\n"
     35 "        blr\n"
     36 ".size xlc_double_to_u32, . - xlc_double_to_u32\n"
     37 "        .long 0\n"
     38 "        .long 0x00000000\n"
     39 "        .long 0x00000000\n"
     40 ".previous\n"
     41 "\n"
     42 "        .section        \".rodata\",\"a\"\n"
     43 "        .align  3\n"
     44 "        .type    .const_dr,@object\n"
     45 "        .size    .const_dr,20\n"
     46 ".const_dr:\n"
     47 "        .long 0x59804000\n"
     48 "        .long 0x49424d20\n"
     49 "        .long 0x3fe66666\n"
     50 "        .long 0x66666666\n"
     51 "        .long 0x25640a00\n"
     52 ".previous\n"
     53 );
     54 
     55 int main (int argc, char** argv)
     56 {
     57   unsigned int r = xlc_double_to_u32 ( 0.7 );
     58   if (r == 0)
     59     printf("pass\n");
     60   else
     61     printf("fail\n");
     62 
     63   return 0;
     64 }
     65