1b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "test.h"
2b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjchar buffer[24] ="0123456789abcdefghijklmn";
3b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjchar *buflong = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
4b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
5b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
6b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
7b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
8b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
9b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS%UVWXYZ0123456789_.,}[]";
10b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
11b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjstatic char * srst3(char *__next, char *__start, char __what, int *__cc)
12b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj{
13b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	register unsigned long what asm ("0") = __what;
14b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	register char *next asm ("2") = __next;
15b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	register char *start asm ("4") = __start;
16b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	int cc;
17b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
18b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	asm volatile(	"0: srst 2,4\n"
19b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"jo 0b\n"
20b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"ipm %2\n"
21b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"srl %2,28\n"
22b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			:"+d" (start), "+d" (next), "=d" (cc) :"d" (what): "cc");
23b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	*__cc = cc;
24b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	return next;
25b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
26b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
27b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjstatic char * srst2(char *__start, char __what,  int *__cc)
28b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj{
29b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	register unsigned long what asm ("0") = __what;
30b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	register char *start asm ("4") = __start;
31b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	int cc;
32b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
33b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	asm volatile(	"0: srst 0,4\n"
34b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"jo 0b\n"
35b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"ipm %2\n"
36b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			"srl %2,28\n"
37b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj			:"+d" (start), "+d" (what), "=d" (cc) :: "cc");
38b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	*__cc = cc;
39b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	return (char *) what;
40b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
41b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
42b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjint main()
43b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj{
44b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	char *buf;
45b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	int cc;
46b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
47b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
48b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	/* len=0 and start== next should not fault */
49b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	srst3((char *)0x12345678,(char *)0x12345678,'0', &cc);
50b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
51b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
52b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(&buffer[23], &buffer[23], '0', &cc);
53b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
54b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
55b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
56b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(&buffer[23], &buffer[0], '0', &cc);
57b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
58b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
59b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
60b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(&buffer[23], &buffer[0], 'a', &cc);
61b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
62b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
63b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
64b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(&buffer[23], &buffer[0], 'm', &cc);
65b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
66b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
67b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
68b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(&buffer[23], &buffer[0], 'n', &cc);
69b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
70b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
71b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
72b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst2(&buffer[0], '0', &cc);
73b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
74b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
75b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
76b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst2(&buffer[0], 'a', &cc);
77b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
78b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
79b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
80b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst2(&buffer[0], 'm', &cc);
81b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
82b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
83b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
84b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst2(&buffer[0], 'n', &cc);
85b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
86b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
87b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
88b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	buf = srst3(buflong + 469, buflong, '%', &cc);
89b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	dump_field(buf, 1);
90b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	printf("(cc=%d)\n", cc);
91b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	return 0;
92b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
93b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
94