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