| #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; |
| } |
| |