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