OSDN Git Service

* config/mips/mips.c (mips_legitimize_move): Generate special patterns
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / mips-hilo-1.c
1 /* f1 checks that an mtlo is not moved before an mfhi.  f2 does the same
2    for an mthi and an mflo.  */
3 /* { dg-do run { target mips*-*-* } } */
4 /* { dg-options "-mtune=rm7000" } */
5
6 #if !defined(__mips16)
7
8 #define DECLARE(TYPE)                                                   \
9   TYPE __attribute__ ((noinline))                                       \
10   f1##TYPE (TYPE x1, TYPE x2, TYPE x3)                                  \
11   {                                                                     \
12     TYPE t1, t2;                                                        \
13                                                                         \
14     asm ("mult\t%1,%2" : "=h" (t1) : "d" (x1), "d" (x2) : "lo");        \
15     asm ("mflo\t%0" : "=r" (t2) : "l" (x3) : "hi");                     \
16     return t1 + t2;                                                     \
17   }                                                                     \
18                                                                         \
19   TYPE __attribute__ ((noinline))                                       \
20   f2##TYPE (TYPE x1, TYPE x2, TYPE x3)                                  \
21   {                                                                     \
22     TYPE t1, t2;                                                        \
23                                                                         \
24     asm ("mult\t%1,%2" : "=l" (t1) : "d" (x1), "d" (x2) : "hi");        \
25     asm ("mfhi\t%0" : "=r" (t2) : "h" (x3) : "lo");                     \
26     return t1 + t2;                                                     \
27   }
28
29 #define TEST(TYPE)                                                      \
30   if (f1##TYPE (1, 2, 10) != 10)                                        \
31     abort ();                                                           \
32   if (f2##TYPE (1, 2, 40) != 42)                                        \
33     abort ()
34
35 typedef char c;
36 typedef signed char sc;
37 typedef unsigned char uc;
38 typedef short s;
39 typedef unsigned short us;
40 typedef int i;
41 typedef unsigned int ui;
42 typedef long long ll;
43 typedef unsigned long long ull;
44
45 DECLARE (c)
46 DECLARE (sc)
47 DECLARE (uc)
48 DECLARE (s)
49 DECLARE (us)
50 DECLARE (i)
51 DECLARE (ui)
52 #if defined (__mips64)
53 DECLARE (ll)
54 DECLARE (ull)
55 #endif
56
57 int
58 main ()
59 {
60   TEST (c);
61   TEST (sc);
62   TEST (uc);
63   TEST (s);
64   TEST (us);
65   TEST (i);
66   TEST (ui);
67 #if defined (__mips64)
68   TEST (ll);
69   TEST (ull);
70 #endif
71   exit (0);
72 }
73 #else
74 int main () { exit (0); }
75 #endif