| #include <stdio.h> |
| #include <stdlib.h> |
| |
| char b1[23] ="0123456789abcdefghijklm"; |
| char b2[23] ="mlkjihgfedcba9876543210"; |
| char b3[23] ="mmmmmmmmmmmmmmmmmmmmmmm"; |
| char b4[23] ="00000000000000000000000"; |
| char longbuf1[256]; |
| char longbuf2[256]; |
| |
| static int clc(char *a1,char *a2, int l) |
| { |
| int cc; |
| |
| asm volatile( "larl 1, 1f\n" |
| "ex %3,0(1)\n" |
| "j 2f\n" |
| "1: clc 0(1,%1),0(%2)\n" |
| "2: ipm %0\n" |
| "srl %0,28\n" |
| :"=d" (cc) |
| :"a" (a1), "a" (a2), "d" (l): "1", "cc"); |
| return cc; |
| } |
| |
| |
| void testrun(char *a1, char *a2, int l) |
| { |
| int cc; |
| |
| cc = clc(a1, a2, l); |
| printf("%d bytes:%d\n",l, cc); |
| } |
| |
| |
| void multiplex(int l, long offset1, long offset2) |
| { |
| testrun(b1 + offset1, b1 + offset2, l); |
| testrun(b1 + offset1, b2 + offset2, l); |
| testrun(b1 + offset1, b3 + offset2, l); |
| testrun(b1 + offset1, b4 + offset2, l); |
| testrun(b2 + offset1, b2 + offset2, l); |
| testrun(b2 + offset1, b3 + offset2, l); |
| testrun(b2 + offset1, b4 + offset2, l); |
| testrun(b3 + offset1, b3 + offset2, l); |
| testrun(b3 + offset1, b4 + offset2, l); |
| testrun(b4 + offset1, b4 + offset2, l); |
| } |
| |
| void sweep(int l) |
| { |
| multiplex(l, 0, 0); |
| multiplex(l, 1, 0); |
| multiplex(l, 1, 1); |
| multiplex(l, 0, 1); |
| } |
| |
| int main() |
| { |
| sweep(0); |
| sweep(1); |
| sweep(2); |
| sweep(3); |
| sweep(4); |
| sweep(5); |
| sweep(22); |
| testrun(longbuf1, longbuf2, 255); |
| longbuf1[255] = 'a'; |
| testrun(longbuf1, longbuf2, 255); |
| longbuf2[255] = 'b'; |
| testrun(longbuf1, longbuf2, 255); |
| return 0; |
| } |
| |