1 
2 /* HOW TO COMPILE FOR SWITCHBACK:
3 
4    gcc -O -c test_ppc_jm1.c -mregnames -Wall
5 
6 */
7 
8 #undef  HAS_ALTIVEC
9 #define NO_FLOAT
10 #undef  IS_PPC405
11 
12 
13 /*
14  * test-ppc.c:
15  * PPC tests for qemu-PPC CPU emulation checks
16  *
17  * Copyright (c) 2005 Jocelyn Mayer
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU General Public License V2
21  * as published by the Free Software Foundation.
22  */
23 
24 /*
25  * Theory of operations:
26  * a few registers are reserved for the test program:
27  * r14 => r18
28  * f14 => f18
29  * I do preload test values in r14 thru r17 (or less, depending on the number
30  * of register operands needed), patch the test opcode if any immediate
31  * operands are required, execute the tested opcode.
32  * XER, CCR and FPSCR are cleared before every test.
33  * I always get the result in r17 and also save XER and CCR for fixed-point
34  * operations. I also check FPSCR for floating points operations.
35  *
36  * Improvments:
37  * a more cleaver FPSCR management is needed: for now, I always test
38  * the round-to-zero case. Other rounding modes also need to be tested.
39  */
40 
41 #include <stdint.h>
42 //#include <stdlib.h>
43 //#include <stdio.h>
44 //#include <string.h>
45 //#include <unistd.h>
46 //#include <fcntl.h>
47 //#include <ctype.h>
48 //#include <math.h>
49 //#include <fenv.h>
50 
51 #define NULL ((void*)0)
52 
53 //#include "test-ppc.h"
54 
55 // BEGIN #include "test-ppc.h"
56 /*
57  * test-ppc.h:
58  * PPC tests for qemu-PPC CPU emulation checks - definitions
59  *
60  * Copyright (c) 2005 Jocelyn Mayer
61  *
62  * This program is free software; you can redistribute it and/or
63  * modify it under the terms of the GNU General Public License V2
64  * as published by the Free Software Foundation.
65  */
66 
67 #if !defined (__TEST_PPC_H__)
68 #define __TEST_PPC_H__
69 
70 typedef void (*test_func_t) (void);
71 typedef struct test_t test_t;
72 typedef struct test_table_t test_table_t;
73 struct test_t {
74     test_func_t func;
75     const unsigned char *name;
76 };
77 
78 struct test_table_t {
79     test_t *tests;
80     const unsigned char *name;
81     int flags;
82 };
83 
84 typedef void (*test_loop_t) (const unsigned char *name, test_func_t func);
85 
86 enum test_flags {
87     /* Nb arguments */
88     PPC_ONE_ARG    = 0x00000001,
89     PPC_TWO_ARGS   = 0x00000002,
90     PPC_THREE_ARGS = 0x00000003,
91     PPC_CMP_ARGS   = 0x00000004,
92     PPC_CMPI_ARGS  = 0x00000005,
93     PPC_TWO_I16    = 0x00000006,
94     PPC_SPECIAL    = 0x00000007,
95     PPC_NB_ARGS    = 0x0000000F,
96     /* Type */
97     PPC_ARITH      = 0x00000100,
98     PPC_LOGICAL    = 0x00000200,
99     PPC_COMPARE    = 0x00000300,
100     PPC_CROP       = 0x00000400,
101     PPC_TYPE       = 0x00000F00,
102     /* Family */
103     PPC_INTEGER    = 0x00010000,
104     PPC_FLOAT      = 0x00020000,
105     PPC_405        = 0x00030000,
106     PPC_ALTIVEC    = 0x00040000,
107     PPC_FALTIVEC   = 0x00050000,
108     PPC_FAMILY     = 0x000F0000,
109     /* Flags */
110     PPC_CR         = 0x01000000,
111 };
112 
113 #endif /* !defined (__TEST_PPC_H__) */
114 
115 // END #include "test-ppc.h"
116 
117 
118 
119 
120 //#define DEBUG_ARGS_BUILD
121 #if defined (DEBUG_ARGS_BUILD)
122 #define AB_DPRINTF(fmt, args...) do { vexxx_printf(fmt , ##args); } while (0)
123 #else
124 #define AB_DPRINTF(fmt, args...) do { } while (0)
125 #endif
126 
127 //#define DEBUG_FILTER
128 #if defined (DEBUG_FILTER)
129 #define FDPRINTF(fmt, args...) do { vexxx_printf(fmt , ##args); } while (0)
130 #else
131 #define FDPRINTF(fmt, args...) do { } while (0)
132 #endif
133 
134 #if !defined (NO_FLOAT)
135 register double f14 __asm__ ("f14");
136 register double f15 __asm__ ("f15");
137 register double f16 __asm__ ("f16");
138 register double f17 __asm__ ("f17");
139 register double f18 __asm__ ("f18");
140 #endif
141 register uint32_t r14 __asm__ ("r14");
142 register uint32_t r15 __asm__ ("r15");
143 register uint32_t r16 __asm__ ("r16");
144 register uint32_t r17 __asm__ ("r17");
145 register uint32_t r18 __asm__ ("r18");
146 
147 
148 /////////////////////////////////////////////////////////////////////
149 /////////////////////////////////////////////////////////////////////
150 /////////////////////////////////////////////////////////////////////
151 /////////////////////////////////////////////////////////////////////
152 
153 /* Something which has the same size as void* on the host.  That is,
154    it is 32 bits on a 32-bit host and 64 bits on a 64-bit host, and so
155    it can safely be coerced to and from a pointer type on the host
156    machine. */
157 typedef  unsigned long HWord;
158 typedef  char          HChar;
159 typedef  signed int    Int;
160 typedef  unsigned int  UInt;
161 typedef  unsigned char UChar;
162 
163 typedef    signed long long int   Long;
164 typedef  unsigned long long int   ULong;
165 
166 typedef unsigned char   Bool;
167 #define True  ((Bool)1)
168 #define False ((Bool)0)
169 
170 
171 //#include "/home/sewardj/VEX/trunk/pub/libvex_basictypes.h"
172 
173 static HWord (*serviceFn)(HWord,HWord) = 0;
174 
my_isspace(UChar c)175 static Bool my_isspace ( UChar c )
176 {
177    return c == ' '
178           || c == '\f'
179           || c == '\n'
180           || c == '\r'
181           || c == '\t'
182           || c == '\v';
183 }
184 
185 #if 0 // unused
186 static char* my_strcpy ( char* dest, const char* src )
187 {
188    char* dest_orig = dest;
189    while (*src) *dest++ = *src++;
190    *dest = 0;
191    return dest_orig;
192 }
193 
194 static void* my_memcpy ( void *dest, const void *src, int sz )
195 {
196    const char *s = (const char *)src;
197    char *d = (char *)dest;
198 
199    while (sz--)
200       *d++ = *s++;
201 
202    return dest;
203 }
204 
205 static void* my_memmove( void *dst, const void *src, unsigned int len )
206 {
207     register char *d;
208     register char *s;
209     if ( dst > src ) {
210         d = (char *)dst + len - 1;
211         s = (char *)src + len - 1;
212         while ( len >= 4 ) {
213             *d-- = *s--;
214             *d-- = *s--;
215             *d-- = *s--;
216             *d-- = *s--;
217             len -= 4;
218         }
219         while ( len-- ) {
220             *d-- = *s--;
221         }
222     } else if ( dst < src ) {
223         d = (char *)dst;
224         s = (char *)src;
225         while ( len >= 4 ) {
226             *d++ = *s++;
227             *d++ = *s++;
228             *d++ = *s++;
229             *d++ = *s++;
230             len -= 4;
231         }
232         while ( len-- ) {
233             *d++ = *s++;
234         }
235     }
236     return dst;
237 }
238 #endif
239 
my_strcat(char * dest,const char * src)240 char* my_strcat ( char* dest, const char* src )
241 {
242    char* dest_orig = dest;
243    while (*dest) dest++;
244    while (*src) *dest++ = *src++;
245    *dest = 0;
246    return dest_orig;
247 }
248 
my_strcmp(const char * s1,const char * s2)249 int my_strcmp ( const char* s1, const char* s2 )
250 {
251    register unsigned char c1;
252    register unsigned char c2;
253    while (True) {
254       c1 = *(unsigned char *)s1;
255       c2 = *(unsigned char *)s2;
256       if (c1 != c2) break;
257       if (c1 == 0) break;
258       s1++; s2++;
259    }
260    if ((unsigned char)c1 < (unsigned char)c2) return -1;
261    if ((unsigned char)c1 > (unsigned char)c2) return 1;
262    return 0;
263 }
264 
265 
my_memcmp(const void * s1V,const void * s2V,int n)266 int my_memcmp ( const void *s1V, const void *s2V, int n )
267 {
268    int res;
269    unsigned char a0;
270    unsigned char b0;
271    unsigned char* s1 = (unsigned char*)s1V;
272    unsigned char* s2 = (unsigned char*)s2V;
273 
274    while (n != 0) {
275       a0 = s1[0];
276       b0 = s2[0];
277       s1 += 1;
278       s2 += 1;
279       res = ((int)a0) - ((int)b0);
280       if (res != 0)
281          return res;
282       n -= 1;
283    }
284    return 0;
285 }
286 
my_strchr(const char * s,int c)287 char* my_strchr ( const char* s, int c )
288 {
289    UChar  ch = (UChar)((UInt)c);
290    UChar* p  = (UChar*)s;
291    while (True) {
292       if (*p == ch) return p;
293       if (*p == 0) return NULL;
294       p++;
295    }
296 }
297 
my_malloc(int n)298 void* my_malloc ( int n )
299 {
300   void* r = (void*) (*serviceFn)(2,n);
301   return r;
302 }
303 
304 
305 /////////////////////////////////////////////////////////////////////
306 
vexxx_log_bytes(char * p,int n)307 static void vexxx_log_bytes ( char* p, int n )
308 {
309    int i;
310    for (i = 0; i < n; i++)
311       (*serviceFn)( 1, (int)p[i] );
312 }
313 
314 /*---------------------------------------------------------*/
315 /*--- vexxx_printf                                        ---*/
316 /*---------------------------------------------------------*/
317 
318 /* This should be the only <...> include in the entire VEX library.
319    New code for vex_util.c should go above this point. */
320 #include <stdarg.h>
321 
vexxx_toupper(HChar c)322 static HChar vexxx_toupper ( HChar c )
323 {
324    if (c >= 'a' && c <= 'z')
325       return c + ('A' - 'a');
326    else
327       return c;
328 }
329 
vexxx_strlen(const HChar * str)330 static Int vexxx_strlen ( const HChar* str )
331 {
332    Int i = 0;
333    while (str[i] != 0) i++;
334    return i;
335 }
336 
vexxx_streq(const HChar * s1,const HChar * s2)337 Bool vexxx_streq ( const HChar* s1, const HChar* s2 )
338 {
339    while (True) {
340       if (*s1 == 0 && *s2 == 0)
341          return True;
342       if (*s1 != *s2)
343          return False;
344       s1++;
345       s2++;
346    }
347 }
348 
349 /* Some flags.  */
350 #define VG_MSG_SIGNED    1 /* The value is signed. */
351 #define VG_MSG_ZJUSTIFY  2 /* Must justify with '0'. */
352 #define VG_MSG_LJUSTIFY  4 /* Must justify on the left. */
353 #define VG_MSG_PAREN     8 /* Parenthesize if present (for %y) */
354 #define VG_MSG_COMMA    16 /* Add commas to numbers (for %d, %u) */
355 
356 /* Copy a string into the buffer. */
357 static UInt
myvprintf_str(void (* send)(HChar),Int flags,Int width,HChar * str,Bool capitalise)358 myvprintf_str ( void(*send)(HChar), Int flags, Int width, HChar* str,
359                 Bool capitalise )
360 {
361 #  define MAYBE_TOUPPER(ch) (capitalise ? vexxx_toupper(ch) : (ch))
362    UInt ret = 0;
363    Int i, extra;
364    Int len = vexxx_strlen(str);
365 
366    if (width == 0) {
367       ret += len;
368       for (i = 0; i < len; i++)
369          send(MAYBE_TOUPPER(str[i]));
370       return ret;
371    }
372 
373    if (len > width) {
374       ret += width;
375       for (i = 0; i < width; i++)
376          send(MAYBE_TOUPPER(str[i]));
377       return ret;
378    }
379 
380    extra = width - len;
381    if (flags & VG_MSG_LJUSTIFY) {
382       ret += extra;
383       for (i = 0; i < extra; i++)
384          send(' ');
385    }
386    ret += len;
387    for (i = 0; i < len; i++)
388       send(MAYBE_TOUPPER(str[i]));
389    if (!(flags & VG_MSG_LJUSTIFY)) {
390       ret += extra;
391       for (i = 0; i < extra; i++)
392          send(' ');
393    }
394 
395 #  undef MAYBE_TOUPPER
396 
397    return ret;
398 }
399 
400 /* Write P into the buffer according to these args:
401  *  If SIGN is true, p is a signed.
402  *  BASE is the base.
403  *  If WITH_ZERO is true, '0' must be added.
404  *  WIDTH is the width of the field.
405  */
406 static UInt
myvprintf_int64(void (* send)(HChar),Int flags,Int base,Int width,ULong pL)407 myvprintf_int64 ( void(*send)(HChar), Int flags, Int base, Int width, ULong pL)
408 {
409    HChar buf[40];
410    Int   ind = 0;
411    Int   i, nc = 0;
412    Bool  neg = False;
413    HChar *digits = "0123456789ABCDEF";
414    UInt  ret = 0;
415    UInt  p = (UInt)pL;
416 
417    if (base < 2 || base > 16)
418       return ret;
419 
420    if ((flags & VG_MSG_SIGNED) && (Int)p < 0) {
421       p   = - (Int)p;
422       neg = True;
423    }
424 
425    if (p == 0)
426       buf[ind++] = '0';
427    else {
428       while (p > 0) {
429          if ((flags & VG_MSG_COMMA) && 10 == base &&
430              0 == (ind-nc) % 3 && 0 != ind)
431          {
432             buf[ind++] = ',';
433             nc++;
434          }
435          buf[ind++] = digits[p % base];
436          p /= base;
437       }
438    }
439 
440    if (neg)
441       buf[ind++] = '-';
442 
443    if (width > 0 && !(flags & VG_MSG_LJUSTIFY)) {
444       for(; ind < width; ind++) {
445 	//vassert(ind < 39);
446          buf[ind] = ((flags & VG_MSG_ZJUSTIFY) ? '0': ' ');
447       }
448    }
449 
450    /* Reverse copy to buffer.  */
451    ret += ind;
452    for (i = ind -1; i >= 0; i--) {
453       send(buf[i]);
454    }
455    if (width > 0 && (flags & VG_MSG_LJUSTIFY)) {
456       for(; ind < width; ind++) {
457 	 ret++;
458          send(' ');  // Never pad with zeroes on RHS -- changes the value!
459       }
460    }
461    return ret;
462 }
463 
464 
465 /* A simple vprintf().  */
466 static
vprintf_wrk(void (* send)(HChar),const HChar * format,va_list vargs)467 UInt vprintf_wrk ( void(*send)(HChar), const HChar *format, va_list vargs )
468 {
469    UInt ret = 0;
470    int i;
471    int flags;
472    int width;
473    Bool is_long;
474 
475    /* We assume that vargs has already been initialised by the
476       caller, using va_start, and that the caller will similarly
477       clean up with va_end.
478    */
479 
480    for (i = 0; format[i] != 0; i++) {
481       if (format[i] != '%') {
482          send(format[i]);
483 	 ret++;
484          continue;
485       }
486       i++;
487       /* A '%' has been found.  Ignore a trailing %. */
488       if (format[i] == 0)
489          break;
490       if (format[i] == '%') {
491          /* `%%' is replaced by `%'. */
492          send('%');
493 	 ret++;
494          continue;
495       }
496       flags = 0;
497       is_long = False;
498       width = 0; /* length of the field. */
499       if (format[i] == '(') {
500 	 flags |= VG_MSG_PAREN;
501 	 i++;
502       }
503       /* If ',' follows '%', commas will be inserted. */
504       if (format[i] == ',') {
505          flags |= VG_MSG_COMMA;
506          i++;
507       }
508       /* If '-' follows '%', justify on the left. */
509       if (format[i] == '-') {
510          flags |= VG_MSG_LJUSTIFY;
511          i++;
512       }
513       /* If '0' follows '%', pads will be inserted. */
514       if (format[i] == '0') {
515          flags |= VG_MSG_ZJUSTIFY;
516          i++;
517       }
518       /* Compute the field length. */
519       while (format[i] >= '0' && format[i] <= '9') {
520          width *= 10;
521          width += format[i++] - '0';
522       }
523       while (format[i] == 'l') {
524          i++;
525          is_long = True;
526       }
527 
528       switch (format[i]) {
529          case 'd': /* %d */
530             flags |= VG_MSG_SIGNED;
531             if (is_long)
532                ret += myvprintf_int64(send, flags, 10, width,
533 				      (ULong)(va_arg (vargs, Long)));
534             else
535                ret += myvprintf_int64(send, flags, 10, width,
536 				      (ULong)(va_arg (vargs, Int)));
537             break;
538          case 'u': /* %u */
539             if (is_long)
540                ret += myvprintf_int64(send, flags, 10, width,
541 				      (ULong)(va_arg (vargs, ULong)));
542             else
543                ret += myvprintf_int64(send, flags, 10, width,
544 				      (ULong)(va_arg (vargs, UInt)));
545             break;
546          case 'p': /* %p */
547 	    ret += 2;
548             send('0');
549             send('x');
550             ret += myvprintf_int64(send, flags, 16, width,
551 				   (ULong)((HWord)va_arg (vargs, void *)));
552             break;
553          case 'x': /* %x */
554             if (is_long)
555                ret += myvprintf_int64(send, flags, 16, width,
556 				      (ULong)(va_arg (vargs, ULong)));
557             else
558                ret += myvprintf_int64(send, flags, 16, width,
559 				      (ULong)(va_arg (vargs, UInt)));
560             break;
561          case 'c': /* %c */
562 	    ret++;
563             send((va_arg (vargs, int)));
564             break;
565          case 's': case 'S': { /* %s */
566             char *str = va_arg (vargs, char *);
567             if (str == (char*) 0) str = "(null)";
568             ret += myvprintf_str(send, flags, width, str,
569                                  (format[i]=='S'));
570             break;
571 	 }
572 #        if 0
573 	 case 'y': { /* %y - print symbol */
574 	    Addr a = va_arg(vargs, Addr);
575 
576             HChar *name;
577 	    if (VG_(get_fnname_w_offset)(a, &name)) {
578                HChar buf[1 + VG_strlen(name) + 1 + 1];
579 	       if (flags & VG_MSG_PAREN) {
580                   VG_(sprintf)(str, "(%s)", name):
581 	       } else {
582                   VG_(sprintf)(str, "%s", name):
583                }
584 	       ret += myvprintf_str(send, flags, width, buf, 0);
585 	    }
586 	    break;
587 	 }
588 #        endif
589          default:
590             break;
591       }
592    }
593    return ret;
594 }
595 
596 
597 /* A general replacement for printf().  Note that only low-level
598    debugging info should be sent via here.  The official route is to
599    to use vg_message().  This interface is deprecated.
600 */
601 static HChar myprintf_buf[1000];
602 static Int   n_myprintf_buf;
603 
add_to_myprintf_buf(HChar c)604 static void add_to_myprintf_buf ( HChar c )
605 {
606    if (c == '\n' || n_myprintf_buf >= 1000-10 /*paranoia*/ ) {
607       (*vexxx_log_bytes)( myprintf_buf, vexxx_strlen(myprintf_buf) );
608       n_myprintf_buf = 0;
609       myprintf_buf[n_myprintf_buf] = 0;
610    }
611    myprintf_buf[n_myprintf_buf++] = c;
612    myprintf_buf[n_myprintf_buf] = 0;
613 }
614 
vexxx_printf(const char * format,...)615 static UInt vexxx_printf ( const char *format, ... )
616 {
617    UInt ret;
618    va_list vargs;
619    va_start(vargs,format);
620 
621    n_myprintf_buf = 0;
622    myprintf_buf[n_myprintf_buf] = 0;
623    ret = vprintf_wrk ( add_to_myprintf_buf, format, vargs );
624 
625    if (n_myprintf_buf > 0) {
626       (*vexxx_log_bytes)( myprintf_buf, n_myprintf_buf );
627    }
628 
629    va_end(vargs);
630 
631    return ret;
632 }
633 
634 /*---------------------------------------------------------------*/
635 /*--- end                                          vex_util.c ---*/
636 /*---------------------------------------------------------------*/
637 
638 
639 /////////////////////////////////////////////////////////////////////
640 /////////////////////////////////////////////////////////////////////
641 /////////////////////////////////////////////////////////////////////
642 /////////////////////////////////////////////////////////////////////
643 
644 // BEGIN #include "ops-ppc.c"
645 /*
646  * WARNING:
647  * This file has been auto-generated by './gen-ppc' program
648  * Please don't edit by hand
649  */
650 
651 
652 //BEGIN #include "test-ppc.h"
653 /*
654  * test-ppc.h:
655  * PPC tests for qemu-PPC CPU emulation checks - definitions
656  *
657  * Copyright (c) 2005 Jocelyn Mayer
658  *
659  * This program is free software; you can redistribute it and/or
660  * modify it under the terms of the GNU General Public License V2
661  * as published by the Free Software Foundation.
662  */
663 
664 #if !defined (__TEST_PPC_H__)
665 #define __TEST_PPC_H__
666 
667 typedef void (*test_func_t) (void);
668 typedef struct test_t test_t;
669 typedef struct test_table_t test_table_t;
670 struct test_t {
671     test_func_t func;
672     const unsigned char *name;
673 };
674 
675 struct test_table_t {
676     test_t *tests;
677     const unsigned char *name;
678     int flags;
679 };
680 
681 typedef void (*test_loop_t) (const unsigned char *name, test_func_t func);
682 
683 enum test_flags {
684     /* Nb arguments */
685     PPC_ONE_ARG    = 0x00000001,
686     PPC_TWO_ARGS   = 0x00000002,
687     PPC_THREE_ARGS = 0x00000003,
688     PPC_CMP_ARGS   = 0x00000004,
689     PPC_CMPI_ARGS  = 0x00000005,
690     PPC_TWO_I16    = 0x00000006,
691     PPC_SPECIAL    = 0x00000007,
692     PPC_NB_ARGS    = 0x0000000F,
693     /* Type */
694     PPC_ARITH      = 0x00000100,
695     PPC_LOGICAL    = 0x00000200,
696     PPC_COMPARE    = 0x00000300,
697     PPC_CROP       = 0x00000400,
698     PPC_TYPE       = 0x00000F00,
699     /* Family */
700     PPC_INTEGER    = 0x00010000,
701     PPC_FLOAT      = 0x00020000,
702     PPC_405        = 0x00030000,
703     PPC_ALTIVEC    = 0x00040000,
704     PPC_FALTIVEC   = 0x00050000,
705     PPC_FAMILY     = 0x000F0000,
706     /* Flags */
707     PPC_CR         = 0x01000000,
708 };
709 
710 #endif /* !defined (__TEST_PPC_H__) */
711 
712 //END #include "test-ppc.h"
713 
test_add(void)714 static void test_add (void)
715 {
716     __asm__ __volatile__ ("add          17, 14, 15");
717 }
718 
test_addo(void)719 static void test_addo (void)
720 {
721     __asm__ __volatile__ ("addo         17, 14, 15");
722 }
723 
test_addc(void)724 static void test_addc (void)
725 {
726     __asm__ __volatile__ ("addc         17, 14, 15");
727 }
728 
test_addco(void)729 static void test_addco (void)
730 {
731     __asm__ __volatile__ ("addco        17, 14, 15");
732 }
733 
test_adde(void)734 static void test_adde (void)
735 {
736     __asm__ __volatile__ ("adde         17, 14, 15");
737 }
738 
test_addeo(void)739 static void test_addeo (void)
740 {
741     __asm__ __volatile__ ("addeo        17, 14, 15");
742 }
743 
test_divw(void)744 static void test_divw (void)
745 {
746     __asm__ __volatile__ ("divw         17, 14, 15");
747 }
748 
test_divwo(void)749 static void test_divwo (void)
750 {
751     __asm__ __volatile__ ("divwo        17, 14, 15");
752 }
753 
test_divwu(void)754 static void test_divwu (void)
755 {
756     __asm__ __volatile__ ("divwu        17, 14, 15");
757 }
758 
test_divwuo(void)759 static void test_divwuo (void)
760 {
761     __asm__ __volatile__ ("divwuo       17, 14, 15");
762 }
763 
test_mulhw(void)764 static void test_mulhw (void)
765 {
766     __asm__ __volatile__ ("mulhw        17, 14, 15");
767 }
768 
test_mulhwu(void)769 static void test_mulhwu (void)
770 {
771     __asm__ __volatile__ ("mulhwu       17, 14, 15");
772 }
773 
test_mullw(void)774 static void test_mullw (void)
775 {
776     __asm__ __volatile__ ("mullw        17, 14, 15");
777 }
778 
test_mullwo(void)779 static void test_mullwo (void)
780 {
781     __asm__ __volatile__ ("mullwo       17, 14, 15");
782 }
783 
test_subf(void)784 static void test_subf (void)
785 {
786     __asm__ __volatile__ ("subf         17, 14, 15");
787 }
788 
test_subfo(void)789 static void test_subfo (void)
790 {
791     __asm__ __volatile__ ("subfo        17, 14, 15");
792 }
793 
test_subfc(void)794 static void test_subfc (void)
795 {
796     __asm__ __volatile__ ("subfc        17, 14, 15");
797 }
798 
test_subfco(void)799 static void test_subfco (void)
800 {
801     __asm__ __volatile__ ("subfco       17, 14, 15");
802 }
803 
test_subfe(void)804 static void test_subfe (void)
805 {
806     __asm__ __volatile__ ("subfe        17, 14, 15");
807 }
808 
test_subfeo(void)809 static void test_subfeo (void)
810 {
811     __asm__ __volatile__ ("subfeo       17, 14, 15");
812 }
813 
814 static test_t tests_ia_ops_two[] = {
815     { &test_add             , "         add", },
816     { &test_addo            , "        addo", },
817     { &test_addc            , "        addc", },
818     { &test_addco           , "       addco", },
819     { &test_adde            , "        adde", },
820     { &test_addeo           , "       addeo", },
821     { &test_divw            , "        divw", },
822     { &test_divwo           , "       divwo", },
823     { &test_divwu           , "       divwu", },
824     { &test_divwuo          , "      divwuo", },
825     { &test_mulhw           , "       mulhw", },
826     { &test_mulhwu          , "      mulhwu", },
827     { &test_mullw           , "       mullw", },
828     { &test_mullwo          , "      mullwo", },
829     { &test_subf            , "        subf", },
830     { &test_subfo           , "       subfo", },
831     { &test_subfc           , "       subfc", },
832     { &test_subfco          , "      subfco", },
833     { &test_subfe           , "       subfe", },
834     { &test_subfeo          , "      subfeo", },
835     { NULL,                   NULL,           },
836 };
837 
test_add_(void)838 static void test_add_ (void)
839 {
840     __asm__ __volatile__ ("add.         17, 14, 15");
841 }
842 
test_addo_(void)843 static void test_addo_ (void)
844 {
845     __asm__ __volatile__ ("addo.        17, 14, 15");
846 }
847 
test_addc_(void)848 static void test_addc_ (void)
849 {
850     __asm__ __volatile__ ("addc.        17, 14, 15");
851 }
852 
test_addco_(void)853 static void test_addco_ (void)
854 {
855     __asm__ __volatile__ ("addco.       17, 14, 15");
856 }
857 
test_adde_(void)858 static void test_adde_ (void)
859 {
860     __asm__ __volatile__ ("adde.        17, 14, 15");
861 }
862 
test_addeo_(void)863 static void test_addeo_ (void)
864 {
865     __asm__ __volatile__ ("addeo.       17, 14, 15");
866 }
867 
test_divw_(void)868 static void test_divw_ (void)
869 {
870     __asm__ __volatile__ ("divw.        17, 14, 15");
871 }
872 
test_divwo_(void)873 static void test_divwo_ (void)
874 {
875     __asm__ __volatile__ ("divwo.       17, 14, 15");
876 }
877 
test_divwu_(void)878 static void test_divwu_ (void)
879 {
880     __asm__ __volatile__ ("divwu.       17, 14, 15");
881 }
882 
test_divwuo_(void)883 static void test_divwuo_ (void)
884 {
885     __asm__ __volatile__ ("divwuo.      17, 14, 15");
886 }
887 
test_subf_(void)888 static void test_subf_ (void)
889 {
890     __asm__ __volatile__ ("subf.        17, 14, 15");
891 }
892 
test_subfo_(void)893 static void test_subfo_ (void)
894 {
895     __asm__ __volatile__ ("subfo.       17, 14, 15");
896 }
897 
test_subfc_(void)898 static void test_subfc_ (void)
899 {
900     __asm__ __volatile__ ("subfc.       17, 14, 15");
901 }
902 
test_subfco_(void)903 static void test_subfco_ (void)
904 {
905     __asm__ __volatile__ ("subfco.      17, 14, 15");
906 }
907 
test_subfe_(void)908 static void test_subfe_ (void)
909 {
910     __asm__ __volatile__ ("subfe.       17, 14, 15");
911 }
912 
test_subfeo_(void)913 static void test_subfeo_ (void)
914 {
915     __asm__ __volatile__ ("subfeo.      17, 14, 15");
916 }
917 
918 static test_t tests_iar_ops_two[] = {
919     { &test_add_            , "        add.", },
920     { &test_addo_           , "       addo.", },
921     { &test_addc_           , "       addc.", },
922     { &test_addco_          , "      addco.", },
923     { &test_adde_           , "       adde.", },
924     { &test_addeo_          , "      addeo.", },
925     { &test_divw_           , "       divw.", },
926     { &test_divwo_          , "      divwo.", },
927     { &test_divwu_          , "      divwu.", },
928     { &test_divwuo_         , "     divwuo.", },
929     { &test_subf_           , "       subf.", },
930     { &test_subfo_          , "      subfo.", },
931     { &test_subfc_          , "      subfc.", },
932     { &test_subfco_         , "     subfco.", },
933     { &test_subfe_          , "      subfe.", },
934     { &test_subfeo_         , "     subfeo.", },
935     { NULL,                   NULL,           },
936 };
937 
test_and(void)938 static void test_and (void)
939 {
940     __asm__ __volatile__ ("and          17, 14, 15");
941 }
942 
test_andc(void)943 static void test_andc (void)
944 {
945     __asm__ __volatile__ ("andc         17, 14, 15");
946 }
947 
test_eqv(void)948 static void test_eqv (void)
949 {
950     __asm__ __volatile__ ("eqv          17, 14, 15");
951 }
952 
test_nand(void)953 static void test_nand (void)
954 {
955     __asm__ __volatile__ ("nand         17, 14, 15");
956 }
957 
test_nor(void)958 static void test_nor (void)
959 {
960     __asm__ __volatile__ ("nor          17, 14, 15");
961 }
962 
test_or(void)963 static void test_or (void)
964 {
965     __asm__ __volatile__ ("or           17, 14, 15");
966 }
967 
test_orc(void)968 static void test_orc (void)
969 {
970     __asm__ __volatile__ ("orc          17, 14, 15");
971 }
972 
test_xor(void)973 static void test_xor (void)
974 {
975     __asm__ __volatile__ ("xor          17, 14, 15");
976 }
977 
test_slw(void)978 static void test_slw (void)
979 {
980     __asm__ __volatile__ ("slw          17, 14, 15");
981 }
982 
test_sraw(void)983 static void test_sraw (void)
984 {
985     __asm__ __volatile__ ("sraw         17, 14, 15");
986 }
987 
test_srw(void)988 static void test_srw (void)
989 {
990     __asm__ __volatile__ ("srw          17, 14, 15");
991 }
992 
993 static test_t tests_il_ops_two[] = {
994     { &test_and             , "         and", },
995     { &test_andc            , "        andc", },
996     { &test_eqv             , "         eqv", },
997     { &test_nand            , "        nand", },
998     { &test_nor             , "         nor", },
999     { &test_or              , "          or", },
1000     { &test_orc             , "         orc", },
1001     { &test_xor             , "         xor", },
1002     { &test_slw             , "         slw", },
1003     { &test_sraw            , "        sraw", },
1004     { &test_srw             , "         srw", },
1005     { NULL,                   NULL,           },
1006 };
1007 
test_and_(void)1008 static void test_and_ (void)
1009 {
1010     __asm__ __volatile__ ("and.         17, 14, 15");
1011 }
1012 
test_andc_(void)1013 static void test_andc_ (void)
1014 {
1015     __asm__ __volatile__ ("andc.        17, 14, 15");
1016 }
1017 
test_eqv_(void)1018 static void test_eqv_ (void)
1019 {
1020     __asm__ __volatile__ ("eqv.         17, 14, 15");
1021 }
1022 
test_mulhw_(void)1023 static void test_mulhw_ (void)
1024 {
1025     __asm__ __volatile__ ("mulhw.       17, 14, 15");
1026 }
1027 
test_mulhwu_(void)1028 static void test_mulhwu_ (void)
1029 {
1030     __asm__ __volatile__ ("mulhwu.      17, 14, 15");
1031 }
1032 
test_mullw_(void)1033 static void test_mullw_ (void)
1034 {
1035     __asm__ __volatile__ ("mullw.       17, 14, 15");
1036 }
1037 
test_mullwo_(void)1038 static void test_mullwo_ (void)
1039 {
1040     __asm__ __volatile__ ("mullwo.      17, 14, 15");
1041 }
1042 
test_nand_(void)1043 static void test_nand_ (void)
1044 {
1045     __asm__ __volatile__ ("nand.        17, 14, 15");
1046 }
1047 
test_nor_(void)1048 static void test_nor_ (void)
1049 {
1050     __asm__ __volatile__ ("nor.         17, 14, 15");
1051 }
1052 
test_or_(void)1053 static void test_or_ (void)
1054 {
1055     __asm__ __volatile__ ("or.          17, 14, 15");
1056 }
1057 
test_orc_(void)1058 static void test_orc_ (void)
1059 {
1060     __asm__ __volatile__ ("orc.         17, 14, 15");
1061 }
1062 
test_xor_(void)1063 static void test_xor_ (void)
1064 {
1065     __asm__ __volatile__ ("xor.         17, 14, 15");
1066 }
1067 
test_slw_(void)1068 static void test_slw_ (void)
1069 {
1070     __asm__ __volatile__ ("slw.         17, 14, 15");
1071 }
1072 
test_sraw_(void)1073 static void test_sraw_ (void)
1074 {
1075     __asm__ __volatile__ ("sraw.        17, 14, 15");
1076 }
1077 
test_srw_(void)1078 static void test_srw_ (void)
1079 {
1080     __asm__ __volatile__ ("srw.         17, 14, 15");
1081 }
1082 
1083 static test_t tests_ilr_ops_two[] = {
1084     { &test_and_            , "        and.", },
1085     { &test_andc_           , "       andc.", },
1086     { &test_eqv_            , "        eqv.", },
1087     { &test_mulhw_          , "      mulhw.", },
1088     { &test_mulhwu_         , "     mulhwu.", },
1089     { &test_mullw_          , "      mullw.", },
1090     { &test_mullwo_         , "     mullwo.", },
1091     { &test_nand_           , "       nand.", },
1092     { &test_nor_            , "        nor.", },
1093     { &test_or_             , "         or.", },
1094     { &test_orc_            , "        orc.", },
1095     { &test_xor_            , "        xor.", },
1096     { &test_slw_            , "        slw.", },
1097     { &test_sraw_           , "       sraw.", },
1098     { &test_srw_            , "        srw.", },
1099     { NULL,                   NULL,           },
1100 };
1101 
test_cmp(void)1102 static void test_cmp (void)
1103 {
1104     __asm__ __volatile__ ("cmp          2, 14, 15");
1105 }
1106 
test_cmpl(void)1107 static void test_cmpl (void)
1108 {
1109     __asm__ __volatile__ ("cmpl         2, 14, 15");
1110 }
1111 
1112 static test_t tests_icr_ops_two[] = {
1113     { &test_cmp             , "         cmp", },
1114     { &test_cmpl            , "        cmpl", },
1115     { NULL,                   NULL,           },
1116 };
1117 
test_cmpi(void)1118 static void test_cmpi (void)
1119 {
1120     __asm__ __volatile__ ("cmpi         2, 14, 15");
1121 }
1122 
test_cmpli(void)1123 static void test_cmpli (void)
1124 {
1125     __asm__ __volatile__ ("cmpli        2, 14, 15");
1126 }
1127 
1128 static test_t tests_icr_ops_two_i16[] = {
1129     { &test_cmpi            , "        cmpi", },
1130     { &test_cmpli           , "       cmpli", },
1131     { NULL,                   NULL,           },
1132 };
1133 
test_addi(void)1134 static void test_addi (void)
1135 {
1136     __asm__ __volatile__ ("addi         17, 14, 0");
1137 }
1138 
test_addic(void)1139 static void test_addic (void)
1140 {
1141     __asm__ __volatile__ ("addic        17, 14, 0");
1142 }
1143 
test_addis(void)1144 static void test_addis (void)
1145 {
1146     __asm__ __volatile__ ("addis        17, 14, 0");
1147 }
1148 
test_mulli(void)1149 static void test_mulli (void)
1150 {
1151     __asm__ __volatile__ ("mulli        17, 14, 0");
1152 }
1153 
test_subfic(void)1154 static void test_subfic (void)
1155 {
1156     __asm__ __volatile__ ("subfic       17, 14, 0");
1157 }
1158 
1159 static test_t tests_ia_ops_two_i16[] = {
1160     { &test_addi            , "        addi", },
1161     { &test_addic           , "       addic", },
1162     { &test_addis           , "       addis", },
1163     { &test_mulli           , "       mulli", },
1164     { &test_subfic          , "      subfic", },
1165     { NULL,                   NULL,           },
1166 };
1167 
test_addic_(void)1168 static void test_addic_ (void)
1169 {
1170     __asm__ __volatile__ ("addic.       17, 14, 0");
1171 }
1172 
1173 static test_t tests_iar_ops_two_i16[] = {
1174     { &test_addic_          , "      addic.", },
1175     { NULL,                   NULL,           },
1176 };
1177 
test_ori(void)1178 static void test_ori (void)
1179 {
1180     __asm__ __volatile__ ("ori          17, 14, 0");
1181 }
1182 
test_oris(void)1183 static void test_oris (void)
1184 {
1185     __asm__ __volatile__ ("oris         17, 14, 0");
1186 }
1187 
test_xori(void)1188 static void test_xori (void)
1189 {
1190     __asm__ __volatile__ ("xori         17, 14, 0");
1191 }
1192 
test_xoris(void)1193 static void test_xoris (void)
1194 {
1195     __asm__ __volatile__ ("xoris        17, 14, 0");
1196 }
1197 
1198 static test_t tests_il_ops_two_i16[] = {
1199     { &test_ori             , "         ori", },
1200     { &test_oris            , "        oris", },
1201     { &test_xori            , "        xori", },
1202     { &test_xoris           , "       xoris", },
1203     { NULL,                   NULL,           },
1204 };
1205 
test_andi_(void)1206 static void test_andi_ (void)
1207 {
1208     __asm__ __volatile__ ("andi.        17, 14, 0");
1209 }
1210 
test_andis_(void)1211 static void test_andis_ (void)
1212 {
1213     __asm__ __volatile__ ("andis.       17, 14, 0");
1214 }
1215 
1216 static test_t tests_ilr_ops_two_i16[] = {
1217     { &test_andi_           , "       andi.", },
1218     { &test_andis_          , "      andis.", },
1219     { NULL,                   NULL,           },
1220 };
1221 
test_crand(void)1222 static void test_crand (void)
1223 {
1224     __asm__ __volatile__ ("crand        17, 14, 15");
1225 }
1226 
test_crandc(void)1227 static void test_crandc (void)
1228 {
1229     __asm__ __volatile__ ("crandc       17, 14, 15");
1230 }
1231 
test_creqv(void)1232 static void test_creqv (void)
1233 {
1234     __asm__ __volatile__ ("creqv        17, 14, 15");
1235 }
1236 
test_crnand(void)1237 static void test_crnand (void)
1238 {
1239     __asm__ __volatile__ ("crnand       17, 14, 15");
1240 }
1241 
test_crnor(void)1242 static void test_crnor (void)
1243 {
1244     __asm__ __volatile__ ("crnor        17, 14, 15");
1245 }
1246 
test_cror(void)1247 static void test_cror (void)
1248 {
1249     __asm__ __volatile__ ("cror         17, 14, 15");
1250 }
1251 
test_crorc(void)1252 static void test_crorc (void)
1253 {
1254     __asm__ __volatile__ ("crorc        17, 14, 15");
1255 }
1256 
test_crxor(void)1257 static void test_crxor (void)
1258 {
1259     __asm__ __volatile__ ("crxor        17, 14, 15");
1260 }
1261 
1262 static test_t tests_crl_ops_two[] = {
1263     { &test_crand           , "       crand", },
1264     { &test_crandc          , "      crandc", },
1265     { &test_creqv           , "       creqv", },
1266     { &test_crnand          , "      crnand", },
1267     { &test_crnor           , "       crnor", },
1268     { &test_cror            , "        cror", },
1269     { &test_crorc           , "       crorc", },
1270     { &test_crxor           , "       crxor", },
1271     { NULL,                   NULL,           },
1272 };
1273 
test_addme(void)1274 static void test_addme (void)
1275 {
1276     __asm__ __volatile__ ("addme        17, 14");
1277 }
1278 
test_addmeo(void)1279 static void test_addmeo (void)
1280 {
1281     __asm__ __volatile__ ("addmeo       17, 14");
1282 }
1283 
test_addze(void)1284 static void test_addze (void)
1285 {
1286     __asm__ __volatile__ ("addze        17, 14");
1287 }
1288 
test_addzeo(void)1289 static void test_addzeo (void)
1290 {
1291     __asm__ __volatile__ ("addzeo       17, 14");
1292 }
1293 
test_subfme(void)1294 static void test_subfme (void)
1295 {
1296     __asm__ __volatile__ ("subfme       17, 14");
1297 }
1298 
test_subfmeo(void)1299 static void test_subfmeo (void)
1300 {
1301     __asm__ __volatile__ ("subfmeo      17, 14");
1302 }
1303 
test_subfze(void)1304 static void test_subfze (void)
1305 {
1306     __asm__ __volatile__ ("subfze       17, 14");
1307 }
1308 
test_subfzeo(void)1309 static void test_subfzeo (void)
1310 {
1311     __asm__ __volatile__ ("subfzeo      17, 14");
1312 }
1313 
1314 static test_t tests_ia_ops_one[] = {
1315     { &test_addme           , "       addme", },
1316     { &test_addmeo          , "      addmeo", },
1317     { &test_addze           , "       addze", },
1318     { &test_addzeo          , "      addzeo", },
1319     { &test_subfme          , "      subfme", },
1320     { &test_subfmeo         , "     subfmeo", },
1321     { &test_subfze          , "      subfze", },
1322     { &test_subfzeo         , "     subfzeo", },
1323     { NULL,                   NULL,           },
1324 };
1325 
test_addme_(void)1326 static void test_addme_ (void)
1327 {
1328     __asm__ __volatile__ ("addme.       17, 14");
1329 }
1330 
test_addmeo_(void)1331 static void test_addmeo_ (void)
1332 {
1333     __asm__ __volatile__ ("addmeo.      17, 14");
1334 }
1335 
test_addze_(void)1336 static void test_addze_ (void)
1337 {
1338     __asm__ __volatile__ ("addze.       17, 14");
1339 }
1340 
test_addzeo_(void)1341 static void test_addzeo_ (void)
1342 {
1343     __asm__ __volatile__ ("addzeo.      17, 14");
1344 }
1345 
test_subfme_(void)1346 static void test_subfme_ (void)
1347 {
1348     __asm__ __volatile__ ("subfme.      17, 14");
1349 }
1350 
test_subfmeo_(void)1351 static void test_subfmeo_ (void)
1352 {
1353     __asm__ __volatile__ ("subfmeo.     17, 14");
1354 }
1355 
test_subfze_(void)1356 static void test_subfze_ (void)
1357 {
1358     __asm__ __volatile__ ("subfze.      17, 14");
1359 }
1360 
test_subfzeo_(void)1361 static void test_subfzeo_ (void)
1362 {
1363     __asm__ __volatile__ ("subfzeo.     17, 14");
1364 }
1365 
1366 static test_t tests_iar_ops_one[] = {
1367     { &test_addme_          , "      addme.", },
1368     { &test_addmeo_         , "     addmeo.", },
1369     { &test_addze_          , "      addze.", },
1370     { &test_addzeo_         , "     addzeo.", },
1371     { &test_subfme_         , "     subfme.", },
1372     { &test_subfmeo_        , "    subfmeo.", },
1373     { &test_subfze_         , "     subfze.", },
1374     { &test_subfzeo_        , "    subfzeo.", },
1375     { NULL,                   NULL,           },
1376 };
1377 
test_cntlzw(void)1378 static void test_cntlzw (void)
1379 {
1380     __asm__ __volatile__ ("cntlzw       17, 14");
1381 }
1382 
test_extsb(void)1383 static void test_extsb (void)
1384 {
1385     __asm__ __volatile__ ("extsb        17, 14");
1386 }
1387 
test_extsh(void)1388 static void test_extsh (void)
1389 {
1390     __asm__ __volatile__ ("extsh        17, 14");
1391 }
1392 
test_neg(void)1393 static void test_neg (void)
1394 {
1395     __asm__ __volatile__ ("neg          17, 14");
1396 }
1397 
test_nego(void)1398 static void test_nego (void)
1399 {
1400     __asm__ __volatile__ ("nego         17, 14");
1401 }
1402 
1403 static test_t tests_il_ops_one[] = {
1404     { &test_cntlzw          , "      cntlzw", },
1405     { &test_extsb           , "       extsb", },
1406     { &test_extsh           , "       extsh", },
1407     { &test_neg             , "         neg", },
1408     { &test_nego            , "        nego", },
1409     { NULL,                   NULL,           },
1410 };
1411 
test_cntlzw_(void)1412 static void test_cntlzw_ (void)
1413 {
1414     __asm__ __volatile__ ("cntlzw.      17, 14");
1415 }
1416 
test_extsb_(void)1417 static void test_extsb_ (void)
1418 {
1419     __asm__ __volatile__ ("extsb.       17, 14");
1420 }
1421 
test_extsh_(void)1422 static void test_extsh_ (void)
1423 {
1424     __asm__ __volatile__ ("extsh.       17, 14");
1425 }
1426 
test_neg_(void)1427 static void test_neg_ (void)
1428 {
1429     __asm__ __volatile__ ("neg.         17, 14");
1430 }
1431 
test_nego_(void)1432 static void test_nego_ (void)
1433 {
1434     __asm__ __volatile__ ("nego.        17, 14");
1435 }
1436 
1437 static test_t tests_ilr_ops_one[] = {
1438     { &test_cntlzw_         , "     cntlzw.", },
1439     { &test_extsb_          , "      extsb.", },
1440     { &test_extsh_          , "      extsh.", },
1441     { &test_neg_            , "        neg.", },
1442     { &test_nego_           , "       nego.", },
1443     { NULL,                   NULL,           },
1444 };
1445 
test_rlwimi(void)1446 static void test_rlwimi (void)
1447 {
1448     __asm__ __volatile__ ("rlwimi       17, 14, 0, 0, 0");
1449 }
1450 
test_rlwinm(void)1451 static void test_rlwinm (void)
1452 {
1453     __asm__ __volatile__ ("rlwinm       17, 14, 0, 0, 0");
1454 }
1455 
test_rlwnm(void)1456 static void test_rlwnm (void)
1457 {
1458     __asm__ __volatile__ ("rlwnm        17, 14, 15, 0, 0");
1459 }
1460 
test_srawi(void)1461 static void test_srawi (void)
1462 {
1463     __asm__ __volatile__ ("srawi        17, 14, 0");
1464 }
1465 
1466 static test_t tests_il_ops_spe[] = {
1467     { &test_rlwimi          , "      rlwimi", },
1468     { &test_rlwinm          , "      rlwinm", },
1469     { &test_rlwnm           , "       rlwnm", },
1470     { &test_srawi           , "       srawi", },
1471     { NULL,                   NULL,           },
1472 };
1473 
test_rlwimi_(void)1474 static void test_rlwimi_ (void)
1475 {
1476     __asm__ __volatile__ ("rlwimi.      17, 14, 0, 0, 0");
1477 }
1478 
test_rlwinm_(void)1479 static void test_rlwinm_ (void)
1480 {
1481     __asm__ __volatile__ ("rlwinm.      17, 14, 0, 0, 0");
1482 }
1483 
test_rlwnm_(void)1484 static void test_rlwnm_ (void)
1485 {
1486     __asm__ __volatile__ ("rlwnm.       17, 14, 15, 0, 0");
1487 }
1488 
test_srawi_(void)1489 static void test_srawi_ (void)
1490 {
1491     __asm__ __volatile__ ("srawi.       17, 14, 0");
1492 }
1493 
1494 static test_t tests_ilr_ops_spe[] = {
1495     { &test_rlwimi_         , "     rlwimi.", },
1496     { &test_rlwinm_         , "     rlwinm.", },
1497     { &test_rlwnm_          , "      rlwnm.", },
1498     { &test_srawi_          , "      srawi.", },
1499     { NULL,                   NULL,           },
1500 };
1501 
1502 #if !defined (NO_FLOAT)
test_fsel(void)1503 static void test_fsel (void)
1504 {
1505     __asm__ __volatile__ ("fsel         17, 14, 15, 16");
1506 }
1507 
test_fmadd(void)1508 static void test_fmadd (void)
1509 {
1510     __asm__ __volatile__ ("fmadd        17, 14, 15, 16");
1511 }
1512 
test_fmadds(void)1513 static void test_fmadds (void)
1514 {
1515     __asm__ __volatile__ ("fmadds       17, 14, 15, 16");
1516 }
1517 
test_fmsub(void)1518 static void test_fmsub (void)
1519 {
1520     __asm__ __volatile__ ("fmsub        17, 14, 15, 16");
1521 }
1522 
test_fmsubs(void)1523 static void test_fmsubs (void)
1524 {
1525     __asm__ __volatile__ ("fmsubs       17, 14, 15, 16");
1526 }
1527 
test_fnmadd(void)1528 static void test_fnmadd (void)
1529 {
1530     __asm__ __volatile__ ("fnmadd       17, 14, 15, 16");
1531 }
1532 
test_fnmadds(void)1533 static void test_fnmadds (void)
1534 {
1535     __asm__ __volatile__ ("fnmadds      17, 14, 15, 16");
1536 }
1537 
test_fnmsub(void)1538 static void test_fnmsub (void)
1539 {
1540     __asm__ __volatile__ ("fnmsub       17, 14, 15, 16");
1541 }
1542 
test_fnmsubs(void)1543 static void test_fnmsubs (void)
1544 {
1545     __asm__ __volatile__ ("fnmsubs      17, 14, 15, 16");
1546 }
1547 
1548 static test_t tests_fa_ops_three[] = {
1549     { &test_fsel            , "        fsel", },
1550     { &test_fmadd           , "       fmadd", },
1551     { &test_fmadds          , "      fmadds", },
1552     { &test_fmsub           , "       fmsub", },
1553     { &test_fmsubs          , "      fmsubs", },
1554     { &test_fnmadd          , "      fnmadd", },
1555     { &test_fnmadds         , "     fnmadds", },
1556     { &test_fnmsub          , "      fnmsub", },
1557     { &test_fnmsubs         , "     fnmsubs", },
1558     { NULL,                   NULL,           },
1559 };
1560 #endif /* !defined (NO_FLOAT) */
1561 
1562 #if !defined (NO_FLOAT)
test_fsel_(void)1563 static void test_fsel_ (void)
1564 {
1565     __asm__ __volatile__ ("fsel.        17, 14, 15, 16");
1566 }
1567 
test_fmadd_(void)1568 static void test_fmadd_ (void)
1569 {
1570     __asm__ __volatile__ ("fmadd.       17, 14, 15, 16");
1571 }
1572 
test_fmadds_(void)1573 static void test_fmadds_ (void)
1574 {
1575     __asm__ __volatile__ ("fmadds.      17, 14, 15, 16");
1576 }
1577 
test_fmsub_(void)1578 static void test_fmsub_ (void)
1579 {
1580     __asm__ __volatile__ ("fmsub.       17, 14, 15, 16");
1581 }
1582 
test_fmsubs_(void)1583 static void test_fmsubs_ (void)
1584 {
1585     __asm__ __volatile__ ("fmsubs.      17, 14, 15, 16");
1586 }
1587 
test_fnmadd_(void)1588 static void test_fnmadd_ (void)
1589 {
1590     __asm__ __volatile__ ("fnmadd.      17, 14, 15, 16");
1591 }
1592 
test_fnmadds_(void)1593 static void test_fnmadds_ (void)
1594 {
1595     __asm__ __volatile__ ("fnmadds.     17, 14, 15, 16");
1596 }
1597 
test_fnmsub_(void)1598 static void test_fnmsub_ (void)
1599 {
1600     __asm__ __volatile__ ("fnmsub.      17, 14, 15, 16");
1601 }
1602 
test_fnmsubs_(void)1603 static void test_fnmsubs_ (void)
1604 {
1605     __asm__ __volatile__ ("fnmsubs.     17, 14, 15, 16");
1606 }
1607 
1608 static test_t tests_far_ops_three[] = {
1609     { &test_fsel_           , "       fsel.", },
1610     { &test_fmadd_          , "      fmadd.", },
1611     { &test_fmadds_         , "     fmadds.", },
1612     { &test_fmsub_          , "      fmsub.", },
1613     { &test_fmsubs_         , "     fmsubs.", },
1614     { &test_fnmadd_         , "     fnmadd.", },
1615     { &test_fnmadds_        , "    fnmadds.", },
1616     { &test_fnmsub_         , "     fnmsub.", },
1617     { &test_fnmsubs_        , "    fnmsubs.", },
1618     { NULL,                   NULL,           },
1619 };
1620 #endif /* !defined (NO_FLOAT) */
1621 
1622 #if !defined (NO_FLOAT)
test_fadd(void)1623 static void test_fadd (void)
1624 {
1625     __asm__ __volatile__ ("fadd         17, 14, 15");
1626 }
1627 
test_fadds(void)1628 static void test_fadds (void)
1629 {
1630     __asm__ __volatile__ ("fadds        17, 14, 15");
1631 }
1632 
test_fsub(void)1633 static void test_fsub (void)
1634 {
1635     __asm__ __volatile__ ("fsub         17, 14, 15");
1636 }
1637 
test_fsubs(void)1638 static void test_fsubs (void)
1639 {
1640     __asm__ __volatile__ ("fsubs        17, 14, 15");
1641 }
1642 
test_fmul(void)1643 static void test_fmul (void)
1644 {
1645     __asm__ __volatile__ ("fmul         17, 14, 15");
1646 }
1647 
test_fmuls(void)1648 static void test_fmuls (void)
1649 {
1650     __asm__ __volatile__ ("fmuls        17, 14, 15");
1651 }
1652 
test_fdiv(void)1653 static void test_fdiv (void)
1654 {
1655     __asm__ __volatile__ ("fdiv         17, 14, 15");
1656 }
1657 
test_fdivs(void)1658 static void test_fdivs (void)
1659 {
1660     __asm__ __volatile__ ("fdivs        17, 14, 15");
1661 }
1662 
1663 static test_t tests_fa_ops_two[] = {
1664     { &test_fadd            , "        fadd", },
1665     { &test_fadds           , "       fadds", },
1666     { &test_fsub            , "        fsub", },
1667     { &test_fsubs           , "       fsubs", },
1668     { &test_fmul            , "        fmul", },
1669     { &test_fmuls           , "       fmuls", },
1670     { &test_fdiv            , "        fdiv", },
1671     { &test_fdivs           , "       fdivs", },
1672     { NULL,                   NULL,           },
1673 };
1674 #endif /* !defined (NO_FLOAT) */
1675 
1676 #if !defined (NO_FLOAT)
test_fadd_(void)1677 static void test_fadd_ (void)
1678 {
1679     __asm__ __volatile__ ("fadd.        17, 14, 15");
1680 }
1681 
test_fadds_(void)1682 static void test_fadds_ (void)
1683 {
1684     __asm__ __volatile__ ("fadds.       17, 14, 15");
1685 }
1686 
test_fsub_(void)1687 static void test_fsub_ (void)
1688 {
1689     __asm__ __volatile__ ("fsub.        17, 14, 15");
1690 }
1691 
test_fsubs_(void)1692 static void test_fsubs_ (void)
1693 {
1694     __asm__ __volatile__ ("fsubs.       17, 14, 15");
1695 }
1696 
test_fmul_(void)1697 static void test_fmul_ (void)
1698 {
1699     __asm__ __volatile__ ("fmul.        17, 14, 15");
1700 }
1701 
test_fmuls_(void)1702 static void test_fmuls_ (void)
1703 {
1704     __asm__ __volatile__ ("fmuls.       17, 14, 15");
1705 }
1706 
test_fdiv_(void)1707 static void test_fdiv_ (void)
1708 {
1709     __asm__ __volatile__ ("fdiv.        17, 14, 15");
1710 }
1711 
test_fdivs_(void)1712 static void test_fdivs_ (void)
1713 {
1714     __asm__ __volatile__ ("fdivs.       17, 14, 15");
1715 }
1716 
1717 static test_t tests_far_ops_two[] = {
1718     { &test_fadd_           , "       fadd.", },
1719     { &test_fadds_          , "      fadds.", },
1720     { &test_fsub_           , "       fsub.", },
1721     { &test_fsubs_          , "      fsubs.", },
1722     { &test_fmul_           , "       fmul.", },
1723     { &test_fmuls_          , "      fmuls.", },
1724     { &test_fdiv_           , "       fdiv.", },
1725     { &test_fdivs_          , "      fdivs.", },
1726     { NULL,                   NULL,           },
1727 };
1728 #endif /* !defined (NO_FLOAT) */
1729 
1730 #if !defined (NO_FLOAT)
test_fcmpo(void)1731 static void test_fcmpo (void)
1732 {
1733     __asm__ __volatile__ ("fcmpo        2, 14, 15");
1734 }
1735 
test_fcmpu(void)1736 static void test_fcmpu (void)
1737 {
1738     __asm__ __volatile__ ("fcmpu        2, 14, 15");
1739 }
1740 
1741 static test_t tests_fcr_ops_two[] = {
1742     { &test_fcmpo           , "       fcmpo", },
1743     { &test_fcmpu           , "       fcmpu", },
1744     { NULL,                   NULL,           },
1745 };
1746 #endif /* !defined (NO_FLOAT) */
1747 
1748 #if !defined (NO_FLOAT)
test_fres(void)1749 static void test_fres (void)
1750 {
1751     __asm__ __volatile__ ("fres         17, 14");
1752 }
1753 
test_frsqrte(void)1754 static void test_frsqrte (void)
1755 {
1756     __asm__ __volatile__ ("frsqrte      17, 14");
1757 }
1758 
test_frsp(void)1759 static void test_frsp (void)
1760 {
1761     __asm__ __volatile__ ("frsp         17, 14");
1762 }
1763 
test_fctiw(void)1764 static void test_fctiw (void)
1765 {
1766     __asm__ __volatile__ ("fctiw        17, 14");
1767 }
1768 
test_fctiwz(void)1769 static void test_fctiwz (void)
1770 {
1771     __asm__ __volatile__ ("fctiwz       17, 14");
1772 }
1773 
test_fmr(void)1774 static void test_fmr (void)
1775 {
1776     __asm__ __volatile__ ("fmr          17, 14");
1777 }
1778 
test_fneg(void)1779 static void test_fneg (void)
1780 {
1781     __asm__ __volatile__ ("fneg         17, 14");
1782 }
1783 
test_fabs(void)1784 static void test_fabs (void)
1785 {
1786     __asm__ __volatile__ ("fabs         17, 14");
1787 }
1788 
test_fnabs(void)1789 static void test_fnabs (void)
1790 {
1791     __asm__ __volatile__ ("fnabs        17, 14");
1792 }
1793 
1794 static test_t tests_fa_ops_one[] = {
1795     { &test_fres            , "        fres", },
1796     { &test_frsqrte         , "     frsqrte", },
1797     { &test_frsp            , "        frsp", },
1798     { &test_fctiw           , "       fctiw", },
1799     { &test_fctiwz          , "      fctiwz", },
1800     { &test_fmr             , "         fmr", },
1801     { &test_fneg            , "        fneg", },
1802     { &test_fabs            , "        fabs", },
1803     { &test_fnabs           , "       fnabs", },
1804     { NULL,                   NULL,           },
1805 };
1806 #endif /* !defined (NO_FLOAT) */
1807 
1808 #if !defined (NO_FLOAT)
test_fres_(void)1809 static void test_fres_ (void)
1810 {
1811     __asm__ __volatile__ ("fres.        17, 14");
1812 }
1813 
test_frsqrte_(void)1814 static void test_frsqrte_ (void)
1815 {
1816     __asm__ __volatile__ ("frsqrte.     17, 14");
1817 }
1818 
test_frsp_(void)1819 static void test_frsp_ (void)
1820 {
1821     __asm__ __volatile__ ("frsp.        17, 14");
1822 }
1823 
test_fctiw_(void)1824 static void test_fctiw_ (void)
1825 {
1826     __asm__ __volatile__ ("fctiw.       17, 14");
1827 }
1828 
test_fctiwz_(void)1829 static void test_fctiwz_ (void)
1830 {
1831     __asm__ __volatile__ ("fctiwz.      17, 14");
1832 }
1833 
test_fmr_(void)1834 static void test_fmr_ (void)
1835 {
1836     __asm__ __volatile__ ("fmr.         17, 14");
1837 }
1838 
test_fneg_(void)1839 static void test_fneg_ (void)
1840 {
1841     __asm__ __volatile__ ("fneg.        17, 14");
1842 }
1843 
test_fabs_(void)1844 static void test_fabs_ (void)
1845 {
1846     __asm__ __volatile__ ("fabs.        17, 14");
1847 }
1848 
test_fnabs_(void)1849 static void test_fnabs_ (void)
1850 {
1851     __asm__ __volatile__ ("fnabs.       17, 14");
1852 }
1853 
1854 static test_t tests_far_ops_one[] = {
1855     { &test_fres_           , "       fres.", },
1856     { &test_frsqrte_        , "    frsqrte.", },
1857     { &test_frsp_           , "       frsp.", },
1858     { &test_fctiw_          , "      fctiw.", },
1859     { &test_fctiwz_         , "     fctiwz.", },
1860     { &test_fmr_            , "        fmr.", },
1861     { &test_fneg_           , "       fneg.", },
1862     { &test_fabs_           , "       fabs.", },
1863     { &test_fnabs_          , "      fnabs.", },
1864     { NULL,                   NULL,           },
1865 };
1866 #endif /* !defined (NO_FLOAT) */
1867 
1868 #if !defined (NO_FLOAT)
1869 static test_t tests_fl_ops_spe[] = {
1870     { NULL,                   NULL,           },
1871 };
1872 #endif /* !defined (NO_FLOAT) */
1873 
1874 #if !defined (NO_FLOAT)
1875 static test_t tests_flr_ops_spe[] = {
1876     { NULL,                   NULL,           },
1877 };
1878 #endif /* !defined (NO_FLOAT) */
1879 
1880 #if defined (HAS_ALTIVEC)
test_vmhaddshs(void)1881 static void test_vmhaddshs (void)
1882 {
1883     __asm__ __volatile__ ("vmhaddshs    17, 14, 15, 16");
1884 }
1885 
test_vmhraddshs(void)1886 static void test_vmhraddshs (void)
1887 {
1888     __asm__ __volatile__ ("vmhraddshs   17, 14, 15, 16");
1889 }
1890 
test_vmladduhm(void)1891 static void test_vmladduhm (void)
1892 {
1893     __asm__ __volatile__ ("vmladduhm    17, 14, 15, 16");
1894 }
1895 
test_vmsumubm(void)1896 static void test_vmsumubm (void)
1897 {
1898     __asm__ __volatile__ ("vmsumubm     17, 14, 15, 16");
1899 }
1900 
test_vmsumuhm(void)1901 static void test_vmsumuhm (void)
1902 {
1903     __asm__ __volatile__ ("vmsumuhm     17, 14, 15, 16");
1904 }
1905 
test_vmsumshs(void)1906 static void test_vmsumshs (void)
1907 {
1908     __asm__ __volatile__ ("vmsumshs     17, 14, 15, 16");
1909 }
1910 
test_vmsumuhs(void)1911 static void test_vmsumuhs (void)
1912 {
1913     __asm__ __volatile__ ("vmsumuhs     17, 14, 15, 16");
1914 }
1915 
test_vmsummbm(void)1916 static void test_vmsummbm (void)
1917 {
1918     __asm__ __volatile__ ("vmsummbm     17, 14, 15, 16");
1919 }
1920 
test_vmsumshm(void)1921 static void test_vmsumshm (void)
1922 {
1923     __asm__ __volatile__ ("vmsumshm     17, 14, 15, 16");
1924 }
1925 
1926 static test_t tests_aa_ops_three[] = {
1927     { &test_vmhaddshs       , "   vmhaddshs", },
1928     { &test_vmhraddshs      , "  vmhraddshs", },
1929     { &test_vmladduhm       , "   vmladduhm", },
1930     { &test_vmsumubm        , "    vmsumubm", },
1931     { &test_vmsumuhm        , "    vmsumuhm", },
1932     { &test_vmsumshs        , "    vmsumshs", },
1933     { &test_vmsumuhs        , "    vmsumuhs", },
1934     { &test_vmsummbm        , "    vmsummbm", },
1935     { &test_vmsumshm        , "    vmsumshm", },
1936     { NULL,                   NULL,           },
1937 };
1938 #endif /* defined (HAS_ALTIVEC) */
1939 
1940 #if defined (HAS_ALTIVEC)
test_vperm(void)1941 static void test_vperm (void)
1942 {
1943     __asm__ __volatile__ ("vperm        17, 14, 15, 16");
1944 }
1945 
test_vsel(void)1946 static void test_vsel (void)
1947 {
1948     __asm__ __volatile__ ("vsel         17, 14, 15, 16");
1949 }
1950 
1951 static test_t tests_al_ops_three[] = {
1952     { &test_vperm           , "       vperm", },
1953     { &test_vsel            , "        vsel", },
1954     { NULL,                   NULL,           },
1955 };
1956 #endif /* defined (HAS_ALTIVEC) */
1957 
1958 #if defined (HAS_ALTIVEC)
test_vaddubm(void)1959 static void test_vaddubm (void)
1960 {
1961     __asm__ __volatile__ ("vaddubm      17, 14, 15");
1962 }
1963 
test_vadduhm(void)1964 static void test_vadduhm (void)
1965 {
1966     __asm__ __volatile__ ("vadduhm      17, 14, 15");
1967 }
1968 
test_vadduwm(void)1969 static void test_vadduwm (void)
1970 {
1971     __asm__ __volatile__ ("vadduwm      17, 14, 15");
1972 }
1973 
test_vaddubs(void)1974 static void test_vaddubs (void)
1975 {
1976     __asm__ __volatile__ ("vaddubs      17, 14, 15");
1977 }
1978 
test_vadduhs(void)1979 static void test_vadduhs (void)
1980 {
1981     __asm__ __volatile__ ("vadduhs      17, 14, 15");
1982 }
1983 
test_vadduws(void)1984 static void test_vadduws (void)
1985 {
1986     __asm__ __volatile__ ("vadduws      17, 14, 15");
1987 }
1988 
test_vaddsbs(void)1989 static void test_vaddsbs (void)
1990 {
1991     __asm__ __volatile__ ("vaddsbs      17, 14, 15");
1992 }
1993 
test_vaddshs(void)1994 static void test_vaddshs (void)
1995 {
1996     __asm__ __volatile__ ("vaddshs      17, 14, 15");
1997 }
1998 
test_vaddsws(void)1999 static void test_vaddsws (void)
2000 {
2001     __asm__ __volatile__ ("vaddsws      17, 14, 15");
2002 }
2003 
test_vaddcuw(void)2004 static void test_vaddcuw (void)
2005 {
2006     __asm__ __volatile__ ("vaddcuw      17, 14, 15");
2007 }
2008 
test_vsububm(void)2009 static void test_vsububm (void)
2010 {
2011     __asm__ __volatile__ ("vsububm      17, 14, 15");
2012 }
2013 
test_vsubuhm(void)2014 static void test_vsubuhm (void)
2015 {
2016     __asm__ __volatile__ ("vsubuhm      17, 14, 15");
2017 }
2018 
test_vsubuwm(void)2019 static void test_vsubuwm (void)
2020 {
2021     __asm__ __volatile__ ("vsubuwm      17, 14, 15");
2022 }
2023 
test_vsububs(void)2024 static void test_vsububs (void)
2025 {
2026     __asm__ __volatile__ ("vsububs      17, 14, 15");
2027 }
2028 
test_vsubuhs(void)2029 static void test_vsubuhs (void)
2030 {
2031     __asm__ __volatile__ ("vsubuhs      17, 14, 15");
2032 }
2033 
test_vsubuws(void)2034 static void test_vsubuws (void)
2035 {
2036     __asm__ __volatile__ ("vsubuws      17, 14, 15");
2037 }
2038 
test_vsubcuw(void)2039 static void test_vsubcuw (void)
2040 {
2041     __asm__ __volatile__ ("vsubcuw      17, 14, 15");
2042 }
2043 
test_vmuloub(void)2044 static void test_vmuloub (void)
2045 {
2046     __asm__ __volatile__ ("vmuloub      17, 14, 15");
2047 }
2048 
test_vmulouh(void)2049 static void test_vmulouh (void)
2050 {
2051     __asm__ __volatile__ ("vmulouh      17, 14, 15");
2052 }
2053 
test_vmulosb(void)2054 static void test_vmulosb (void)
2055 {
2056     __asm__ __volatile__ ("vmulosb      17, 14, 15");
2057 }
2058 
test_vmulosh(void)2059 static void test_vmulosh (void)
2060 {
2061     __asm__ __volatile__ ("vmulosh      17, 14, 15");
2062 }
2063 
test_vmuleub(void)2064 static void test_vmuleub (void)
2065 {
2066     __asm__ __volatile__ ("vmuleub      17, 14, 15");
2067 }
2068 
test_vmuleuh(void)2069 static void test_vmuleuh (void)
2070 {
2071     __asm__ __volatile__ ("vmuleuh      17, 14, 15");
2072 }
2073 
test_vmulesb(void)2074 static void test_vmulesb (void)
2075 {
2076     __asm__ __volatile__ ("vmulesb      17, 14, 15");
2077 }
2078 
test_vmulesh(void)2079 static void test_vmulesh (void)
2080 {
2081     __asm__ __volatile__ ("vmulesh      17, 14, 15");
2082 }
2083 
test_vsumsws(void)2084 static void test_vsumsws (void)
2085 {
2086     __asm__ __volatile__ ("vsumsws      17, 14, 15");
2087 }
2088 
test_vsum2sws(void)2089 static void test_vsum2sws (void)
2090 {
2091     __asm__ __volatile__ ("vsum2sws     17, 14, 15");
2092 }
2093 
test_vsum4ubs(void)2094 static void test_vsum4ubs (void)
2095 {
2096     __asm__ __volatile__ ("vsum4ubs     17, 14, 15");
2097 }
2098 
test_vsum4sbs(void)2099 static void test_vsum4sbs (void)
2100 {
2101     __asm__ __volatile__ ("vsum4sbs     17, 14, 15");
2102 }
2103 
test_vsum4shs(void)2104 static void test_vsum4shs (void)
2105 {
2106     __asm__ __volatile__ ("vsum4shs     17, 14, 15");
2107 }
2108 
test_vavgub(void)2109 static void test_vavgub (void)
2110 {
2111     __asm__ __volatile__ ("vavgub       17, 14, 15");
2112 }
2113 
test_vavguh(void)2114 static void test_vavguh (void)
2115 {
2116     __asm__ __volatile__ ("vavguh       17, 14, 15");
2117 }
2118 
test_vavguw(void)2119 static void test_vavguw (void)
2120 {
2121     __asm__ __volatile__ ("vavguw       17, 14, 15");
2122 }
2123 
test_vavgsb(void)2124 static void test_vavgsb (void)
2125 {
2126     __asm__ __volatile__ ("vavgsb       17, 14, 15");
2127 }
2128 
test_vavgsh(void)2129 static void test_vavgsh (void)
2130 {
2131     __asm__ __volatile__ ("vavgsh       17, 14, 15");
2132 }
2133 
test_vavgsw(void)2134 static void test_vavgsw (void)
2135 {
2136     __asm__ __volatile__ ("vavgsw       17, 14, 15");
2137 }
2138 
test_vmaxub(void)2139 static void test_vmaxub (void)
2140 {
2141     __asm__ __volatile__ ("vmaxub       17, 14, 15");
2142 }
2143 
test_vmaxuh(void)2144 static void test_vmaxuh (void)
2145 {
2146     __asm__ __volatile__ ("vmaxuh       17, 14, 15");
2147 }
2148 
test_vmaxuw(void)2149 static void test_vmaxuw (void)
2150 {
2151     __asm__ __volatile__ ("vmaxuw       17, 14, 15");
2152 }
2153 
test_vmaxsb(void)2154 static void test_vmaxsb (void)
2155 {
2156     __asm__ __volatile__ ("vmaxsb       17, 14, 15");
2157 }
2158 
test_vmaxsh(void)2159 static void test_vmaxsh (void)
2160 {
2161     __asm__ __volatile__ ("vmaxsh       17, 14, 15");
2162 }
2163 
test_vmaxsw(void)2164 static void test_vmaxsw (void)
2165 {
2166     __asm__ __volatile__ ("vmaxsw       17, 14, 15");
2167 }
2168 
test_vminub(void)2169 static void test_vminub (void)
2170 {
2171     __asm__ __volatile__ ("vminub       17, 14, 15");
2172 }
2173 
test_vminuh(void)2174 static void test_vminuh (void)
2175 {
2176     __asm__ __volatile__ ("vminuh       17, 14, 15");
2177 }
2178 
test_vminuw(void)2179 static void test_vminuw (void)
2180 {
2181     __asm__ __volatile__ ("vminuw       17, 14, 15");
2182 }
2183 
test_vminsb(void)2184 static void test_vminsb (void)
2185 {
2186     __asm__ __volatile__ ("vminsb       17, 14, 15");
2187 }
2188 
test_vminsh(void)2189 static void test_vminsh (void)
2190 {
2191     __asm__ __volatile__ ("vminsh       17, 14, 15");
2192 }
2193 
test_vminsw(void)2194 static void test_vminsw (void)
2195 {
2196     __asm__ __volatile__ ("vminsw       17, 14, 15");
2197 }
2198 
2199 static test_t tests_aa_ops_two[] = {
2200     { &test_vaddubm         , "     vaddubm", },
2201     { &test_vadduhm         , "     vadduhm", },
2202     { &test_vadduwm         , "     vadduwm", },
2203     { &test_vaddubs         , "     vaddubs", },
2204     { &test_vadduhs         , "     vadduhs", },
2205     { &test_vadduws         , "     vadduws", },
2206     { &test_vaddsbs         , "     vaddsbs", },
2207     { &test_vaddshs         , "     vaddshs", },
2208     { &test_vaddsws         , "     vaddsws", },
2209     { &test_vaddcuw         , "     vaddcuw", },
2210     { &test_vsububm         , "     vsububm", },
2211     { &test_vsubuhm         , "     vsubuhm", },
2212     { &test_vsubuwm         , "     vsubuwm", },
2213     { &test_vsububs         , "     vsububs", },
2214     { &test_vsubuhs         , "     vsubuhs", },
2215     { &test_vsubuws         , "     vsubuws", },
2216     { &test_vsubcuw         , "     vsubcuw", },
2217     { &test_vmuloub         , "     vmuloub", },
2218     { &test_vmulouh         , "     vmulouh", },
2219     { &test_vmulosb         , "     vmulosb", },
2220     { &test_vmulosh         , "     vmulosh", },
2221     { &test_vmuleub         , "     vmuleub", },
2222     { &test_vmuleuh         , "     vmuleuh", },
2223     { &test_vmulesb         , "     vmulesb", },
2224     { &test_vmulesh         , "     vmulesh", },
2225     { &test_vsumsws         , "     vsumsws", },
2226     { &test_vsum2sws        , "    vsum2sws", },
2227     { &test_vsum4ubs        , "    vsum4ubs", },
2228     { &test_vsum4sbs        , "    vsum4sbs", },
2229     { &test_vsum4shs        , "    vsum4shs", },
2230     { &test_vavgub          , "      vavgub", },
2231     { &test_vavguh          , "      vavguh", },
2232     { &test_vavguw          , "      vavguw", },
2233     { &test_vavgsb          , "      vavgsb", },
2234     { &test_vavgsh          , "      vavgsh", },
2235     { &test_vavgsw          , "      vavgsw", },
2236     { &test_vmaxub          , "      vmaxub", },
2237     { &test_vmaxuh          , "      vmaxuh", },
2238     { &test_vmaxuw          , "      vmaxuw", },
2239     { &test_vmaxsb          , "      vmaxsb", },
2240     { &test_vmaxsh          , "      vmaxsh", },
2241     { &test_vmaxsw          , "      vmaxsw", },
2242     { &test_vminub          , "      vminub", },
2243     { &test_vminuh          , "      vminuh", },
2244     { &test_vminuw          , "      vminuw", },
2245     { &test_vminsb          , "      vminsb", },
2246     { &test_vminsh          , "      vminsh", },
2247     { &test_vminsw          , "      vminsw", },
2248     { NULL,                   NULL,           },
2249 };
2250 #endif /* defined (HAS_ALTIVEC) */
2251 
2252 #if defined (HAS_ALTIVEC)
test_vand(void)2253 static void test_vand (void)
2254 {
2255     __asm__ __volatile__ ("vand         17, 14, 15");
2256 }
2257 
test_vor(void)2258 static void test_vor (void)
2259 {
2260     __asm__ __volatile__ ("vor          17, 14, 15");
2261 }
2262 
test_vxor(void)2263 static void test_vxor (void)
2264 {
2265     __asm__ __volatile__ ("vxor         17, 14, 15");
2266 }
2267 
test_vandc(void)2268 static void test_vandc (void)
2269 {
2270     __asm__ __volatile__ ("vandc        17, 14, 15");
2271 }
2272 
test_vnor(void)2273 static void test_vnor (void)
2274 {
2275     __asm__ __volatile__ ("vnor         17, 14, 15");
2276 }
2277 
test_vrlb(void)2278 static void test_vrlb (void)
2279 {
2280     __asm__ __volatile__ ("vrlb         17, 14, 15");
2281 }
2282 
test_vrlh(void)2283 static void test_vrlh (void)
2284 {
2285     __asm__ __volatile__ ("vrlh         17, 14, 15");
2286 }
2287 
test_vrlw(void)2288 static void test_vrlw (void)
2289 {
2290     __asm__ __volatile__ ("vrlw         17, 14, 15");
2291 }
2292 
test_vslb(void)2293 static void test_vslb (void)
2294 {
2295     __asm__ __volatile__ ("vslb         17, 14, 15");
2296 }
2297 
test_vslh(void)2298 static void test_vslh (void)
2299 {
2300     __asm__ __volatile__ ("vslh         17, 14, 15");
2301 }
2302 
test_vslw(void)2303 static void test_vslw (void)
2304 {
2305     __asm__ __volatile__ ("vslw         17, 14, 15");
2306 }
2307 
test_vsrb(void)2308 static void test_vsrb (void)
2309 {
2310     __asm__ __volatile__ ("vsrb         17, 14, 15");
2311 }
2312 
test_vsrh(void)2313 static void test_vsrh (void)
2314 {
2315     __asm__ __volatile__ ("vsrh         17, 14, 15");
2316 }
2317 
test_vsrw(void)2318 static void test_vsrw (void)
2319 {
2320     __asm__ __volatile__ ("vsrw         17, 14, 15");
2321 }
2322 
test_vsrab(void)2323 static void test_vsrab (void)
2324 {
2325     __asm__ __volatile__ ("vsrab        17, 14, 15");
2326 }
2327 
test_vsrah(void)2328 static void test_vsrah (void)
2329 {
2330     __asm__ __volatile__ ("vsrah        17, 14, 15");
2331 }
2332 
test_vsraw(void)2333 static void test_vsraw (void)
2334 {
2335     __asm__ __volatile__ ("vsraw        17, 14, 15");
2336 }
2337 
test_vpkuhum(void)2338 static void test_vpkuhum (void)
2339 {
2340     __asm__ __volatile__ ("vpkuhum      17, 14, 15");
2341 }
2342 
test_vpkuwum(void)2343 static void test_vpkuwum (void)
2344 {
2345     __asm__ __volatile__ ("vpkuwum      17, 14, 15");
2346 }
2347 
test_vpkuhus(void)2348 static void test_vpkuhus (void)
2349 {
2350     __asm__ __volatile__ ("vpkuhus      17, 14, 15");
2351 }
2352 
test_vpkuwus(void)2353 static void test_vpkuwus (void)
2354 {
2355     __asm__ __volatile__ ("vpkuwus      17, 14, 15");
2356 }
2357 
test_vpkshus(void)2358 static void test_vpkshus (void)
2359 {
2360     __asm__ __volatile__ ("vpkshus      17, 14, 15");
2361 }
2362 
test_vpkswus(void)2363 static void test_vpkswus (void)
2364 {
2365     __asm__ __volatile__ ("vpkswus      17, 14, 15");
2366 }
2367 
test_vpkshss(void)2368 static void test_vpkshss (void)
2369 {
2370     __asm__ __volatile__ ("vpkshss      17, 14, 15");
2371 }
2372 
test_vpkswss(void)2373 static void test_vpkswss (void)
2374 {
2375     __asm__ __volatile__ ("vpkswss      17, 14, 15");
2376 }
2377 
test_vpkpx(void)2378 static void test_vpkpx (void)
2379 {
2380     __asm__ __volatile__ ("vpkpx        17, 14, 15");
2381 }
2382 
test_vmrghb(void)2383 static void test_vmrghb (void)
2384 {
2385     __asm__ __volatile__ ("vmrghb       17, 14, 15");
2386 }
2387 
test_vmrghh(void)2388 static void test_vmrghh (void)
2389 {
2390     __asm__ __volatile__ ("vmrghh       17, 14, 15");
2391 }
2392 
test_vmrghw(void)2393 static void test_vmrghw (void)
2394 {
2395     __asm__ __volatile__ ("vmrghw       17, 14, 15");
2396 }
2397 
test_vmrglb(void)2398 static void test_vmrglb (void)
2399 {
2400     __asm__ __volatile__ ("vmrglb       17, 14, 15");
2401 }
2402 
test_vmrglh(void)2403 static void test_vmrglh (void)
2404 {
2405     __asm__ __volatile__ ("vmrglh       17, 14, 15");
2406 }
2407 
test_vmrglw(void)2408 static void test_vmrglw (void)
2409 {
2410     __asm__ __volatile__ ("vmrglw       17, 14, 15");
2411 }
2412 
test_vsl(void)2413 static void test_vsl (void)
2414 {
2415     __asm__ __volatile__ ("vsl          17, 14, 15");
2416 }
2417 
test_vsr(void)2418 static void test_vsr (void)
2419 {
2420     __asm__ __volatile__ ("vsr          17, 14, 15");
2421 }
2422 
test_vslo(void)2423 static void test_vslo (void)
2424 {
2425     __asm__ __volatile__ ("vslo         17, 14, 15");
2426 }
2427 
test_vsro(void)2428 static void test_vsro (void)
2429 {
2430     __asm__ __volatile__ ("vsro         17, 14, 15");
2431 }
2432 
2433 static test_t tests_al_ops_two[] = {
2434     { &test_vand            , "        vand", },
2435     { &test_vor             , "         vor", },
2436     { &test_vxor            , "        vxor", },
2437     { &test_vandc           , "       vandc", },
2438     { &test_vnor            , "        vnor", },
2439     { &test_vrlb            , "        vrlb", },
2440     { &test_vrlh            , "        vrlh", },
2441     { &test_vrlw            , "        vrlw", },
2442     { &test_vslb            , "        vslb", },
2443     { &test_vslh            , "        vslh", },
2444     { &test_vslw            , "        vslw", },
2445     { &test_vsrb            , "        vsrb", },
2446     { &test_vsrh            , "        vsrh", },
2447     { &test_vsrw            , "        vsrw", },
2448     { &test_vsrab           , "       vsrab", },
2449     { &test_vsrah           , "       vsrah", },
2450     { &test_vsraw           , "       vsraw", },
2451     { &test_vpkuhum         , "     vpkuhum", },
2452     { &test_vpkuwum         , "     vpkuwum", },
2453     { &test_vpkuhus         , "     vpkuhus", },
2454     { &test_vpkuwus         , "     vpkuwus", },
2455     { &test_vpkshus         , "     vpkshus", },
2456     { &test_vpkswus         , "     vpkswus", },
2457     { &test_vpkshss         , "     vpkshss", },
2458     { &test_vpkswss         , "     vpkswss", },
2459     { &test_vpkpx           , "       vpkpx", },
2460     { &test_vmrghb          , "      vmrghb", },
2461     { &test_vmrghh          , "      vmrghh", },
2462     { &test_vmrghw          , "      vmrghw", },
2463     { &test_vmrglb          , "      vmrglb", },
2464     { &test_vmrglh          , "      vmrglh", },
2465     { &test_vmrglw          , "      vmrglw", },
2466     { &test_vsl             , "         vsl", },
2467     { &test_vsr             , "         vsr", },
2468     { &test_vslo            , "        vslo", },
2469     { &test_vsro            , "        vsro", },
2470     { NULL,                   NULL,           },
2471 };
2472 #endif /* defined (HAS_ALTIVEC) */
2473 
2474 #if defined (HAS_ALTIVEC)
test_vupkhsb(void)2475 static void test_vupkhsb (void)
2476 {
2477     __asm__ __volatile__ ("vupkhsb      17, 14");
2478 }
2479 
test_vupkhsh(void)2480 static void test_vupkhsh (void)
2481 {
2482     __asm__ __volatile__ ("vupkhsh      17, 14");
2483 }
2484 
test_vupkhpx(void)2485 static void test_vupkhpx (void)
2486 {
2487     __asm__ __volatile__ ("vupkhpx      17, 14");
2488 }
2489 
test_vupklsb(void)2490 static void test_vupklsb (void)
2491 {
2492     __asm__ __volatile__ ("vupklsb      17, 14");
2493 }
2494 
test_vupklsh(void)2495 static void test_vupklsh (void)
2496 {
2497     __asm__ __volatile__ ("vupklsh      17, 14");
2498 }
2499 
test_vupklpx(void)2500 static void test_vupklpx (void)
2501 {
2502     __asm__ __volatile__ ("vupklpx      17, 14");
2503 }
2504 
2505 static test_t tests_al_ops_one[] = {
2506     { &test_vupkhsb         , "     vupkhsb", },
2507     { &test_vupkhsh         , "     vupkhsh", },
2508     { &test_vupkhpx         , "     vupkhpx", },
2509     { &test_vupklsb         , "     vupklsb", },
2510     { &test_vupklsh         , "     vupklsh", },
2511     { &test_vupklpx         , "     vupklpx", },
2512     { NULL,                   NULL,           },
2513 };
2514 #endif /* defined (HAS_ALTIVEC) */
2515 
2516 #if defined (HAS_ALTIVEC)
test_vcmpgtub(void)2517 static void test_vcmpgtub (void)
2518 {
2519     __asm__ __volatile__ ("vcmpgtub     17, 14, 15");
2520 }
2521 
test_vcmpgtuh(void)2522 static void test_vcmpgtuh (void)
2523 {
2524     __asm__ __volatile__ ("vcmpgtuh     17, 14, 15");
2525 }
2526 
test_vcmpgtuw(void)2527 static void test_vcmpgtuw (void)
2528 {
2529     __asm__ __volatile__ ("vcmpgtuw     17, 14, 15");
2530 }
2531 
test_vcmpgtsb(void)2532 static void test_vcmpgtsb (void)
2533 {
2534     __asm__ __volatile__ ("vcmpgtsb     17, 14, 15");
2535 }
2536 
test_vcmpgtsh(void)2537 static void test_vcmpgtsh (void)
2538 {
2539     __asm__ __volatile__ ("vcmpgtsh     17, 14, 15");
2540 }
2541 
test_vcmpgtsw(void)2542 static void test_vcmpgtsw (void)
2543 {
2544     __asm__ __volatile__ ("vcmpgtsw     17, 14, 15");
2545 }
2546 
test_vcmpequb(void)2547 static void test_vcmpequb (void)
2548 {
2549     __asm__ __volatile__ ("vcmpequb     17, 14, 15");
2550 }
2551 
test_vcmpequh(void)2552 static void test_vcmpequh (void)
2553 {
2554     __asm__ __volatile__ ("vcmpequh     17, 14, 15");
2555 }
2556 
test_vcmpequw(void)2557 static void test_vcmpequw (void)
2558 {
2559     __asm__ __volatile__ ("vcmpequw     17, 14, 15");
2560 }
2561 
2562 static test_t tests_ac_ops_two[] = {
2563     { &test_vcmpgtub        , "    vcmpgtub", },
2564     { &test_vcmpgtuh        , "    vcmpgtuh", },
2565     { &test_vcmpgtuw        , "    vcmpgtuw", },
2566     { &test_vcmpgtsb        , "    vcmpgtsb", },
2567     { &test_vcmpgtsh        , "    vcmpgtsh", },
2568     { &test_vcmpgtsw        , "    vcmpgtsw", },
2569     { &test_vcmpequb        , "    vcmpequb", },
2570     { &test_vcmpequh        , "    vcmpequh", },
2571     { &test_vcmpequw        , "    vcmpequw", },
2572     { NULL,                   NULL,           },
2573 };
2574 #endif /* defined (HAS_ALTIVEC) */
2575 
2576 #if defined (HAS_ALTIVEC)
test_vcmpgtub_(void)2577 static void test_vcmpgtub_ (void)
2578 {
2579     __asm__ __volatile__ ("vcmpgtub.    17, 14, 15");
2580 }
2581 
test_vcmpgtuh_(void)2582 static void test_vcmpgtuh_ (void)
2583 {
2584     __asm__ __volatile__ ("vcmpgtuh.    17, 14, 15");
2585 }
2586 
test_vcmpgtuw_(void)2587 static void test_vcmpgtuw_ (void)
2588 {
2589     __asm__ __volatile__ ("vcmpgtuw.    17, 14, 15");
2590 }
2591 
test_vcmpgtsb_(void)2592 static void test_vcmpgtsb_ (void)
2593 {
2594     __asm__ __volatile__ ("vcmpgtsb.    17, 14, 15");
2595 }
2596 
test_vcmpgtsh_(void)2597 static void test_vcmpgtsh_ (void)
2598 {
2599     __asm__ __volatile__ ("vcmpgtsh.    17, 14, 15");
2600 }
2601 
test_vcmpgtsw_(void)2602 static void test_vcmpgtsw_ (void)
2603 {
2604     __asm__ __volatile__ ("vcmpgtsw.    17, 14, 15");
2605 }
2606 
test_vcmpequb_(void)2607 static void test_vcmpequb_ (void)
2608 {
2609     __asm__ __volatile__ ("vcmpequb.    17, 14, 15");
2610 }
2611 
test_vcmpequh_(void)2612 static void test_vcmpequh_ (void)
2613 {
2614     __asm__ __volatile__ ("vcmpequh.    17, 14, 15");
2615 }
2616 
test_vcmpequw_(void)2617 static void test_vcmpequw_ (void)
2618 {
2619     __asm__ __volatile__ ("vcmpequw.    17, 14, 15");
2620 }
2621 
2622 static test_t tests_acr_ops_two[] = {
2623     { &test_vcmpgtub_       , "   vcmpgtub.", },
2624     { &test_vcmpgtuh_       , "   vcmpgtuh.", },
2625     { &test_vcmpgtuw_       , "   vcmpgtuw.", },
2626     { &test_vcmpgtsb_       , "   vcmpgtsb.", },
2627     { &test_vcmpgtsh_       , "   vcmpgtsh.", },
2628     { &test_vcmpgtsw_       , "   vcmpgtsw.", },
2629     { &test_vcmpequb_       , "   vcmpequb.", },
2630     { &test_vcmpequh_       , "   vcmpequh.", },
2631     { &test_vcmpequw_       , "   vcmpequw.", },
2632     { NULL,                   NULL,           },
2633 };
2634 #endif /* defined (HAS_ALTIVEC) */
2635 
2636 #if defined (HAS_ALTIVEC)
test_vmaddfp(void)2637 static void test_vmaddfp (void)
2638 {
2639     __asm__ __volatile__ ("vmaddfp      17, 14, 15, 16");
2640 }
2641 
test_vnmsubfp(void)2642 static void test_vnmsubfp (void)
2643 {
2644     __asm__ __volatile__ ("vnmsubfp     17, 14, 15, 16");
2645 }
2646 
2647 static test_t tests_afa_ops_three[] = {
2648     { &test_vmaddfp         , "     vmaddfp", },
2649     { &test_vnmsubfp        , "    vnmsubfp", },
2650     { NULL,                   NULL,           },
2651 };
2652 #endif /* defined (HAS_ALTIVEC) */
2653 
2654 #if defined (HAS_ALTIVEC)
test_vaddfp(void)2655 static void test_vaddfp (void)
2656 {
2657     __asm__ __volatile__ ("vaddfp       17, 14, 15");
2658 }
2659 
test_vsubfp(void)2660 static void test_vsubfp (void)
2661 {
2662     __asm__ __volatile__ ("vsubfp       17, 14, 15");
2663 }
2664 
test_vmaxfp(void)2665 static void test_vmaxfp (void)
2666 {
2667     __asm__ __volatile__ ("vmaxfp       17, 14, 15");
2668 }
2669 
test_vminfp(void)2670 static void test_vminfp (void)
2671 {
2672     __asm__ __volatile__ ("vminfp       17, 14, 15");
2673 }
2674 
2675 static test_t tests_afa_ops_two[] = {
2676     { &test_vaddfp          , "      vaddfp", },
2677     { &test_vsubfp          , "      vsubfp", },
2678     { &test_vmaxfp          , "      vmaxfp", },
2679     { &test_vminfp          , "      vminfp", },
2680     { NULL,                   NULL,           },
2681 };
2682 #endif /* defined (HAS_ALTIVEC) */
2683 
2684 #if defined (HAS_ALTIVEC)
test_vrfin(void)2685 static void test_vrfin (void)
2686 {
2687     __asm__ __volatile__ ("vrfin        17, 14");
2688 }
2689 
test_vrfiz(void)2690 static void test_vrfiz (void)
2691 {
2692     __asm__ __volatile__ ("vrfiz        17, 14");
2693 }
2694 
test_vrfip(void)2695 static void test_vrfip (void)
2696 {
2697     __asm__ __volatile__ ("vrfip        17, 14");
2698 }
2699 
test_vrfim(void)2700 static void test_vrfim (void)
2701 {
2702     __asm__ __volatile__ ("vrfim        17, 14");
2703 }
2704 
test_vrefp(void)2705 static void test_vrefp (void)
2706 {
2707     __asm__ __volatile__ ("vrefp        17, 14");
2708 }
2709 
test_vrsqrtefp(void)2710 static void test_vrsqrtefp (void)
2711 {
2712     __asm__ __volatile__ ("vrsqrtefp    17, 14");
2713 }
2714 
test_vlogefp(void)2715 static void test_vlogefp (void)
2716 {
2717     __asm__ __volatile__ ("vlogefp      17, 14");
2718 }
2719 
test_vexptefp(void)2720 static void test_vexptefp (void)
2721 {
2722     __asm__ __volatile__ ("vexptefp     17, 14");
2723 }
2724 
2725 static test_t tests_afa_ops_one[] = {
2726     { &test_vrfin           , "       vrfin", },
2727     { &test_vrfiz           , "       vrfiz", },
2728     { &test_vrfip           , "       vrfip", },
2729     { &test_vrfim           , "       vrfim", },
2730     { &test_vrefp           , "       vrefp", },
2731     { &test_vrsqrtefp       , "   vrsqrtefp", },
2732     { &test_vlogefp         , "     vlogefp", },
2733     { &test_vexptefp        , "    vexptefp", },
2734     { NULL,                   NULL,           },
2735 };
2736 #endif /* defined (HAS_ALTIVEC) */
2737 
2738 #if defined (HAS_ALTIVEC)
test_vcmpgtfp(void)2739 static void test_vcmpgtfp (void)
2740 {
2741     __asm__ __volatile__ ("vcmpgtfp     17, 14, 15");
2742 }
2743 
test_vcmpeqfp(void)2744 static void test_vcmpeqfp (void)
2745 {
2746     __asm__ __volatile__ ("vcmpeqfp     17, 14, 15");
2747 }
2748 
test_vcmpgefp(void)2749 static void test_vcmpgefp (void)
2750 {
2751     __asm__ __volatile__ ("vcmpgefp     17, 14, 15");
2752 }
2753 
test_vcmpbfp(void)2754 static void test_vcmpbfp (void)
2755 {
2756     __asm__ __volatile__ ("vcmpbfp      17, 14, 15");
2757 }
2758 
2759 static test_t tests_afc_ops_two[] = {
2760     { &test_vcmpgtfp        , "    vcmpgtfp", },
2761     { &test_vcmpeqfp        , "    vcmpeqfp", },
2762     { &test_vcmpgefp        , "    vcmpgefp", },
2763     { &test_vcmpbfp         , "     vcmpbfp", },
2764     { NULL,                   NULL,           },
2765 };
2766 #endif /* defined (HAS_ALTIVEC) */
2767 
2768 #if defined (HAS_ALTIVEC)
test_vcmpgtfp_(void)2769 static void test_vcmpgtfp_ (void)
2770 {
2771     __asm__ __volatile__ ("vcmpgtfp.    17, 14, 15");
2772 }
2773 
test_vcmpeqfp_(void)2774 static void test_vcmpeqfp_ (void)
2775 {
2776     __asm__ __volatile__ ("vcmpeqfp.    17, 14, 15");
2777 }
2778 
test_vcmpgefp_(void)2779 static void test_vcmpgefp_ (void)
2780 {
2781     __asm__ __volatile__ ("vcmpgefp.    17, 14, 15");
2782 }
2783 
test_vcmpbfp_(void)2784 static void test_vcmpbfp_ (void)
2785 {
2786     __asm__ __volatile__ ("vcmpbfp.     17, 14, 15");
2787 }
2788 
2789 static test_t tests_afcr_ops_two[] = {
2790     { &test_vcmpgtfp_       , "   vcmpgtfp.", },
2791     { &test_vcmpeqfp_       , "   vcmpeqfp.", },
2792     { &test_vcmpgefp_       , "   vcmpgefp.", },
2793     { &test_vcmpbfp_        , "    vcmpbfp.", },
2794     { NULL,                   NULL,           },
2795 };
2796 #endif /* defined (HAS_ALTIVEC) */
2797 
2798 #if defined (IS_PPC405)
test_macchw(void)2799 static void test_macchw (void)
2800 {
2801     __asm__ __volatile__ ("macchw       17, 14, 15");
2802 }
2803 
test_macchwo(void)2804 static void test_macchwo (void)
2805 {
2806     __asm__ __volatile__ ("macchwo      17, 14, 15");
2807 }
2808 
test_macchws(void)2809 static void test_macchws (void)
2810 {
2811     __asm__ __volatile__ ("macchws      17, 14, 15");
2812 }
2813 
test_macchwso(void)2814 static void test_macchwso (void)
2815 {
2816     __asm__ __volatile__ ("macchwso     17, 14, 15");
2817 }
2818 
test_macchwsu(void)2819 static void test_macchwsu (void)
2820 {
2821     __asm__ __volatile__ ("macchwsu     17, 14, 15");
2822 }
2823 
test_macchwsuo(void)2824 static void test_macchwsuo (void)
2825 {
2826     __asm__ __volatile__ ("macchwsuo    17, 14, 15");
2827 }
2828 
test_macchwu(void)2829 static void test_macchwu (void)
2830 {
2831     __asm__ __volatile__ ("macchwu      17, 14, 15");
2832 }
2833 
test_macchwuo(void)2834 static void test_macchwuo (void)
2835 {
2836     __asm__ __volatile__ ("macchwuo     17, 14, 15");
2837 }
2838 
test_machhw(void)2839 static void test_machhw (void)
2840 {
2841     __asm__ __volatile__ ("machhw       17, 14, 15");
2842 }
2843 
test_machhwo(void)2844 static void test_machhwo (void)
2845 {
2846     __asm__ __volatile__ ("machhwo      17, 14, 15");
2847 }
2848 
test_machhws(void)2849 static void test_machhws (void)
2850 {
2851     __asm__ __volatile__ ("machhws      17, 14, 15");
2852 }
2853 
test_machhwso(void)2854 static void test_machhwso (void)
2855 {
2856     __asm__ __volatile__ ("machhwso     17, 14, 15");
2857 }
2858 
test_machhwsu(void)2859 static void test_machhwsu (void)
2860 {
2861     __asm__ __volatile__ ("machhwsu     17, 14, 15");
2862 }
2863 
test_machhwsuo(void)2864 static void test_machhwsuo (void)
2865 {
2866     __asm__ __volatile__ ("machhwsuo    17, 14, 15");
2867 }
2868 
test_machhwu(void)2869 static void test_machhwu (void)
2870 {
2871     __asm__ __volatile__ ("machhwu      17, 14, 15");
2872 }
2873 
test_machhwuo(void)2874 static void test_machhwuo (void)
2875 {
2876     __asm__ __volatile__ ("machhwuo     17, 14, 15");
2877 }
2878 
test_maclhw(void)2879 static void test_maclhw (void)
2880 {
2881     __asm__ __volatile__ ("maclhw       17, 14, 15");
2882 }
2883 
test_maclhwo(void)2884 static void test_maclhwo (void)
2885 {
2886     __asm__ __volatile__ ("maclhwo      17, 14, 15");
2887 }
2888 
test_maclhws(void)2889 static void test_maclhws (void)
2890 {
2891     __asm__ __volatile__ ("maclhws      17, 14, 15");
2892 }
2893 
test_maclhwso(void)2894 static void test_maclhwso (void)
2895 {
2896     __asm__ __volatile__ ("maclhwso     17, 14, 15");
2897 }
2898 
test_maclhwsu(void)2899 static void test_maclhwsu (void)
2900 {
2901     __asm__ __volatile__ ("maclhwsu     17, 14, 15");
2902 }
2903 
test_maclhwsuo(void)2904 static void test_maclhwsuo (void)
2905 {
2906     __asm__ __volatile__ ("maclhwsuo    17, 14, 15");
2907 }
2908 
test_maclhwu(void)2909 static void test_maclhwu (void)
2910 {
2911     __asm__ __volatile__ ("maclhwu      17, 14, 15");
2912 }
2913 
test_maclhwuo(void)2914 static void test_maclhwuo (void)
2915 {
2916     __asm__ __volatile__ ("maclhwuo     17, 14, 15");
2917 }
2918 
test_mulchw(void)2919 static void test_mulchw (void)
2920 {
2921     __asm__ __volatile__ ("mulchw       17, 14, 15");
2922 }
2923 
test_mulchwu(void)2924 static void test_mulchwu (void)
2925 {
2926     __asm__ __volatile__ ("mulchwu      17, 14, 15");
2927 }
2928 
test_mulhhw(void)2929 static void test_mulhhw (void)
2930 {
2931     __asm__ __volatile__ ("mulhhw       17, 14, 15");
2932 }
2933 
test_mulhhwu(void)2934 static void test_mulhhwu (void)
2935 {
2936     __asm__ __volatile__ ("mulhhwu      17, 14, 15");
2937 }
2938 
test_mullhw(void)2939 static void test_mullhw (void)
2940 {
2941     __asm__ __volatile__ ("mullhw       17, 14, 15");
2942 }
2943 
test_mullhwu(void)2944 static void test_mullhwu (void)
2945 {
2946     __asm__ __volatile__ ("mullhwu      17, 14, 15");
2947 }
2948 
test_nmacchw(void)2949 static void test_nmacchw (void)
2950 {
2951     __asm__ __volatile__ ("nmacchw      17, 14, 15");
2952 }
2953 
test_nmacchwo(void)2954 static void test_nmacchwo (void)
2955 {
2956     __asm__ __volatile__ ("nmacchwo     17, 14, 15");
2957 }
2958 
test_nmacchws(void)2959 static void test_nmacchws (void)
2960 {
2961     __asm__ __volatile__ ("nmacchws     17, 14, 15");
2962 }
2963 
test_nmacchwso(void)2964 static void test_nmacchwso (void)
2965 {
2966     __asm__ __volatile__ ("nmacchwso    17, 14, 15");
2967 }
2968 
test_nmachhw(void)2969 static void test_nmachhw (void)
2970 {
2971     __asm__ __volatile__ ("nmachhw      17, 14, 15");
2972 }
2973 
test_nmachhwo(void)2974 static void test_nmachhwo (void)
2975 {
2976     __asm__ __volatile__ ("nmachhwo     17, 14, 15");
2977 }
2978 
test_nmachhws(void)2979 static void test_nmachhws (void)
2980 {
2981     __asm__ __volatile__ ("nmachhws     17, 14, 15");
2982 }
2983 
test_nmachhwso(void)2984 static void test_nmachhwso (void)
2985 {
2986     __asm__ __volatile__ ("nmachhwso    17, 14, 15");
2987 }
2988 
test_nmaclhw(void)2989 static void test_nmaclhw (void)
2990 {
2991     __asm__ __volatile__ ("nmaclhw      17, 14, 15");
2992 }
2993 
test_nmaclhwo(void)2994 static void test_nmaclhwo (void)
2995 {
2996     __asm__ __volatile__ ("nmaclhwo     17, 14, 15");
2997 }
2998 
test_nmaclhws(void)2999 static void test_nmaclhws (void)
3000 {
3001     __asm__ __volatile__ ("nmaclhws     17, 14, 15");
3002 }
3003 
test_nmaclhwso(void)3004 static void test_nmaclhwso (void)
3005 {
3006     __asm__ __volatile__ ("nmaclhwso    17, 14, 15");
3007 }
3008 
3009 static test_t tests_p4m_ops_two[] = {
3010     { &test_macchw          , "      macchw", },
3011     { &test_macchwo         , "     macchwo", },
3012     { &test_macchws         , "     macchws", },
3013     { &test_macchwso        , "    macchwso", },
3014     { &test_macchwsu        , "    macchwsu", },
3015     { &test_macchwsuo       , "   macchwsuo", },
3016     { &test_macchwu         , "     macchwu", },
3017     { &test_macchwuo        , "    macchwuo", },
3018     { &test_machhw          , "      machhw", },
3019     { &test_machhwo         , "     machhwo", },
3020     { &test_machhws         , "     machhws", },
3021     { &test_machhwso        , "    machhwso", },
3022     { &test_machhwsu        , "    machhwsu", },
3023     { &test_machhwsuo       , "   machhwsuo", },
3024     { &test_machhwu         , "     machhwu", },
3025     { &test_machhwuo        , "    machhwuo", },
3026     { &test_maclhw          , "      maclhw", },
3027     { &test_maclhwo         , "     maclhwo", },
3028     { &test_maclhws         , "     maclhws", },
3029     { &test_maclhwso        , "    maclhwso", },
3030     { &test_maclhwsu        , "    maclhwsu", },
3031     { &test_maclhwsuo       , "   maclhwsuo", },
3032     { &test_maclhwu         , "     maclhwu", },
3033     { &test_maclhwuo        , "    maclhwuo", },
3034     { &test_mulchw          , "      mulchw", },
3035     { &test_mulchwu         , "     mulchwu", },
3036     { &test_mulhhw          , "      mulhhw", },
3037     { &test_mulhhwu         , "     mulhhwu", },
3038     { &test_mullhw          , "      mullhw", },
3039     { &test_mullhwu         , "     mullhwu", },
3040     { &test_nmacchw         , "     nmacchw", },
3041     { &test_nmacchwo        , "    nmacchwo", },
3042     { &test_nmacchws        , "    nmacchws", },
3043     { &test_nmacchwso       , "   nmacchwso", },
3044     { &test_nmachhw         , "     nmachhw", },
3045     { &test_nmachhwo        , "    nmachhwo", },
3046     { &test_nmachhws        , "    nmachhws", },
3047     { &test_nmachhwso       , "   nmachhwso", },
3048     { &test_nmaclhw         , "     nmaclhw", },
3049     { &test_nmaclhwo        , "    nmaclhwo", },
3050     { &test_nmaclhws        , "    nmaclhws", },
3051     { &test_nmaclhwso       , "   nmaclhwso", },
3052     { NULL,                   NULL,           },
3053 };
3054 #endif /* defined (IS_PPC405) */
3055 
3056 #if defined (IS_PPC405)
test_macchw_(void)3057 static void test_macchw_ (void)
3058 {
3059     __asm__ __volatile__ ("macchw.      17, 14, 15");
3060 }
3061 
test_macchwo_(void)3062 static void test_macchwo_ (void)
3063 {
3064     __asm__ __volatile__ ("macchwo.     17, 14, 15");
3065 }
3066 
test_macchws_(void)3067 static void test_macchws_ (void)
3068 {
3069     __asm__ __volatile__ ("macchws.     17, 14, 15");
3070 }
3071 
test_macchwso_(void)3072 static void test_macchwso_ (void)
3073 {
3074     __asm__ __volatile__ ("macchwso.    17, 14, 15");
3075 }
3076 
test_macchwsu_(void)3077 static void test_macchwsu_ (void)
3078 {
3079     __asm__ __volatile__ ("macchwsu.    17, 14, 15");
3080 }
3081 
test_macchwsuo_(void)3082 static void test_macchwsuo_ (void)
3083 {
3084     __asm__ __volatile__ ("macchwsuo.   17, 14, 15");
3085 }
3086 
test_macchwu_(void)3087 static void test_macchwu_ (void)
3088 {
3089     __asm__ __volatile__ ("macchwu.     17, 14, 15");
3090 }
3091 
test_macchwuo_(void)3092 static void test_macchwuo_ (void)
3093 {
3094     __asm__ __volatile__ ("macchwuo.    17, 14, 15");
3095 }
3096 
test_machhw_(void)3097 static void test_machhw_ (void)
3098 {
3099     __asm__ __volatile__ ("machhw.      17, 14, 15");
3100 }
3101 
test_machhwo_(void)3102 static void test_machhwo_ (void)
3103 {
3104     __asm__ __volatile__ ("machhwo.     17, 14, 15");
3105 }
3106 
test_machhws_(void)3107 static void test_machhws_ (void)
3108 {
3109     __asm__ __volatile__ ("machhws.     17, 14, 15");
3110 }
3111 
test_machhwso_(void)3112 static void test_machhwso_ (void)
3113 {
3114     __asm__ __volatile__ ("machhwso.    17, 14, 15");
3115 }
3116 
test_machhwsu_(void)3117 static void test_machhwsu_ (void)
3118 {
3119     __asm__ __volatile__ ("machhwsu.    17, 14, 15");
3120 }
3121 
test_machhwsuo_(void)3122 static void test_machhwsuo_ (void)
3123 {
3124     __asm__ __volatile__ ("machhwsuo.   17, 14, 15");
3125 }
3126 
test_machhwu_(void)3127 static void test_machhwu_ (void)
3128 {
3129     __asm__ __volatile__ ("machhwu.     17, 14, 15");
3130 }
3131 
test_machhwuo_(void)3132 static void test_machhwuo_ (void)
3133 {
3134     __asm__ __volatile__ ("machhwuo.    17, 14, 15");
3135 }
3136 
test_maclhw_(void)3137 static void test_maclhw_ (void)
3138 {
3139     __asm__ __volatile__ ("maclhw.      17, 14, 15");
3140 }
3141 
test_maclhwo_(void)3142 static void test_maclhwo_ (void)
3143 {
3144     __asm__ __volatile__ ("maclhwo.     17, 14, 15");
3145 }
3146 
test_maclhws_(void)3147 static void test_maclhws_ (void)
3148 {
3149     __asm__ __volatile__ ("maclhws.     17, 14, 15");
3150 }
3151 
test_maclhwso_(void)3152 static void test_maclhwso_ (void)
3153 {
3154     __asm__ __volatile__ ("maclhwso.    17, 14, 15");
3155 }
3156 
test_maclhwsu_(void)3157 static void test_maclhwsu_ (void)
3158 {
3159     __asm__ __volatile__ ("maclhwsu.    17, 14, 15");
3160 }
3161 
test_maclhwsuo_(void)3162 static void test_maclhwsuo_ (void)
3163 {
3164     __asm__ __volatile__ ("maclhwsuo.   17, 14, 15");
3165 }
3166 
test_maclhwu_(void)3167 static void test_maclhwu_ (void)
3168 {
3169     __asm__ __volatile__ ("maclhwu.     17, 14, 15");
3170 }
3171 
test_maclhwuo_(void)3172 static void test_maclhwuo_ (void)
3173 {
3174     __asm__ __volatile__ ("maclhwuo.    17, 14, 15");
3175 }
3176 
test_mulchw_(void)3177 static void test_mulchw_ (void)
3178 {
3179     __asm__ __volatile__ ("mulchw.      17, 14, 15");
3180 }
3181 
test_mulchwu_(void)3182 static void test_mulchwu_ (void)
3183 {
3184     __asm__ __volatile__ ("mulchwu.     17, 14, 15");
3185 }
3186 
test_mulhhw_(void)3187 static void test_mulhhw_ (void)
3188 {
3189     __asm__ __volatile__ ("mulhhw.      17, 14, 15");
3190 }
3191 
test_mulhhwu_(void)3192 static void test_mulhhwu_ (void)
3193 {
3194     __asm__ __volatile__ ("mulhhwu.     17, 14, 15");
3195 }
3196 
test_mullhw_(void)3197 static void test_mullhw_ (void)
3198 {
3199     __asm__ __volatile__ ("mullhw.      17, 14, 15");
3200 }
3201 
test_mullhwu_(void)3202 static void test_mullhwu_ (void)
3203 {
3204     __asm__ __volatile__ ("mullhwu.     17, 14, 15");
3205 }
3206 
test_nmacchw_(void)3207 static void test_nmacchw_ (void)
3208 {
3209     __asm__ __volatile__ ("nmacchw.     17, 14, 15");
3210 }
3211 
test_nmacchwo_(void)3212 static void test_nmacchwo_ (void)
3213 {
3214     __asm__ __volatile__ ("nmacchwo.    17, 14, 15");
3215 }
3216 
test_nmacchws_(void)3217 static void test_nmacchws_ (void)
3218 {
3219     __asm__ __volatile__ ("nmacchws.    17, 14, 15");
3220 }
3221 
test_nmacchwso_(void)3222 static void test_nmacchwso_ (void)
3223 {
3224     __asm__ __volatile__ ("nmacchwso.   17, 14, 15");
3225 }
3226 
test_nmachhw_(void)3227 static void test_nmachhw_ (void)
3228 {
3229     __asm__ __volatile__ ("nmachhw.     17, 14, 15");
3230 }
3231 
test_nmachhwo_(void)3232 static void test_nmachhwo_ (void)
3233 {
3234     __asm__ __volatile__ ("nmachhwo.    17, 14, 15");
3235 }
3236 
test_nmachhws_(void)3237 static void test_nmachhws_ (void)
3238 {
3239     __asm__ __volatile__ ("nmachhws.    17, 14, 15");
3240 }
3241 
test_nmachhwso_(void)3242 static void test_nmachhwso_ (void)
3243 {
3244     __asm__ __volatile__ ("nmachhwso.   17, 14, 15");
3245 }
3246 
test_nmaclhw_(void)3247 static void test_nmaclhw_ (void)
3248 {
3249     __asm__ __volatile__ ("nmaclhw.     17, 14, 15");
3250 }
3251 
test_nmaclhwo_(void)3252 static void test_nmaclhwo_ (void)
3253 {
3254     __asm__ __volatile__ ("nmaclhwo.    17, 14, 15");
3255 }
3256 
test_nmaclhws_(void)3257 static void test_nmaclhws_ (void)
3258 {
3259     __asm__ __volatile__ ("nmaclhws.    17, 14, 15");
3260 }
3261 
test_nmaclhwso_(void)3262 static void test_nmaclhwso_ (void)
3263 {
3264     __asm__ __volatile__ ("nmaclhwso.   17, 14, 15");
3265 }
3266 
3267 static test_t tests_p4mc_ops_two[] = {
3268     { &test_macchw_         , "     macchw.", },
3269     { &test_macchwo_        , "    macchwo.", },
3270     { &test_macchws_        , "    macchws.", },
3271     { &test_macchwso_       , "   macchwso.", },
3272     { &test_macchwsu_       , "   macchwsu.", },
3273     { &test_macchwsuo_      , "  macchwsuo.", },
3274     { &test_macchwu_        , "    macchwu.", },
3275     { &test_macchwuo_       , "   macchwuo.", },
3276     { &test_machhw_         , "     machhw.", },
3277     { &test_machhwo_        , "    machhwo.", },
3278     { &test_machhws_        , "    machhws.", },
3279     { &test_machhwso_       , "   machhwso.", },
3280     { &test_machhwsu_       , "   machhwsu.", },
3281     { &test_machhwsuo_      , "  machhwsuo.", },
3282     { &test_machhwu_        , "    machhwu.", },
3283     { &test_machhwuo_       , "   machhwuo.", },
3284     { &test_maclhw_         , "     maclhw.", },
3285     { &test_maclhwo_        , "    maclhwo.", },
3286     { &test_maclhws_        , "    maclhws.", },
3287     { &test_maclhwso_       , "   maclhwso.", },
3288     { &test_maclhwsu_       , "   maclhwsu.", },
3289     { &test_maclhwsuo_      , "  maclhwsuo.", },
3290     { &test_maclhwu_        , "    maclhwu.", },
3291     { &test_maclhwuo_       , "   maclhwuo.", },
3292     { &test_mulchw_         , "     mulchw.", },
3293     { &test_mulchwu_        , "    mulchwu.", },
3294     { &test_mulhhw_         , "     mulhhw.", },
3295     { &test_mulhhwu_        , "    mulhhwu.", },
3296     { &test_mullhw_         , "     mullhw.", },
3297     { &test_mullhwu_        , "    mullhwu.", },
3298     { &test_nmacchw_        , "    nmacchw.", },
3299     { &test_nmacchwo_       , "   nmacchwo.", },
3300     { &test_nmacchws_       , "   nmacchws.", },
3301     { &test_nmacchwso_      , "  nmacchwso.", },
3302     { &test_nmachhw_        , "    nmachhw.", },
3303     { &test_nmachhwo_       , "   nmachhwo.", },
3304     { &test_nmachhws_       , "   nmachhws.", },
3305     { &test_nmachhwso_      , "  nmachhwso.", },
3306     { &test_nmaclhw_        , "    nmaclhw.", },
3307     { &test_nmaclhwo_       , "   nmaclhwo.", },
3308     { &test_nmaclhws_       , "   nmaclhws.", },
3309     { &test_nmaclhwso_      , "  nmaclhwso.", },
3310     { NULL,                   NULL,           },
3311 };
3312 #endif /* defined (IS_PPC405) */
3313 
3314 static test_table_t all_tests[] = {
3315     {
3316         tests_ia_ops_two      ,
3317         "PPC integer arithmetic instructions with two arguments",
3318         0x00010102,
3319     },
3320     {
3321         tests_iar_ops_two     ,
3322         "PPC integer instructions with two arguments with flags update",
3323         0x01010102,
3324     },
3325     {
3326         tests_il_ops_two      ,
3327         "PPC integer logical instructions with two arguments",
3328         0x00010202,
3329     },
3330     {
3331         tests_ilr_ops_two     ,
3332         "PPC integer logical instructions with two arguments with flags update",
3333         0x01010202,
3334     },
3335     {
3336         tests_icr_ops_two     ,
3337         "PPC integer compare instructions (two arguents)",
3338         0x01010304,
3339     },
3340     {
3341         tests_icr_ops_two_i16 ,
3342         "PPC integer compare with immediate instructions (two arguents)",
3343         0x01010304,
3344     },
3345     {
3346         tests_ia_ops_two_i16  ,
3347         "PPC integer arithmetic instructions\n    with one register + one 16 bits immediate arguments",
3348         0x00010106,
3349     },
3350     {
3351         tests_iar_ops_two_i16 ,
3352         "PPC integer arithmetic instructions\n    with one register + one 16 bits immediate arguments with flags update",
3353         0x01010106,
3354     },
3355     {
3356         tests_il_ops_two_i16  ,
3357         "PPC integer logical instructions\n    with one register + one 16 bits immediate arguments",
3358         0x00010206,
3359     },
3360     {
3361         tests_ilr_ops_two_i16 ,
3362         "PPC integer logical instructions\n    with one register + one 16 bits immediate arguments with flags update",
3363         0x01010206,
3364     },
3365     {
3366         tests_crl_ops_two     ,
3367         "PPC condition register logical instructions - two operands",
3368         0x01000602,
3369     },
3370     {
3371         tests_ia_ops_one      ,
3372         "PPC integer arithmetic instructions with one argument",
3373         0x00010101,
3374     },
3375     {
3376         tests_iar_ops_one     ,
3377         "PPC integer arithmetic instructions with one argument with flags update",
3378         0x01010101,
3379     },
3380     {
3381         tests_il_ops_one      ,
3382         "PPC integer logical instructions with one argument",
3383         0x00010201,
3384     },
3385     {
3386         tests_ilr_ops_one     ,
3387         "PPC integer logical instructions with one argument with flags update",
3388         0x01010201,
3389     },
3390     {
3391         tests_il_ops_spe      ,
3392         "PPC logical instructions with special forms",
3393         0x00010207,
3394     },
3395     {
3396         tests_ilr_ops_spe     ,
3397         "PPC logical instructions with special forms with flags update",
3398         0x01010207,
3399     },
3400 #if !defined (NO_FLOAT)
3401     {
3402         tests_fa_ops_three    ,
3403         "PPC floating point arithmetic instructions with three arguments",
3404         0x00020103,
3405     },
3406 #endif /* !defined (NO_FLOAT) */
3407 #if !defined (NO_FLOAT)
3408     {
3409         tests_far_ops_three   ,
3410         "PPC floating point arithmetic instructions\n    with three arguments with flags update",
3411         0x01020103,
3412     },
3413 #endif /* !defined (NO_FLOAT) */
3414 #if !defined (NO_FLOAT)
3415     {
3416         tests_fa_ops_two      ,
3417         "PPC floating point arithmetic instructions with two arguments",
3418         0x00020102,
3419     },
3420 #endif /* !defined (NO_FLOAT) */
3421 #if !defined (NO_FLOAT)
3422     {
3423         tests_far_ops_two     ,
3424         "PPC floating point arithmetic instructions\n    with two arguments with flags update",
3425         0x01020102,
3426     },
3427 #endif /* !defined (NO_FLOAT) */
3428 #if !defined (NO_FLOAT)
3429     {
3430         tests_fcr_ops_two     ,
3431         "PPC floating point compare instructions (two arguments)",
3432         0x01020304,
3433     },
3434 #endif /* !defined (NO_FLOAT) */
3435 #if !defined (NO_FLOAT)
3436     {
3437         tests_fa_ops_one      ,
3438         "PPC floating point arithmetic instructions with one argument",
3439         0x00020101,
3440     },
3441 #endif /* !defined (NO_FLOAT) */
3442 #if !defined (NO_FLOAT)
3443     {
3444         tests_far_ops_one     ,
3445         "PPC floating point arithmetic instructions\n    with one argument with flags update",
3446         0x01020101,
3447     },
3448 #endif /* !defined (NO_FLOAT) */
3449 #if !defined (NO_FLOAT)
3450     {
3451         tests_fl_ops_spe      ,
3452         "PPC floating point status register manipulation instructions",
3453         0x00020207,
3454     },
3455 #endif /* !defined (NO_FLOAT) */
3456 #if !defined (NO_FLOAT)
3457     {
3458         tests_flr_ops_spe     ,
3459         "PPC floating point status register manipulation instructions\n  with flags update",
3460         0x01020207,
3461     },
3462 #endif /* !defined (NO_FLOAT) */
3463 #if defined (HAS_ALTIVEC)
3464     {
3465         tests_aa_ops_three    ,
3466         "PPC altivec integer arithmetic instructions with three arguments",
3467         0x00040103,
3468     },
3469 #endif /* defined (HAS_ALTIVEC) */
3470 #if defined (HAS_ALTIVEC)
3471     {
3472         tests_al_ops_three    ,
3473         "PPC altivec integer logical instructions with three arguments",
3474         0x00040203,
3475     },
3476 #endif /* defined (HAS_ALTIVEC) */
3477 #if defined (HAS_ALTIVEC)
3478     {
3479         tests_aa_ops_two      ,
3480         "PPC altivec integer arithmetic instructions with two arguments",
3481         0x00040102,
3482     },
3483 #endif /* defined (HAS_ALTIVEC) */
3484 #if defined (HAS_ALTIVEC)
3485     {
3486         tests_al_ops_two      ,
3487         "PPC altivec integer logical instructions with two arguments",
3488         0x00040202,
3489     },
3490 #endif /* defined (HAS_ALTIVEC) */
3491 #if defined (HAS_ALTIVEC)
3492     {
3493         tests_al_ops_one      ,
3494         "PPC altivec integer logical instructions with one argument",
3495         0x00040201,
3496     },
3497 #endif /* defined (HAS_ALTIVEC) */
3498 #if defined (HAS_ALTIVEC)
3499     {
3500         tests_ac_ops_two      ,
3501         "Altivec integer compare instructions",
3502         0x00040302,
3503     },
3504 #endif /* defined (HAS_ALTIVEC) */
3505 #if defined (HAS_ALTIVEC)
3506     {
3507         tests_acr_ops_two     ,
3508         "Altivec integer compare instructions with flags update",
3509         0x01040302,
3510     },
3511 #endif /* defined (HAS_ALTIVEC) */
3512 #if defined (HAS_ALTIVEC)
3513     {
3514         tests_afa_ops_three   ,
3515         "Altivec floating point arithmetic instructions with three arguments",
3516         0x00050103,
3517     },
3518 #endif /* defined (HAS_ALTIVEC) */
3519 #if defined (HAS_ALTIVEC)
3520     {
3521         tests_afa_ops_two     ,
3522         "Altivec floating point arithmetic instructions with two arguments",
3523         0x00050102,
3524     },
3525 #endif /* defined (HAS_ALTIVEC) */
3526 #if defined (HAS_ALTIVEC)
3527     {
3528         tests_afa_ops_one     ,
3529         "Altivec floating point arithmetic instructions with one argument",
3530         0x00050101,
3531     },
3532 #endif /* defined (HAS_ALTIVEC) */
3533 #if defined (HAS_ALTIVEC)
3534     {
3535         tests_afc_ops_two     ,
3536         "Altivec floating point compare instructions",
3537         0x00050302,
3538     },
3539 #endif /* defined (HAS_ALTIVEC) */
3540 #if defined (HAS_ALTIVEC)
3541     {
3542         tests_afcr_ops_two    ,
3543         "Altivec floating point compare instructions with flags update",
3544         0x01050302,
3545     },
3546 #endif /* defined (HAS_ALTIVEC) */
3547 #if defined (IS_PPC405)
3548     {
3549         tests_p4m_ops_two     ,
3550         "PPC 405 mac instructions with three arguments",
3551         0x00030102,
3552     },
3553 #endif /* defined (IS_PPC405) */
3554 #if defined (IS_PPC405)
3555     {
3556         tests_p4mc_ops_two    ,
3557         "PPC 405 mac instructions with three arguments with flags update",
3558         0x01030102,
3559     },
3560 #endif /* defined (IS_PPC405) */
3561     { NULL,                   NULL,               0x00000000, },
3562 };
3563 
3564 // END #include "ops-ppc.c"
3565 
3566 
3567 static int verbose = 0;
3568 
3569 static double *fargs;
3570 static int nb_fargs;
3571 static uint32_t *iargs;
3572 static int nb_iargs;
3573 static uint16_t *ii16;
3574 static int nb_ii16;
3575 
register_farg(void * farg,int s,uint16_t _exp,uint64_t mant)3576 static inline void register_farg (void *farg,
3577                                   int s, uint16_t _exp, uint64_t mant)
3578 {
3579     uint64_t tmp;
3580 
3581     tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
3582     *(uint64_t *)farg = tmp;
3583     AB_DPRINTF("%d %03x %013llx => %016llx %0e\n",
3584                s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
3585 }
3586 
build_fargs_table(void)3587 static void build_fargs_table (void)
3588 {
3589     /* Sign goes from zero to one
3590      * Exponent goes from 0 to ((1 << 12) - 1)
3591      * Mantissa goes from 1 to ((1 << 52) - 1)
3592      * + special values:
3593      * +0.0      : 0 0x000 0x0000000000000
3594      * -0.0      : 1 0x000 0x0000000000000
3595      * +infinity : 0 0x7FF 0x0000000000000
3596      * -infinity : 1 0x7FF 0x0000000000000
3597      * +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF
3598      * -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF
3599      * +QNaN     : 0 0x7FF 0x8000000000000
3600      * -QNaN     : 1 0x7FF 0x8000000000000
3601      * (8 values)
3602      */
3603     uint64_t mant;
3604     uint16_t _exp, e0, e1;
3605     int s;
3606     int i;
3607 
3608     fargs = my_malloc(200 * sizeof(double));
3609     i = 0;
3610     for (s = 0; s < 2; s++) {
3611         for (e0 = 0; e0 < 2; e0++) {
3612             for (e1 = 0x000; ; e1 = ((e1 + 1) << 2) + 6) {
3613                 if (e1 >= 0x400)
3614                     e1 = 0x3fe;
3615                 _exp = (e0 << 10) | e1;
3616                 for (mant = 0x0000000000001ULL; mant < (1ULL << 52);
3617                      /* Add 'random' bits */
3618                      mant = ((mant + 0x4A6) << 13) + 0x359) {
3619                     register_farg(&fargs[i++], s, _exp, mant);
3620                 }
3621                 if (e1 == 0x3fe)
3622                     break;
3623             }
3624         }
3625     }
3626     /* Special values */
3627     /* +0.0      : 0 0x000 0x0000000000000 */
3628     s = 0;
3629     _exp = 0x000;
3630     mant = 0x0000000000000ULL;
3631     register_farg(&fargs[i++], s, _exp, mant);
3632     /* -0.0      : 1 0x000 0x0000000000000 */
3633     s = 1;
3634     _exp = 0x000;
3635     mant = 0x0000000000000ULL;
3636     register_farg(&fargs[i++], s, _exp, mant);
3637     /* +infinity : 0 0x7FF 0x0000000000000  */
3638     s = 0;
3639     _exp = 0x7FF;
3640     mant = 0x0000000000000ULL;
3641     register_farg(&fargs[i++], s, _exp, mant);
3642     /* -infinity : 1 0x7FF 0x0000000000000 */
3643     s = 1;
3644     _exp = 0x7FF;
3645     mant = 0x0000000000000ULL;
3646     register_farg(&fargs[i++], s, _exp, mant);
3647     /* +SNaN     : 0 0x7FF 0x7FFFFFFFFFFFF */
3648     s = 0;
3649     _exp = 0x7FF;
3650     mant = 0x7FFFFFFFFFFFFULL;
3651     register_farg(&fargs[i++], s, _exp, mant);
3652     /* -SNaN     : 1 0x7FF 0x7FFFFFFFFFFFF */
3653     s = 1;
3654     _exp = 0x7FF;
3655     mant = 0x7FFFFFFFFFFFFULL;
3656     register_farg(&fargs[i++], s, _exp, mant);
3657     /* +QNaN     : 0 0x7FF 0x8000000000000 */
3658     s = 0;
3659     _exp = 0x7FF;
3660     mant = 0x8000000000000ULL;
3661     register_farg(&fargs[i++], s, _exp, mant);
3662     /* -QNaN     : 1 0x7FF 0x8000000000000 */
3663     s = 1;
3664     _exp = 0x7FF;
3665     mant = 0x8000000000000ULL;
3666     register_farg(&fargs[i++], s, _exp, mant);
3667     AB_DPRINTF("Registered %d floats values\n", i);
3668     nb_fargs = i;
3669 }
3670 
build_iargs_table(void)3671 static void build_iargs_table (void)
3672 {
3673     uint64_t tmp;
3674     int i;
3675 
3676     iargs = my_malloc(400 * sizeof(uint32_t));
3677     i = 0;
3678     for (tmp = 0; ; tmp = tmp + 1 + (tmp>>1)+(tmp>>2)+(tmp>>3)) {
3679         if (tmp >= 0x100000000ULL)
3680             tmp = 0xFFFFFFFF;
3681         iargs[i++] = tmp;
3682         AB_DPRINTF("val %08llx\n", tmp);
3683         if (tmp == 0xFFFFFFFF)
3684             break;
3685     }
3686     AB_DPRINTF("Registered %d ints values\n", i);
3687     nb_iargs = i;
3688 }
3689 
build_ii16_table(void)3690 static void build_ii16_table (void)
3691 {
3692     uint32_t tmp;
3693     int i;
3694 
3695     ii16 = my_malloc(200 * sizeof(uint32_t));
3696     i = 0;
3697     for (tmp = 0; ; tmp = tmp + 1 + (tmp>>1)+(tmp>>2)+(tmp>>3)) {
3698         if (tmp >= 0x10000)
3699             tmp = 0xFFFF;
3700         ii16[i++] = tmp;
3701         AB_DPRINTF("val %08llx\n", tmp);
3702         if (tmp == 0xFFFF)
3703             break;
3704     }
3705     AB_DPRINTF("Registered %d ints values\n", i);
3706     nb_ii16 = i;
3707 }
3708 
test_int_three_args(const unsigned char * name,test_func_t func)3709 static void test_int_three_args (const unsigned char *name, test_func_t func)
3710 {
3711     uint32_t res, flags, xer;
3712     int i, j, k;
3713 
3714     if (verbose > 1)
3715         vexxx_printf( "Test instruction %s\n", name);
3716     for (i = 0; i < nb_iargs; i++) {
3717         for (j = 0; j < nb_iargs; j++) {
3718             for (k = 0;k < nb_iargs; k++) {
3719                 r14 = iargs[i];
3720                 r15 = iargs[j];
3721                 r16 = iargs[k];
3722                 r18 = 0;
3723                 __asm__ __volatile__ ("mtcr 18");
3724                 __asm__ __volatile__ ("mtxer 18");
3725                 (*func)();
3726                 __asm__ __volatile__ ("mfcr 18");
3727                 flags = r18;
3728                 __asm__ __volatile__ ("mfxer 18");
3729                 xer = r18;
3730                 res = r17;
3731                 vexxx_printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
3732                        name, iargs[i], iargs[j], iargs[k], res, flags, xer);
3733             }
3734             vexxx_printf("\n");
3735         }
3736         vexxx_printf("\n");
3737     }
3738     vexxx_printf("\n");
3739 }
3740 
test_int_two_args(const unsigned char * name,test_func_t func)3741 static void test_int_two_args (const unsigned char *name, test_func_t func)
3742 {
3743     uint32_t res, flags, xer;
3744     int i, j;
3745 
3746     if (verbose > 1)
3747         vexxx_printf( "Test instruction %s\n", name);
3748     for (i = 0; i < nb_iargs; i++) {
3749         for (j = 0; j < nb_iargs; j++) {
3750             r14 = iargs[i];
3751             r15 = iargs[j];
3752             r18 = 0;
3753             __asm__ __volatile__ ("mtcr 18");
3754             __asm__ __volatile__ ("mtxer 18");
3755             (*func)();
3756             __asm__ __volatile__ ("mfcr 18");
3757             flags = r18;
3758             __asm__ __volatile__ ("mfxer 18");
3759             xer = r18;
3760             res = r17;
3761             vexxx_printf("%s %08x, %08x => %08x (%08x %08x)\n",
3762                    name, iargs[i], iargs[j], res, flags, xer);
3763         }
3764         vexxx_printf("\n");
3765     }
3766     vexxx_printf("\n");
3767 }
3768 
test_int_one_arg(const unsigned char * name,test_func_t func)3769 static void test_int_one_arg (const unsigned char *name, test_func_t func)
3770 {
3771     uint32_t res, flags, xer;
3772     int i;
3773 
3774     if (verbose > 1)
3775         vexxx_printf( "Test instruction %s\n", name);
3776     for (i = 0; i < nb_iargs; i++) {
3777         r14 = iargs[i];
3778         r18 = 0;
3779         __asm__ __volatile__ ("mtcr 18");
3780 //        r18 = 0x20000000;                // set xer_ca
3781         __asm__ __volatile__ ("mtxer 18");
3782         (*func)();
3783         res = r17;
3784         __asm__ __volatile__ ("mfcr 18");
3785         flags = r18;
3786         __asm__ __volatile__ ("mfxer 18");
3787         xer = r18;
3788         vexxx_printf("%s %08x => %08x (%08x %08x)\n",
3789                name, iargs[i], res, flags, xer);
3790     }
3791     vexxx_printf("\n");
3792 }
3793 
_patch_op_imm(void * out,void * in,uint16_t imm,int sh,int len)3794 static inline void _patch_op_imm (void *out, void *in,
3795                                   uint16_t imm, int sh, int len)
3796 {
3797     volatile uint32_t *p, *q;
3798 
3799     p = out;
3800     q = in;
3801     *p = (*q & ~(((1 << len) - 1) << sh)) | ((imm & ((1 << len) - 1)) << sh);
3802 }
3803 
patch_op_imm(void * out,void * in,uint16_t imm,int sh,int len)3804 static inline void patch_op_imm (void *out, void *in,
3805                                  uint16_t imm, int sh, int len)
3806 {
3807     volatile uint32_t *p;
3808 
3809     p = out;
3810     _patch_op_imm(out, in, imm, sh, len);
3811     __asm__ __volatile__ ("dcbf 0, %0 ; icbi 0, %0 ; isync" ::"r"(p));
3812 }
3813 
patch_op_imm16(void * out,void * in,uint16_t imm)3814 static inline void patch_op_imm16 (void *out, void *in, uint16_t imm)
3815 {
3816     patch_op_imm(out, in, imm, 0, 16);
3817 }
3818 
test_int_one_reg_imm16(const unsigned char * name,test_func_t func)3819 static void test_int_one_reg_imm16 (const unsigned char *name,
3820                                     test_func_t func)
3821 {
3822     uint32_t func_buf[2], *p;
3823     uint32_t res, flags, xer;
3824     int i, j;
3825 
3826     if (verbose > 1)
3827         vexxx_printf( "Test instruction %s\n", name);
3828     for (i = 0; i < nb_iargs; i++) {
3829         for (j = 0; j < nb_ii16; j++) {
3830             p = (void *)func;
3831 #if 0
3832             vexxx_printf("copy func %s from %p to %p (%08x %08x)\n",
3833                    name, func, func_buf, p[0], p[1]);
3834 #endif
3835             func_buf[1] = p[1];
3836             patch_op_imm16(func_buf, p, ii16[j]);
3837             func = (void *)func_buf;
3838 #if 0
3839             vexxx_printf(" =>  func %s from %p to %p (%08x %08x)\n",
3840                    name, func, func_buf, func_buf[0], func_buf[1]);
3841 #endif
3842             r14 = iargs[i];
3843             r18 = 0;
3844             __asm__ __volatile__ ("mtcr 18");
3845             __asm__ __volatile__ ("mtxer 18");
3846             (*func)();
3847             __asm__ __volatile__ ("mfcr 18");
3848             flags = r18;
3849             __asm__ __volatile__ ("mfxer 18");
3850             xer = r18;
3851             res = r17;
3852             vexxx_printf("%s %08x, %08x => %08x (%08x %08x)\n",
3853                    name, iargs[i], ii16[j], res, flags, xer);
3854         }
3855         vexxx_printf("\n");
3856     }
3857     vexxx_printf("\n");
3858 }
3859 
3860 /* Special test cases for:
3861  * rlwimi
3862  * rlwinm
3863  * rlwnm
3864  * srawi
3865  * mcrf
3866  * mcrfs
3867  * mffs
3868  * mtfsb0
3869  * mtfsb1
3870  */
3871 
rlwi_cb(const unsigned char * name,test_func_t func)3872 static void rlwi_cb (const unsigned char *name, test_func_t func)
3873 {
3874     uint32_t func_buf[2], *p;
3875     uint32_t res, flags, xer;
3876     int i, j, k, l;
3877 
3878     if (verbose > 1)
3879         vexxx_printf( "Test instruction %s\n", name);
3880     for (i = 0;;) {
3881         if (i >= nb_iargs)
3882             i = nb_iargs - 1;
3883         for (j = 0; j < 32; j++) {
3884             for (k = 0; k < 32; k++) {
3885                 for (l = 0; l < 32; l++) {
3886                     p = (void *)func;
3887                     func_buf[1] = p[1];
3888                     _patch_op_imm(func_buf, p, j, 11, 5);
3889                     _patch_op_imm(func_buf, p, k, 6, 5);
3890                     patch_op_imm(func_buf, p, l, 1, 5);
3891                     func = (void *)func_buf;
3892                     r14 = iargs[i];
3893                     r18 = 0;
3894                     __asm__ __volatile__ ("mtcr 18");
3895                     __asm__ __volatile__ ("mtxer 18");
3896                     (*func)();
3897                     __asm__ __volatile__ ("mfcr 18");
3898                     flags = r18;
3899                     __asm__ __volatile__ ("mfxer 18");
3900                     xer = r18;
3901                     res = r17;
3902                     vexxx_printf("%s %08x, %d, %d, %d => %08x (%08x %08x)\n",
3903                            name, iargs[i], j, k, l, res, flags, xer);
3904                 }
3905                 vexxx_printf("\n");
3906             }
3907             vexxx_printf("\n");
3908         }
3909         vexxx_printf("\n");
3910         if (i == 0)
3911             i = 1;
3912         else if (i == nb_iargs - 1)
3913             break;
3914         else
3915             i += 3;
3916     }
3917     vexxx_printf("\n");
3918 }
3919 
rlwnm_cb(const unsigned char * name,test_func_t func)3920 static void rlwnm_cb (const unsigned char *name, test_func_t func)
3921 {
3922     uint32_t func_buf[2], *p;
3923     uint32_t res, flags, xer;
3924     int i, j, k, l;
3925 
3926     if (verbose > 1)
3927         vexxx_printf( "Test instruction %s\n", name);
3928     for (i = 0; i < nb_iargs; i++) {
3929         for (j = 0; j < 64; j++) {
3930             for (k = 0; k < 32; k++) {
3931                 for (l = 0; l < 32; l++) {
3932                     p = (void *)func;
3933                     func_buf[1] = p[1];
3934                     _patch_op_imm(func_buf, p, k, 6, 5);
3935                     patch_op_imm(func_buf, p, l, 1, 5);
3936                     func = (void *)func_buf;
3937                     r14 = iargs[i];
3938                     r15 = j;
3939                     r18 = 0;
3940                     __asm__ __volatile__ ("mtcr 18");
3941                     __asm__ __volatile__ ("mtxer 18");
3942                     (*func)();
3943                     __asm__ __volatile__ ("mfcr 18");
3944                     flags = r18;
3945                     __asm__ __volatile__ ("mfxer 18");
3946                     xer = r18;
3947                     res = r17;
3948                     vexxx_printf("%s %08x, %08x, %d, %d => %08x (%08x %08x)\n",
3949                            name, iargs[i], j, k, l, res, flags, xer);
3950                 }
3951                 vexxx_printf("\n");
3952             }
3953             vexxx_printf("\n");
3954         }
3955         vexxx_printf("\n");
3956     }
3957     vexxx_printf("\n");
3958 }
3959 
srawi_cb(const unsigned char * name,test_func_t func)3960 static void srawi_cb (const unsigned char *name, test_func_t func)
3961 {
3962     uint32_t func_buf[2], *p;
3963     uint32_t res, flags, xer;
3964     int i, j;
3965 
3966     if (verbose > 1)
3967         vexxx_printf( "Test instruction %s\n", name);
3968     for (i = 0; i < nb_iargs; i++) {
3969         for (j = 0; j < 32; j++) {
3970             p = (void *)func;
3971             func_buf[1] = p[1];
3972             patch_op_imm(func_buf, p, j, 11, 5);
3973             func = (void *)func_buf;
3974             r14 = iargs[i];
3975             r18 = 0;
3976             __asm__ __volatile__ ("mtcr 18");
3977             __asm__ __volatile__ ("mtxer 18");
3978             (*func)();
3979             __asm__ __volatile__ ("mfcr 18");
3980             flags = r18;
3981             __asm__ __volatile__ ("mfxer 18");
3982             xer = r18;
3983             res = r17;
3984             vexxx_printf("%s %08x, %d => %08x (%08x %08x)\n",
3985                    name, iargs[i], j, res, flags, xer);
3986         }
3987         vexxx_printf("\n");
3988     }
3989     vexxx_printf("\n");
3990 }
3991 
3992 typedef struct special_t special_t;
3993 struct special_t {
3994     const unsigned char *name;
3995     void (*test_cb)(const unsigned char *name, test_func_t func);
3996 };
3997 
test_special(special_t * table,const unsigned char * name,test_func_t func)3998 static void test_special (special_t *table,
3999                           const unsigned char *name, test_func_t func)
4000 {
4001     const unsigned char *tmp;
4002     int i;
4003 
4004     for (tmp = name; my_isspace(*tmp); tmp++)
4005         continue;
4006     for (i = 0; table[i].name != NULL; i++) {
4007 #if 0
4008         vexxx_printf( "look for handler for '%s' (%s)\n", name,
4009                 table[i].name);
4010 #endif
4011         if (my_strcmp(table[i].name, tmp) == 0) {
4012             (*table[i].test_cb)(name, func);
4013             return;
4014         }
4015     }
4016     vexxx_printf( "ERROR: no test found for op '%s'\n", name);
4017 }
4018 
4019 static special_t special_int_ops[] = {
4020 #if 0
4021     {
4022         "rlwimi", /* One register + 3 5 bits immediate arguments */
4023         &rlwi_cb,
4024     },
4025     {
4026         "rlwimi.", /* One register + 3 5 bits immediate arguments */
4027         &rlwi_cb,
4028     },
4029     {
4030         "rlwinm", /* One register + 3 5 bits immediate arguments */
4031         &rlwi_cb,
4032     },
4033     {
4034         "rlwinm.", /* One register + 3 5 bits immediate arguments */
4035         &rlwi_cb,
4036     },
4037     {
4038         "rlwnm",  /* Two registers + 3 5 bits immediate arguments */
4039         &rlwnm_cb,
4040     },
4041     {
4042         "rlwnm.",  /* Two registers + 3 5 bits immediate arguments */
4043         &rlwnm_cb,
4044     },
4045     {
4046         "srawi",  /* One register + 1 5 bits immediate arguments */
4047         &srawi_cb,
4048     },
4049     {
4050         "srawi.",  /* One register + 1 5 bits immediate arguments */
4051         &srawi_cb,
4052     },
4053 #endif
4054 #if 0
4055     {
4056         "mcrf",  /* 2 3 bits immediate arguments */
4057         &mcrf_cb,
4058     },
4059     {
4060         "mcrf",  /* 2 3 bits immediate arguments */
4061         &mcrf_cb,
4062     },
4063 #endif
4064     {
4065         NULL,
4066         NULL,
4067     },
4068 };
4069 
test_int_special(const unsigned char * name,test_func_t func)4070 static void test_int_special (const unsigned char *name, test_func_t func)
4071 {
4072     test_special(special_int_ops, name, func);
4073 }
4074 
4075 static test_loop_t int_loops[] = {
4076     &test_int_one_arg,
4077     &test_int_two_args,
4078     &test_int_three_args,
4079     &test_int_two_args,
4080     &test_int_one_reg_imm16,
4081     &test_int_one_reg_imm16,
4082     &test_int_special,
4083 };
4084 
4085 #if !defined (NO_FLOAT)
test_float_three_args(const unsigned char * name,test_func_t func)4086 static void test_float_three_args (const unsigned char *name, test_func_t func)
4087 {
4088     double res;
4089     uint64_t u0, u1, u2, ur;
4090     uint32_t flags;
4091     int i, j, k;
4092 
4093     if (verbose > 1)
4094         vexxx_printf( "Test instruction %s\n", name);
4095     for (i = 0; i < nb_fargs; i++) {
4096         for (j = 0; j < nb_fargs; j++) {
4097             for (k = 0;k < nb_fargs; k++) {
4098                 u0 = *(uint64_t *)(&fargs[i]);
4099                 u1 = *(uint64_t *)(&fargs[j]);
4100                 u2 = *(uint64_t *)(&fargs[k]);
4101                 f14 = fargs[i];
4102                 f15 = fargs[j];
4103                 f16 = fargs[k];
4104                 r18 = 0;
4105                 __asm__ __volatile__ ("mtcr 18");
4106                 __asm__ __volatile__ ("mtxer 18");
4107                 f18 = +0.0;
4108                 __asm__ __volatile__ ("mtfsf 0xFF, 18");
4109                 (*func)();
4110                 __asm__ __volatile__ ("mfcr 18");
4111                 flags = r18;
4112                 res = f17;
4113                 ur = *(uint64_t *)(&res);
4114                 vexxx_printf("%s %016llx, %016llx, %016llx => %016llx (%08x)\n",
4115                        name, u0, u1, u2, ur, flags);
4116             }
4117             vexxx_printf("\n");
4118         }
4119         vexxx_printf("\n");
4120     }
4121     vexxx_printf("\n");
4122 }
4123 
test_float_two_args(const unsigned char * name,test_func_t func)4124 static void test_float_two_args (const unsigned char *name, test_func_t func)
4125 {
4126     double res;
4127     uint64_t u0, u1, ur;
4128     uint32_t flags;
4129     int i, j;
4130 
4131     if (verbose > 1)
4132         vexxx_printf( "Test instruction %s\n", name);
4133     for (i = 0; i < nb_fargs; i++) {
4134         for (j = 0; j < nb_fargs; j++) {
4135             u0 = *(uint64_t *)(&fargs[i]);
4136             u1 = *(uint64_t *)(&fargs[j]);
4137             f14 = fargs[i];
4138             f15 = fargs[j];
4139             r18 = 0;
4140             __asm__ __volatile__ ("mtcr 18");
4141             __asm__ __volatile__ ("mtxer 18");
4142             f18 = +0.0;
4143             __asm__ __volatile__ ("mtfsf 0xFF, 18");
4144             (*func)();
4145             __asm__ __volatile__ ("mfcr 18");
4146             flags = r18;
4147             res = f17;
4148             ur = *(uint64_t *)(&res);
4149             vexxx_printf("%s %016llx, %016llx => %016llx (%08x)\n",
4150                    name, u0, u1, ur, flags);
4151         }
4152         vexxx_printf("\n");
4153     }
4154     vexxx_printf("\n");
4155 }
4156 
test_float_one_arg(const unsigned char * name,test_func_t func)4157 static void test_float_one_arg (const unsigned char *name, test_func_t func)
4158 {
4159     double res;
4160     uint64_t u0, ur;
4161     uint32_t flags;
4162     int i;
4163 
4164     if (verbose > 1)
4165         vexxx_printf( "Test instruction %s\n", name);
4166     for (i = 0; i < nb_fargs; i++) {
4167         u0 = *(uint64_t *)(&fargs[i]);
4168         f14 = fargs[i];
4169         r18 = 0;
4170         __asm__ __volatile__ ("mtcr 18");
4171         __asm__ __volatile__ ("mtxer 18");
4172         f18 = +0.0;
4173         __asm__ __volatile__ ("mtfsf 0xFF, 18");
4174         (*func)();
4175         __asm__ __volatile__ ("mfcr 18");
4176         flags = r18;
4177         res = f17;
4178         ur = *(uint64_t *)(&res);
4179         vexxx_printf("%s %016llx => %016llx (%08x)\n", name, u0, ur, flags);
4180     }
4181     vexxx_printf("\n");
4182 }
4183 
4184 static special_t special_float_ops[] = {
4185 #if 0
4186     {
4187         "mffs",   /* One 5 bits immediate argument */
4188         &mffs_cb,
4189     },
4190     {
4191         "mffs.",   /* One 5 bits immediate argument */
4192         &mffs_cb,
4193     },
4194     {
4195         "mtfsb0", /* One 5 bits immediate argument */
4196         &mffs_cb,
4197     },
4198     {
4199         "mtfsb0.", /* One 5 bits immediate argument */
4200         &mffs_cb,
4201     },
4202     {
4203         "mtfsb1", /* One 5 bits immediate argument */
4204         &mffs_cb,
4205     },
4206     {
4207         "mtfsb1.", /* One 5 bits immediate argument */
4208         &mffs_cb,
4209     },
4210     {
4211         "mtfsf",  /* One register + 1 8 bits immediate argument */
4212         &mtfsf_cb,
4213     },
4214     {
4215         "mtfsf.",  /* One register + 1 8 bits immediate argument */
4216         &mtfsf_cb,
4217     },
4218     {
4219         "mtfsfi", /* One 5 bits argument + 1 5 bits argument */
4220         &mtfsfi_cb,
4221     },
4222     {
4223         "mtfsfi.", /* One 5 bits argument + 1 5 bits argument */
4224         &mtfsfi_cb,
4225     },
4226 #endif
4227     {
4228         NULL,
4229         NULL,
4230     },
4231 };
4232 
test_float_special(const unsigned char * name,test_func_t func)4233 static void test_float_special (const unsigned char *name, test_func_t func)
4234 {
4235     test_special(special_float_ops, name, func);
4236 }
4237 
4238 static test_loop_t float_loops[] = {
4239     &test_float_one_arg,
4240     &test_float_two_args,
4241     &test_float_three_args,
4242     &test_float_two_args,
4243     NULL,
4244     NULL,
4245     &test_float_special,
4246 };
4247 #endif /* !defined (NO_FLOAT) */
4248 
4249 
4250 #if defined (HAS_ALTIVEC) /* XXX: TODO */
4251 #endif /* defined (HAS_ALTIVEC) */
4252 
4253 #if defined (IS_PPC405)
test_ppc405(const unsigned char * name,test_func_t func)4254 static void test_ppc405 (const unsigned char *name, test_func_t func)
4255 {
4256     uint32_t res, flags, xer;
4257     int i, j, k;
4258 
4259     if (verbose > 1)
4260         vexxx_printf( "Test instruction %s\n", name);
4261     for (i = 0; i < nb_iargs; i++) {
4262         for (j = 0; j < nb_iargs; j++) {
4263             for (k = 0;k < nb_iargs; k++) {
4264                 r14 = iargs[i];
4265                 r15 = iargs[j];
4266                  /* Beware: the third argument and the result
4267                   * are in the same register
4268                   */
4269                 r17 = iargs[k];
4270                 r18 = 0;
4271                 __asm__ __volatile__ ("mtcr 18");
4272                 __asm__ __volatile__ ("mtxer 18");
4273                 (*func)();
4274                 __asm__ __volatile__ ("mfcr 18");
4275                 flags = r18;
4276                 __asm__ __volatile__ ("mfxer 18");
4277                 xer = r18;
4278                 res = r17;
4279                 vexxx_printf("%s %08x, %08x, %08x => %08x (%08x %08x)\n",
4280                        name, iargs[i], iargs[j], iargs[k], res, flags, xer);
4281             }
4282             vexxx_printf("\n");
4283         }
4284         vexxx_printf("\n");
4285     }
4286     vexxx_printf("\n");
4287 }
4288 #endif /* defined (IS_PPC405) */
4289 
check_filter(unsigned char * filter)4290 static int check_filter (unsigned char *filter)
4291 {
4292     unsigned char *c;
4293     int ret = 1;
4294 
4295     if (filter != NULL) {
4296         c = my_strchr(filter, '*');
4297         if (c != NULL) {
4298             *c = '\0';
4299             ret = 0;
4300         }
4301     }
4302 
4303     return ret;
4304 }
4305 
check_name(const unsigned char * name,const unsigned char * filter,int exact)4306 static int check_name (const unsigned char *name, const unsigned char *filter,
4307                        int exact)
4308 {
4309     int nlen, flen;
4310     int ret = 0;
4311 
4312     if (filter != NULL) {
4313         for (; my_isspace(*name); name++)
4314             continue;
4315         FDPRINTF("Check '%s' againt '%s' (%s match)\n",
4316                  name, filter, exact ? "exact" : "starting");
4317         nlen = vexxx_strlen(name);
4318         flen = vexxx_strlen(filter);
4319         if (exact) {
4320             if (nlen == flen && my_memcmp(name, filter, flen) == 0)
4321                 ret = 1;
4322         } else {
4323             if (flen <= nlen && my_memcmp(name, filter, flen) == 0)
4324                 ret = 1;
4325         }
4326     } else {
4327         ret = 1;
4328     }
4329 
4330     return ret;
4331 }
4332 
do_tests(int one_arg,int two_args,int three_args,int arith,int logical,int compare,int integer,int floats,int p405,int altivec,int faltivec,int cr,unsigned char * filter)4333 static void do_tests (int one_arg, int two_args, int three_args,
4334                       int arith, int logical, int compare,
4335                       int integer, int floats, int p405,
4336                       int altivec, int faltivec,
4337                       int cr, unsigned char *filter)
4338 {
4339 #if defined (IS_PPC405)
4340     test_loop_t tmpl;
4341 #endif
4342     test_loop_t *loop;
4343     test_t *tests;
4344     int nb_args, type, family;
4345     int i, j, n;
4346     int exact;
4347 
4348     exact = check_filter(filter);
4349     n = 0;
4350     for (i = 0; all_tests[i].name != NULL; i++) {
4351         nb_args = all_tests[i].flags & PPC_NB_ARGS;
4352         /* Check number of arguments */
4353         if ((nb_args == 1 && !one_arg) ||
4354             (nb_args == 2 && !two_args) ||
4355             (nb_args == 3 && !three_args))
4356             continue;
4357         /* Check instruction type */
4358         type = all_tests[i].flags & PPC_TYPE;
4359         if ((type == PPC_ARITH && !arith) ||
4360             (type == PPC_LOGICAL && !logical) ||
4361             (type == PPC_COMPARE && !compare))
4362             continue;
4363         /* Check instruction family */
4364         family = all_tests[i].flags & PPC_FAMILY;
4365         if ((family == PPC_INTEGER && !integer) ||
4366             (family == PPC_FLOAT && !floats) ||
4367             (family == PPC_405 && !p405) ||
4368             (family == PPC_ALTIVEC && !altivec) ||
4369             (family == PPC_FALTIVEC && !faltivec))
4370             continue;
4371         /* Check flags update */
4372         if (((all_tests[i].flags & PPC_CR) && cr == 0) ||
4373             (!(all_tests[i].flags & PPC_CR) && cr == 1))
4374             continue;
4375         /* All passed, do the tests */
4376         tests = all_tests[i].tests;
4377         /* Select the test loop */
4378         switch (family) {
4379         case PPC_INTEGER:
4380             loop = &int_loops[nb_args - 1];
4381             break;
4382         case PPC_FLOAT:
4383 #if !defined (NO_FLOAT)
4384             loop = &float_loops[nb_args - 1];
4385             break;
4386 #else
4387             vexxx_printf( "Sorry. "
4388                     "PPC floating point instructions tests "
4389                     "are disabled on your host\n");
4390 #endif /* !defined (NO_FLOAT) */
4391 
4392         case PPC_405:
4393 #if defined (IS_PPC405)
4394             tmpl = &test_ppc405;
4395             loop = &tmpl;
4396             break;
4397 #else
4398             vexxx_printf( "Sorry. "
4399                     "PPC405 instructions tests are disabled on your host\n");
4400             continue;
4401 #endif /* defined (IS_PPC405) */
4402         case PPC_ALTIVEC:
4403 #if defined (HAS_ALTIVEC)
4404 #if 0
4405             loop = &altivec_int_loops[nb_args - 1];
4406             break;
4407 #else
4408             vexxx_printf( "Sorry. "
4409                     "Altivec instructions tests are not yet implemented\n");
4410             continue;
4411 #endif
4412 #else
4413             vexxx_printf( "Sorry. "
4414                     "Altivec instructions tests are disabled on your host\n");
4415             continue;
4416 #endif
4417         case PPC_FALTIVEC:
4418 #if defined (HAS_ALTIVEC)
4419 #if 0
4420             loop = &altivec_float_loops[nb_args - 1];
4421             break;
4422 #else
4423             vexxx_printf( "Sorry. "
4424                     "Altivec instructions tests are not yet implemented\n");
4425             continue;
4426 #endif
4427 #else
4428             vexxx_printf( "Sorry. "
4429                     "Altivec float instructions tests "
4430                     "are disabled on your host\n");
4431 #endif
4432             continue;
4433         default:
4434             vexxx_printf("ERROR: unknown insn family %08x\n", family);
4435             continue;
4436         }
4437         if (verbose > 0)
4438             vexxx_printf( "%s:\n", all_tests[i].name);
4439         for (j = 0; tests[j].name != NULL; j++) {
4440             if (check_name(tests[j].name, filter, exact))
4441                 (*loop)(tests[j].name, tests[j].func);
4442             n++;
4443         }
4444         vexxx_printf("\n");
4445     }
4446     vexxx_printf( "All done. Tested %d different instructions\n", n);
4447 }
4448 
4449 #if 0 // unused
4450 static void usage (void)
4451 {
4452     vexxx_printf(
4453             "test-ppc [-1] [-2] [-3] [-*] [-t <type>] [-f <family>] [-u] "
4454             "[-n <filter>] [-x] [-h]\n"
4455             "\t-1: test opcodes with one argument\n"
4456             "\t-2: test opcodes with two arguments\n"
4457             "\t-3: test opcodes with three arguments\n"
4458             "\t-*: launch test without checking the number of arguments\n"
4459             "\t-t: launch test for instructions of type <type>\n"
4460             "\t    recognized types:\n"
4461             "\t\tarith (or a)\n"
4462             "\t\tlogical (or l)\n"
4463             "\t\tcompare (or c)\n"
4464             "\t-f: launch test for instructions of family <family>\n"
4465             "\t    recognized families:\n"
4466             "\t\tinteger (or i)\n"
4467             "\t\tfloat (or f)\n"
4468             "\t\tppc405 (or mac)\n"
4469             "\t\taltivec (or a)\n"
4470             "\t-u: test instructions that update flags\n"
4471             "\t-n: filter instructions with <filter>\n"
4472             "\t    <filter> can be in two forms:\n"
4473             "\t\tname  : filter functions that exactly match <name>\n"
4474             "\t\tname* : filter functions that start with <name>\n"
4475             "\t-h: print this help\n"
4476             );
4477 }
4478 #endif
4479 
_main(int argc,char ** argv)4480 int _main (int argc, char **argv)
4481 {
4482     unsigned char /* *tmp, */ *filter = NULL;
4483     int one_arg = 0, two_args = 0, three_args = 0;
4484     int arith = 0, logical = 0, compare = 0;
4485     int integer = 0, floats = 0, p405 = 0, altivec = 0, faltivec = 0;
4486     int cr = -1;
4487     //int c;
4488 
4489     //    while ((c = getopt(argc, argv, "123t:f:n:uvh")) != -1) {
4490     //        switch (c) {
4491     //        case '1':
4492     //            one_arg = 1;
4493     //            break;
4494     //        case '2':
4495     //            two_args = 1;
4496     //            break;
4497     //        case '3':
4498     //            three_args = 1;
4499     //            break;
4500     //        case 't':
4501     //            tmp = optarg;
4502     //            if (my_strcmp(tmp, "arith") == 0 || my_strcmp(tmp, "a") == 0) {
4503     //                arith = 1;
4504     //            } else if (my_strcmp(tmp, "logical") == 0 || my_strcmp(tmp, "l") == 0) {
4505     //                logical = 1;
4506     //            } else if (my_strcmp(tmp, "compare") == 0 || my_strcmp(tmp, "c") == 0) {
4507     //                compare = 1;
4508     //            } else {
4509     //                goto bad_arg;
4510     //            }
4511     //            break;
4512     //        case 'f':
4513     //            tmp = optarg;
4514     //            if (my_strcmp(tmp, "integer") == 0 || my_strcmp(tmp, "i") == 0) {
4515     //                integer = 1;
4516     //            } else if (my_strcmp(tmp, "float") == 0 || my_strcmp(tmp, "f") == 0) {
4517     //                floats = 1;
4518     //            } else if (my_strcmp(tmp, "ppc405") == 0 || my_strcmp(tmp, "mac") == 0) {
4519     //                p405 = 1;
4520     //            } else if (my_strcmp(tmp, "altivec") == 0 || my_strcmp(tmp, "a") == 0) {
4521     //                altivec = 1;
4522     //                faltivec = 1;
4523     //            } else {
4524     //                goto bad_arg;
4525     //            }
4526     //            break;
4527     //        case 'n':
4528     //            filter = optarg;
4529     //            break;
4530     //        case 'u':
4531     //            cr = 1;
4532     //            break;
4533     //        case 'h':
4534     //            usage();
4535     //            return 0;
4536     //        case 'v':
4537     //            verbose++;
4538     //            break;
4539     //        default:
4540     //            usage();
4541     //            vexxx_printf( "Unknown argument: '%c'\n", c);
4542     //            return 1;
4543     //        bad_arg:
4544     //            usage();
4545     //            vexxx_printf( "Bad argument for '%c': '%s'\n", c, tmp);
4546     //            return 1;
4547     //        }
4548     //    }
4549     //    if (argc != optind) {
4550     //        usage();
4551     //        vexxx_printf( "Bad number of arguments\n");
4552     //        return 1;
4553     //    }
4554 
4555     if (one_arg == 0 && two_args == 0 && three_args == 0) {
4556         one_arg = 1;
4557         two_args = 1;
4558         three_args = 1;
4559     }
4560     if (arith == 0 && logical == 0 && compare == 0) {
4561         arith = 1;
4562         logical = 1;
4563         compare = 1;
4564     }
4565     if (integer == 0 && floats == 0 && altivec == 0 && faltivec == 0 &&
4566         p405 == 0) {
4567         integer = 1;
4568         floats = 1;
4569         altivec = 1;
4570         faltivec = 1;
4571         p405 = 1;
4572     }
4573     if (cr == -1)
4574         cr = 2;
4575     build_iargs_table();
4576     build_fargs_table();
4577     build_ii16_table();
4578 
4579 #if 1
4580     one_arg=1;
4581     two_args=1;
4582     three_args=1;
4583 
4584     arith=1;
4585     logical=1;
4586     compare=1;
4587 
4588     integer=1;
4589     floats=0;
4590 
4591     p405=0;
4592     altivec=0;
4593     faltivec=0;
4594 #endif
4595 
4596     do_tests(one_arg, two_args, three_args,
4597              arith, logical, compare,
4598              integer, floats, p405, altivec, faltivec,
4599              cr, filter);
4600 
4601     return 0;
4602 }
4603 
4604 
entry(HWord (* service)(HWord,HWord))4605 void entry ( HWord(*service)(HWord,HWord) )
4606 {
4607    char* argv[2] = { NULL, NULL };
4608    serviceFn = service;
4609    _main(0, argv);
4610    (*service)(0,0);
4611 }
4612