Home | History | Annotate | Download | only in s390x
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 char b1[23] ="0123456789abcdefghijklm";
      5 char b2[23] ="mlkjihgfedcba9876543210";
      6 char b3[23] ="mmmmmmmmmmmmmmmmmmmmmmm";
      7 char b4[23] ="00000000000000000000000";
      8 char longbuf[17000000];
      9 
     10 static int clcle(unsigned long *_a1, unsigned long *_l1, unsigned long *_a3, unsigned long *_l3, char _pad)
     11 {
     12 	register unsigned long a1 asm ("2") = *_a1;
     13 	register unsigned long l1 asm ("3") = *_l1;
     14 	register unsigned long a3 asm ("4") = *_a3;
     15 	register unsigned long l3 asm ("5") = *_l3;
     16 	register unsigned long pad asm ("6") = _pad;
     17 	register unsigned long cc asm ("7");
     18 
     19 	asm volatile(	"0: clcle 2,4,0(6)\n\t"
     20 			"jo 0b\n\t"
     21 			"ipm %0\n\t"
     22 			"srl %0,28\n\t"
     23 			:"=d" (cc), "+d" (a1),"+d" (l1), "+d" (a3), "+d" (l3)
     24 			: "d" (pad)
     25 			: "memory", "cc");
     26 	*_a1 = a1;
     27 	*_a3 = a3;
     28 	*_l1 = l1;
     29 	*_l3 = l3;
     30 
     31 	return cc;
     32 }
     33 
     34 
     35 void testrun(void *_a1, unsigned long _l1, void *_a3, unsigned long _l3, char pad)
     36 {
     37 	unsigned long a1,a3,l1,l3;
     38 	int cc;
     39 
     40 	a1 = (unsigned long) _a1; l1 = _l1; a3 = (unsigned long) _a3; l3 = _l3;
     41 	cc = clcle(&a1, &l1,  &a3, &l3, pad);
     42 	printf("cc: %d, l1: %lu(%lu) l3: %lu(%lu) diff1: %lu diff3: %lu\n",
     43                 cc, l1, _l1, l3, _l3, a1-(unsigned long) _a1, a3-(unsigned long) _a3);
     44 }
     45 
     46 
     47 void multiplex(unsigned long l1, unsigned long l3, char pad)
     48 {
     49 	testrun(b1, l1, b1, l3, pad);
     50 	testrun(b1, l1, b2, l3, pad);
     51 	testrun(b1, l1, b3, l3, pad);
     52 	testrun(b1, l1, b4, l3, pad);
     53 	testrun(b2, l1, b2, l3, pad);
     54 	testrun(b2, l1, b3, l3, pad);
     55 	testrun(b2, l1, b4, l3, pad);
     56 	testrun(b3, l1, b3, l3, pad);
     57 	testrun(b3, l1, b4, l3, pad);
     58 	testrun(b4, l1, b4, l3, pad);
     59 }
     60 
     61 int main()
     62 {
     63 	multiplex(0,0,9);
     64 	multiplex(1,0,9);
     65 	multiplex(0,1,9);
     66 	multiplex(1,1,9);
     67 	multiplex(5,23,9);
     68 	multiplex(23,5,9);
     69 	testrun(longbuf,10000,longbuf,100000,0);
     70 	testrun(longbuf,10000,longbuf,100000,128);
     71 	testrun(longbuf,10000,longbuf,100000,255);
     72 	exit(0);
     73 }
     74 
     75