1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h> 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <assert.h> 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <string.h> 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar buffer[] = "0123456789abcdefXXXXX"; 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar target[] = "---------------------"; 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar overlap[]= "012345678901234567890"; 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar full[300]; 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void) 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int i; 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Normal copy */ 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("------- Copy 17 bytes from BUFFER to TARGET\n"); 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("before: buffer = |%s|\n", buffer); 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("before: target = |%s|\n", target); 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile( "mvc 0(17,%0),0(%1)\n" 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ::"a" (target),"a" (buffer): "memory"); 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("after: buffer = |%s|\n", buffer); 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("after: target = |%s|\n", target); 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("\n"); 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Destructive overlap #1 */ 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("------- Destructive overlap #1\n"); 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("before: |%s|\n", overlap); 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile( "mvc 1(17,%0),0(%1)\n" 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ::"a" (overlap),"a" (overlap): "memory"); 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("after: |%s|\n", overlap); 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Destructive overlap #2 */ 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("------- Destructive overlap #2\n"); 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov memset(target, '-', sizeof target - 1); // restore initial state 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("before: target = |%s|\n", target); 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile( "mvi 0(%0),'x'\n\t" // target[1] = 'x' 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mvc 1(2,%0),0(%0)\n\t" // target[2:3] = target[1] 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov :: "a" (target+1)); 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("after: target = |%s|\n", target); 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Destructive overlap #3 */ 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("------- Destructive overlap #3 (max length)\n"); 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov memset(full, '-', sizeof full); 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov full[0] = 'x'; 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile( "mvc 1(256,%0),0(%0)\n\t" // full[1:256] = full[0] 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov :: "a" (full)); 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Verify: the first 256+1 characters should be 'x' followed by '-' */ 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 0; i <= 256; ++i) 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov assert(full[i] == 'x'); 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ( ; i < sizeof full; ++i) 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov assert(full[i] == '-'); 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("\n"); 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Non-destructive overlap */ 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("------- Non-destructive overlap buf[0:4] = buf[10:14]\n"); 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov char buf[] = "0123456789abcde"; 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("before: buf = |%s|\n", buf); 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile( "mvc 0(5,%0),10(%1)\n" 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ::"a" (buf),"a" (buf): "memory"); 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("after: buf = |%s|\n", buf); 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 63