Home | History | Annotate | Download | only in s390x
      1 #include <stdio.h>
      2 #include <ctype.h>
      3 #include "test.h"
      4 
      5 #define LOOPBACK "jo 0b	\n\t"
      6 
      7 typedef struct {
      8    const char *str1;
      9    const char *str2;
     10    int cc;
     11 } clst_t;
     12 
     13 static clst_t
     14 do_clst(const char *__string1, const char *__string2, char __end)
     15 {
     16    register char end asm ("0") = __end;
     17    register const char *string1 asm ("2") = __string1;
     18    register const char *string2 asm ("4") = __string2;
     19 
     20    asm volatile( "0: clst 2,4\n\t"
     21                  LOOPBACK
     22                  :"+d" (string1), "+d" (string2) :"d" (end): "cc");
     23 
     24    return (clst_t) { .str1 = string1, .str2 = string2, .cc = get_cc() };
     25 }
     26 
     27 void
     28 clst(const char *str1, const char *str2, int sentinel)
     29 {
     30    clst_t res;
     31 
     32    printf("comparing: %s with %s   sentinel = %d", str1, str2, sentinel);
     33    if (isprint(sentinel))
     34       printf(" (%c)", sentinel);
     35    printf("\n");
     36    res = do_clst(str1, str2, sentinel);
     37    printf("str1 = %s\nstr2 = %s\ncc = %d\n", res.str1, res.str2, res.cc);
     38    printf("\n");
     39 }
     40 
     41 int main(void)
     42 {
     43    clst("lower123",  "lowerabc",  '\0');
     44    clst("higher234", "higher123", '\0');
     45    clst("equal",  "equal",  '\0');
     46 
     47    clst("equal",  "equallong",  '\0');
     48    clst("equallong",  "equal",  '\0');
     49 
     50    clst("lower1",  "lower2",  'w');   // will compare equal
     51 
     52    return 0;
     53 }
     54