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