Home | History | Annotate | Download | only in s390x
      1 #include <stdio.h>
      2 
      3 #define branch(mask,_v1)                               \
      4   ({                                                   \
      5         unsigned char taken;                           \
      6         unsigned b1 = _v1;                             \
      7         asm volatile(   "       ltr  %[b1],%[b1]\n\t"  \
      8                  	"	brc " #mask " ,1f\n\t" \
      9                         "       mvi %[taken],0\n\t"    \
     10 			"	j   0f\n\t"            \
     11 			"1:	mvi %[taken],1\n\t"    \
     12 			"0:	bcr 0,0 /* nop */\n\t" \
     13              : [taken] "=Q" (taken), [b1] "+d"(b1)     \
     14              :                                         \
     15              : "cc");                                  \
     16         taken;                                         \
     17    })
     18 
     19 void
     20 ltr_1(void)
     21 {
     22   int wrong, ok, v1;
     23 
     24   printf("Test #1  value = 0\n");
     25 
     26   v1 = 0;
     27   wrong = ok = 0;
     28   if (branch(0,  v1)) ++wrong; else ++ok;
     29   if (branch(1,  v1)) ++wrong; else ++ok;
     30   if (branch(2,  v1)) ++wrong; else ++ok;
     31   if (branch(3,  v1)) ++wrong; else ++ok;
     32   if (branch(4,  v1)) ++wrong; else ++ok;
     33   if (branch(5,  v1)) ++wrong; else ++ok;
     34   if (branch(6,  v1)) ++wrong; else ++ok;
     35   if (branch(7,  v1)) ++wrong; else ++ok;
     36   if (branch(8,  v1)) ++ok; else ++wrong;
     37   if (branch(9,  v1)) ++ok; else ++wrong;
     38   if (branch(10, v1)) ++ok; else ++wrong;
     39   if (branch(11, v1)) ++ok; else ++wrong;
     40   if (branch(12, v1)) ++ok; else ++wrong;
     41   if (branch(13, v1)) ++ok; else ++wrong;
     42   if (branch(14, v1)) ++ok; else ++wrong;
     43   if (branch(15, v1)) ++ok; else ++wrong;
     44 
     45   if (wrong != 0 || ok != 16)
     46     printf("FAILED\n");
     47   else
     48     printf("OK\n");
     49 }
     50 
     51 void
     52 ltr_2(void)
     53 {
     54   int wrong, ok, v1;
     55 
     56   printf("Test #2  value > 0\n");
     57   v1 = 42;
     58   wrong = ok = 0;
     59   if (branch(0,  v1)) ++wrong; else ++ok;
     60   if (branch(1,  v1)) ++wrong; else ++ok;
     61   if (branch(2,  v1)) ++ok; else ++wrong;
     62   if (branch(3,  v1)) ++ok; else ++wrong;
     63   if (branch(4,  v1)) ++wrong; else ++ok;
     64   if (branch(5,  v1)) ++wrong; else ++ok;
     65   if (branch(6,  v1)) ++ok; else ++wrong;
     66   if (branch(7,  v1)) ++ok; else ++wrong;
     67   if (branch(8,  v1)) ++wrong; else ++ok;
     68   if (branch(9,  v1)) ++wrong; else ++ok;
     69   if (branch(10, v1)) ++ok; else ++wrong;
     70   if (branch(11, v1)) ++ok; else ++wrong;
     71   if (branch(12, v1)) ++wrong; else ++ok;
     72   if (branch(13, v1)) ++wrong; else ++ok;
     73   if (branch(14, v1)) ++ok; else ++wrong;
     74   if (branch(15, v1)) ++ok; else ++wrong;
     75 
     76   if (wrong != 0 || ok != 16)
     77     printf("FAILED\n");
     78   else
     79     printf("OK\n");
     80 }
     81 
     82 void
     83 ltr_3(void)
     84 {
     85   int wrong, ok, v1;
     86 
     87   printf("Test #3  value < 0\n");
     88 
     89   v1 = -100;
     90   wrong = ok = 0;
     91   if (branch(0,  v1)) ++wrong; else ++ok;
     92   if (branch(1,  v1)) ++wrong; else ++ok;
     93   if (branch(2,  v1)) ++wrong; else ++ok;
     94   if (branch(3,  v1)) ++wrong; else ++ok;
     95   if (branch(4,  v1)) ++ok; else ++wrong;
     96   if (branch(5,  v1)) ++ok; else ++wrong;
     97   if (branch(6,  v1)) ++ok; else ++wrong;
     98   if (branch(7,  v1)) ++ok; else ++wrong;
     99   if (branch(8,  v1)) ++wrong; else ++ok;
    100   if (branch(9,  v1)) ++wrong; else ++ok;
    101   if (branch(10, v1)) ++wrong; else ++ok;
    102   if (branch(11, v1)) ++wrong; else ++ok;
    103   if (branch(12, v1)) ++ok; else ++wrong;
    104   if (branch(13, v1)) ++ok; else ++wrong;
    105   if (branch(14, v1)) ++ok; else ++wrong;
    106   if (branch(15, v1)) ++ok; else ++wrong;
    107 
    108   if (wrong != 0 || ok != 16)
    109     printf("FAILED\n");
    110   else
    111     printf("OK\n");
    112 }
    113 
    114 int main()
    115 {
    116   ltr_1();
    117   ltr_2();
    118   ltr_3();
    119   return 0;
    120 }
    121