qemu/tests/tcg/cris/libc/check_swap.c
<<
>>
Prefs
   1#include <stdio.h>
   2#include <stdlib.h>
   3#include <stdint.h>
   4#include "sys.h"
   5#include "crisutils.h"
   6
   7#define N 8
   8#define W 4
   9#define B 2
  10#define R 1
  11
  12static always_inline int cris_swap(const int mode, int x)
  13{
  14        switch (mode)
  15        {
  16                case N: asm ("swapn\t%0\n" : "+r" (x) : "0" (x)); break;
  17                case W: asm ("swapw\t%0\n" : "+r" (x) : "0" (x)); break;
  18                case B: asm ("swapb\t%0\n" : "+r" (x) : "0" (x)); break;
  19                case R: asm ("swapr\t%0\n" : "+r" (x) : "0" (x)); break;
  20                case B|R: asm ("swapbr\t%0\n" : "+r" (x) : "0" (x)); break;
  21                case W|R: asm ("swapwr\t%0\n" : "+r" (x) : "0" (x)); break;
  22                case W|B: asm ("swapwb\t%0\n" : "+r" (x) : "0" (x)); break;
  23                case W|B|R: asm ("swapwbr\t%0\n" : "+r" (x) : "0" (x)); break;
  24                case N|R: asm ("swapnr\t%0\n" : "+r" (x) : "0" (x)); break;
  25                case N|B: asm ("swapnb\t%0\n" : "+r" (x) : "0" (x)); break;
  26                case N|B|R: asm ("swapnbr\t%0\n" : "+r" (x) : "0" (x)); break;
  27                case N|W: asm ("swapnw\t%0\n" : "+r" (x) : "0" (x)); break;
  28                default:
  29                        err();
  30                        break;
  31        }
  32        return x;
  33}
  34
  35/* Made this a macro to be able to pick up the location of the errors.  */
  36#define verify_swap(mode, val, expected, n, z)          \
  37do {                                                    \
  38        int r;                                          \
  39        cris_tst_cc_init();                             \
  40        r = cris_swap(mode, val);                       \
  41        cris_tst_mov_cc(n, z);                          \
  42        if (r != expected)                              \
  43                err();                                  \
  44} while(0)
  45
  46void check_swap(void)
  47{
  48        /* Some of these numbers are borrowed from GDB's cris sim
  49           testsuite.  */
  50        if (cris_swap(N, 0) != 0xffffffff)
  51                err();
  52        if (cris_swap(W, 0x12345678) != 0x56781234)
  53                err();
  54        if (cris_swap(B, 0x12345678) != 0x34127856)
  55                err();
  56
  57        verify_swap(R, 0x78134452, 0x1ec8224a, 0, 0);
  58        verify_swap(B, 0x78134452, 0x13785244, 0, 0);
  59        verify_swap(B|R, 0x78134452, 0xc81e4a22, 1, 0);
  60        verify_swap(W, 0x78134452, 0x44527813, 0, 0);
  61        verify_swap(W|R, 0x78134452, 0x224a1ec8, 0, 0);
  62        verify_swap(W|B|R, 0x78134452, 0x4a22c81e, 0, 0);
  63        verify_swap(N, 0x78134452, 0x87ecbbad, 1, 0);
  64        verify_swap(N|R, 0x78134452, 0xe137ddb5, 1, 0);
  65        verify_swap(N|B, 0x78134452, 0xec87adbb, 1, 0);
  66        verify_swap(N|B|R, 0x78134452, 0x37e1b5dd, 0, 0);
  67        verify_swap(N|W, 0x78134452, 0xbbad87ec, 1, 0);
  68        verify_swap(N|B|R, 0xffffffff, 0, 0, 1);
  69}
  70
  71int main(void)
  72{
  73        check_swap();
  74        pass();
  75        return 0;
  76}
  77