| |
| /* This is code generated by xlc -O3 for conversion of a double to an |
| unsigned 32-bit int, in a "floor" style. It relies on doing an |
| fadd with a non-standard rounding mode and so checks that V handles |
| the rounding mode correctly. r will be 1 if that is not so. */ |
| |
| #include <stdio.h> |
| |
| extern unsigned int xlc_double_to_u32 ( double ); |
| asm("\n" |
| ".text\n" |
| ".global xlc_double_to_u32\n" |
| ".type xlc_double_to_u32, @function\n" |
| "xlc_double_to_u32:\n" |
| " stwu %r1,-48(%r1)\n" |
| " addis %r4,%r0,.const_dr@ha\n" |
| " addis %r0,%r0,17376\n" |
| " fabs %f0,%f1\n" |
| " addi %r3,%r0,0\n" |
| " mffs %f3\n" |
| " mtfsb1 4*cr7+so\n" |
| " lfs %f2,.const_dr@l(%r4)\n" |
| " fcmpu 0,%f1,%f0\n" |
| " fadd %f0,%f0,%f2\n" |
| " mtfsf 255,%f3\n" |
| " stfd %f0,24(%r1)\n" |
| " bne- $+0x1c\n" |
| " lwz %r3,24(%r1)\n" |
| " subf %r0,%r3,%r0\n" |
| " srawi %r0,%r0,31\n" |
| " ori %r0,%r0,0x0000\n" |
| " lwz %r4,28(%r1)\n" |
| " or %r3,%r4,%r0\n" |
| " addi %r1,%r1,48\n" |
| " blr\n" |
| ".size xlc_double_to_u32, . - xlc_double_to_u32\n" |
| " .long 0\n" |
| " .long 0x00000000\n" |
| " .long 0x00000000\n" |
| ".previous\n" |
| "\n" |
| " .section \".rodata\",\"a\"\n" |
| " .align 3\n" |
| " .type .const_dr,@object\n" |
| " .size .const_dr,20\n" |
| ".const_dr:\n" |
| " .long 0x59804000\n" |
| " .long 0x49424d20\n" |
| " .long 0x3fe66666\n" |
| " .long 0x66666666\n" |
| " .long 0x25640a00\n" |
| ".previous\n" |
| ); |
| |
| int main (int argc, char** argv) |
| { |
| unsigned int r = xlc_double_to_u32 ( 0.7 ); |
| if (r == 0) |
| printf("pass\n"); |
| else |
| printf("fail\n"); |
| |
| return 0; |
| } |