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