| /* __mips, and related defines, guarantee that certain assembly |
| instructions can be used. Check a few examples. */ |
| /* { dg-do run { target mips*-*-* } } */ |
| extern void abort (void); |
| extern void exit (int); |
| |
| typedef int int32 __attribute__ ((mode (SI))); |
| typedef int int64 __attribute__ ((mode (DI))); |
| int foo (float inf, int64 in64, int32 in32) |
| { |
| int64 res64; |
| int32 res32; |
| |
| #if __mips != 1 && defined (__mips_hard_float) |
| __asm__ ("trunc.w.s %0, %1" : "=f" (res32) : "f" (inf)); |
| if (res32 != 11) |
| abort (); |
| #endif |
| |
| #if defined (__mips64) |
| __asm__ ("daddu %0, %1, %1" : "=r" (res64) : "r" (in64)); |
| if (res64 != 50) |
| abort (); |
| #endif |
| |
| #if (__mips == 4 || __mips == 32 || __mips == 64) && !defined (__mips16) |
| __asm__ ("move %0,%.\n\tmovn %0,%1,%2" |
| : "=&r" (res32) : "r" (in32), "r" (in64 != 0)); |
| if (res32 != 60) |
| abort (); |
| #endif |
| } |
| |
| int main () |
| { |
| foo (11.4f, 25, 60); |
| exit (0); |
| } |