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 long b1 = _v1;                        \
      7         unsigned long b2 = _v2;                        \
      8         asm volatile("     slgr %[b1],%[b2]\n\t"       \
      9                      "     brc  " #mask " ,1f\n\t"     \
     10                      "     mvi  %[taken],0\n\t"        \
     11                      "     j    0f\n\t"                \
     12                      "1:   mvi  %[taken],1\n\t"        \
     13                      "0:   bcr 0,0 /* nop */\n\t"      \
     14              : [taken] "=Q" (taken), [b1] "+d"(b1)     \
     15              : [b2] "d"(b2)                            \
     16              : "cc");                                  \
     17         taken;                                         \
     18    })
     19 
     20 
     21 /* cc = (op1 == op2) ? 2
     22                      : (op1 > op2) ? 3 : 1; */
     23 
     24 
     25 void
     26 slgr_equal(void)
     27 {
     28    unsigned long v1, v2;
     29    int wrong, ok;
     30 
     31    printf("Test #1  op1 == op2\n");
     32 
     33    v1 = v2 = 42;
     34    wrong = ok = 0;
     35 
     36    if (branch(0,  v1, v2)) ++wrong; else ++ok;
     37    if (branch(1,  v1, v2)) ++wrong; else ++ok;
     38    if (branch(2,  v1, v2)) ++ok; else ++wrong;
     39    if (branch(3,  v1, v2)) ++ok; else ++wrong;
     40    if (branch(4,  v1, v2)) ++wrong; else ++ok;
     41    if (branch(5,  v1, v2)) ++wrong; else ++ok;
     42    if (branch(6,  v1, v2)) ++ok; else ++wrong;
     43    if (branch(7,  v1, v2)) ++ok; else ++wrong;
     44    if (branch(8,  v1, v2)) ++wrong; else ++ok;
     45    if (branch(9,  v1, v2)) ++wrong; else ++ok;
     46    if (branch(10, v1, v2)) ++ok; else ++wrong;
     47    if (branch(11, v1, v2)) ++ok; else ++wrong;
     48    if (branch(12, v1, v2)) ++wrong; else ++ok;
     49    if (branch(13, v1, v2)) ++wrong; else ++ok;
     50    if (branch(14, v1, v2)) ++ok; else ++wrong;
     51    if (branch(15, v1, v2)) ++ok; else ++wrong;
     52 
     53    if (wrong != 0 || ok != 16)
     54       printf("FAILED\n");
     55    else
     56       printf("OK\n");
     57 }
     58 
     59 void
     60 slgr_less(void)
     61 {
     62    unsigned long v1, v2;
     63    int wrong, ok;
     64 
     65    printf("Test #2  op1 < op2\n");
     66 
     67    v1 = 100;
     68    v2 = 1000;
     69 
     70    wrong = ok = 0;
     71 
     72    if (branch(0,  v1, v2)) ++wrong; else ++ok;
     73    if (branch(1,  v1, v2)) ++wrong; else ++ok;
     74    if (branch(2,  v1, v2)) ++wrong; else ++ok;
     75    if (branch(3,  v1, v2)) ++wrong; else ++ok;
     76    if (branch(4,  v1, v2)) ++ok; else ++wrong;
     77    if (branch(5,  v1, v2)) ++ok; else ++wrong;
     78    if (branch(6,  v1, v2)) ++ok; else ++wrong;
     79    if (branch(7,  v1, v2)) ++ok; else ++wrong;
     80    if (branch(8,  v1, v2)) ++wrong; else ++ok;
     81    if (branch(9,  v1, v2)) ++wrong; else ++ok;
     82    if (branch(10, v1, v2)) ++wrong; else ++ok;
     83    if (branch(11, v1, v2)) ++wrong; else ++ok;
     84    if (branch(12, v1, v2)) ++ok; else ++wrong;
     85    if (branch(13, v1, v2)) ++ok; else ++wrong;
     86    if (branch(14, v1, v2)) ++ok; else ++wrong;
     87    if (branch(15, v1, v2)) ++ok; else ++wrong;
     88 
     89    if (wrong != 0 /* || ok != 16 */)
     90       printf("FAILED\n");
     91    else
     92       printf("OK\n");
     93 }
     94 
     95 void
     96 slgr_greater(void)
     97 {
     98    unsigned long v1, v2;
     99    int wrong, ok;
    100 
    101    printf("Test #3  op1 > op2\n");
    102 
    103    v1 = 10000;
    104    v2 = 1000;
    105 
    106    wrong = ok = 0;
    107 
    108    if (branch(0,  v1, v2)) ++wrong; else ++ok;
    109    if (branch(1,  v1, v2)) ++ok; else ++wrong;
    110    if (branch(2,  v1, v2)) ++wrong; else ++ok;
    111    if (branch(3,  v1, v2)) ++ok; else ++wrong;
    112    if (branch(4,  v1, v2)) ++wrong; else ++ok;
    113    if (branch(5,  v1, v2)) ++ok; else ++wrong;
    114    if (branch(6,  v1, v2)) ++wrong; else ++ok;
    115    if (branch(7,  v1, v2)) ++ok; else ++wrong;
    116    if (branch(8,  v1, v2)) ++wrong; else ++ok;
    117    if (branch(9,  v1, v2)) ++ok; else ++wrong;
    118    if (branch(10, v1, v2)) ++wrong; else ++ok;
    119    if (branch(11, v1, v2)) ++ok; else ++wrong;
    120    if (branch(12, v1, v2)) ++wrong; else ++ok;
    121    if (branch(13, v1, v2)) ++ok; else ++wrong;
    122    if (branch(14, v1, v2)) ++wrong; else ++ok;
    123    if (branch(15, v1, v2)) ++ok; else ++wrong;
    124 
    125    if (wrong != 0 || ok != 16)
    126       printf("FAILED\n");
    127    else
    128       printf("OK\n");
    129 }
    130 
    131 int main()
    132 {
    133    slgr_equal();
    134    slgr_less();
    135    slgr_greater();
    136 
    137    return 0;
    138 }
    139