florian | 9768109 | 2012-10-07 04:00:48 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <assert.h> |
| 3 | #include <string.h> |
| 4 | |
| 5 | char buffer[] = "0123456789abcdefXXXXX"; |
| 6 | char target[] = "---------------------"; |
| 7 | char overlap[]= "012345678901234567890"; |
| 8 | char full[300]; |
| 9 | |
| 10 | int main(void) |
| 11 | { |
| 12 | int i; |
| 13 | |
| 14 | /* Normal copy */ |
| 15 | printf("------- Copy 17 bytes from BUFFER to TARGET\n"); |
| 16 | printf("before: buffer = |%s|\n", buffer); |
| 17 | printf("before: target = |%s|\n", target); |
| 18 | asm volatile( "mvc 0(17,%0),0(%1)\n" |
| 19 | ::"a" (target),"a" (buffer): "memory"); |
| 20 | printf("after: buffer = |%s|\n", buffer); |
| 21 | printf("after: target = |%s|\n", target); |
| 22 | printf("\n"); |
| 23 | |
| 24 | /* Destructive overlap #1 */ |
| 25 | printf("------- Destructive overlap #1\n"); |
| 26 | printf("before: |%s|\n", overlap); |
| 27 | asm volatile( "mvc 1(17,%0),0(%1)\n" |
| 28 | ::"a" (overlap),"a" (overlap): "memory"); |
| 29 | printf("after: |%s|\n", overlap); |
| 30 | |
| 31 | /* Destructive overlap #2 */ |
| 32 | printf("------- Destructive overlap #2\n"); |
| 33 | memset(target, '-', sizeof target - 1); // restore initial state |
| 34 | printf("before: target = |%s|\n", target); |
| 35 | asm volatile( "mvi 0(%0),'x'\n\t" // target[1] = 'x' |
| 36 | "mvc 1(2,%0),0(%0)\n\t" // target[2:3] = target[1] |
| 37 | :: "a" (target+1)); |
| 38 | printf("after: target = |%s|\n", target); |
| 39 | |
| 40 | /* Destructive overlap #3 */ |
| 41 | printf("------- Destructive overlap #3 (max length)\n"); |
| 42 | memset(full, '-', sizeof full); |
| 43 | full[0] = 'x'; |
| 44 | asm volatile( "mvc 1(256,%0),0(%0)\n\t" // full[1:256] = full[0] |
| 45 | :: "a" (full)); |
| 46 | /* Verify: the first 256+1 characters should be 'x' followed by '-' */ |
| 47 | for (i = 0; i <= 256; ++i) |
| 48 | assert(full[i] == 'x'); |
| 49 | for ( ; i < sizeof full; ++i) |
| 50 | assert(full[i] == '-'); |
| 51 | printf("\n"); |
| 52 | |
| 53 | /* Non-destructive overlap */ |
| 54 | printf("------- Non-destructive overlap buf[0:4] = buf[10:14]\n"); |
| 55 | char buf[] = "0123456789abcde"; |
| 56 | printf("before: buf = |%s|\n", buf); |
| 57 | asm volatile( "mvc 0(5,%0),10(%1)\n" |
| 58 | ::"a" (buf),"a" (buf): "memory"); |
| 59 | printf("after: buf = |%s|\n", buf); |
| 60 | |
| 61 | return 0; |
| 62 | } |