| /* PR optimization/10024 */ |
| extern int *allegro_errno; |
| typedef long fixed; |
| extern inline int |
| fixfloor (fixed x) |
| { |
| if (x >= 0) |
| return (x >> 16); |
| else |
| return ~((~x) >> 16); |
| } |
| extern inline int |
| fixtoi (fixed x) |
| { |
| return fixfloor (x) + ((x & 0x8000) >> 15); |
| } |
| extern inline fixed |
| ftofix (double x) |
| { |
| if (x > 32767.0) |
| { |
| *allegro_errno = 34; |
| return 0x7FFFFFFF; |
| } |
| if (x < -32767.0) |
| { |
| *allegro_errno = 34; |
| return -0x7FFFFFFF; |
| } |
| return (long) (x * 65536.0 + (x < 0 ? -0.5 : 0.5)); |
| } |
| extern inline double |
| fixtof (fixed x) |
| { |
| return (double) x / 65536.0; |
| } |
| extern inline fixed |
| fixdiv (fixed x, fixed y) |
| { |
| if (y == 0) |
| { |
| *allegro_errno = 34; |
| return (x < 0) ? -0x7FFFFFFF : 0x7FFFFFFF; |
| } |
| else |
| return ftofix (fixtof (x) / fixtof (y)); |
| } |
| extern inline fixed |
| itofix (int x) |
| { |
| return x << 16; |
| } |
| |
| int |
| foo (int n) |
| { |
| return fixtoi (fixdiv (itofix (512), itofix (n))); |
| } |