#include "test.h"
char buffer[24] ="0123456789abcdefghijklmn";
char *buflong = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,}[]"
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS%UVWXYZ0123456789_.,}[]";

static char * srst3(char *__next, char *__start, char __what, int *__cc)
{
	register unsigned long what asm ("0") = __what;
	register char *next asm ("2") = __next;
	register char *start asm ("4") = __start;
	int cc;

	asm volatile(	"0: srst 2,4\n"
			"jo 0b\n"
			"ipm %2\n"
			"srl %2,28\n"
			:"+d" (start), "+d" (next), "=d" (cc) :"d" (what): "cc");
	*__cc = cc;
	return next;
}

static char * srst2(char *__start, char __what,  int *__cc)
{
	register unsigned long what asm ("0") = __what;
	register char *start asm ("4") = __start;
	int cc;

	asm volatile(	"0: srst 0,4\n"
			"jo 0b\n"
			"ipm %2\n"
			"srl %2,28\n"
			:"+d" (start), "+d" (what), "=d" (cc) :: "cc");
	*__cc = cc;
	return (char *) what;
}

int main()
{
	char *buf;
	int cc;


	/* len=0 and start== next should not fault */
	srst3((char *)0x12345678,(char *)0x12345678,'0', &cc);
	printf("(cc=%d)\n", cc);

	buf = srst3(&buffer[23], &buffer[23], '0', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst3(&buffer[23], &buffer[0], '0', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst3(&buffer[23], &buffer[0], 'a', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst3(&buffer[23], &buffer[0], 'm', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst3(&buffer[23], &buffer[0], 'n', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst2(&buffer[0], '0', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst2(&buffer[0], 'a', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst2(&buffer[0], 'm', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst2(&buffer[0], 'n', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);

	buf = srst3(buflong + 469, buflong, '%', &cc);
	dump_field(buf, 1);
	printf("(cc=%d)\n", cc);
	return 0;
}