1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 /* Apparently the "b" register constraint is like "r" except that it
7 disallows the use of r0, which means it is safe to use in places
8 where the appearance of r0 would cause a problem due to it being
9 read as zero. */
10
announce(char * str)11 static void announce ( char* str )
12 {
13 printf("------ %s ------\n", str);
14 }
15
main(void)16 int main ( void )
17 {
18 int i;
19 char* a1 = malloc(100);
20 char* a2 = malloc(100);
21 strcpy(a1,"here is a stringHERE IS A STRING");
22
23 announce("lswi n == 8 (fe special cased)");
24 asm volatile("li 5,0\n\t"
25 "lswi 3,%0, 8\n\t"
26 "stw 3,0(%1)\n\t"
27 "stw 4,4(%1)\n\t"
28 "stw 5,8(%1)\n\t"
29 : : "b"(a1), "b"(a2) : "r3", "r4", "r5",
30 "cc", "memory" );
31 printf("%s\n", a2);
32 for (i = 0; i < 12; i++)
33 printf("%d = 0x%2x\n", i, a2[i]);
34 printf("\n");
35
36
37 announce("lswi n /= 8");
38 asm volatile("lswi 3,%0, 9\n\t"
39 "stw 3,0(%1)\n\t"
40 "stw 4,4(%1)\n\t"
41 "stw 5,8(%1)\n\t"
42 : : "b"(a1), "b"(a2) : "r3", "r4", "r5",
43 "cc", "memory" );
44 printf("%s\n", a2);
45 for (i = 0; i < 12; i++)
46 printf("%d = 0x%2x\n", i, a2[i]);
47 printf("\n");
48
49
50 announce("lswx");
51 free(a2);
52 a2 = malloc(100);
53 asm volatile("li 8, 11\n\t"
54 "mtxer 8\n\t"
55 "lswx 3,%0,%2\n\t"
56 "stw 3,0(%1)\n\t"
57 "stw 4,4(%1)\n\t"
58 "stw 5,8(%1)\n\t"
59 : : "b"(a1), "b"(a2), "b"(16) : "r3", "r4", "r5", "r8",
60 "cc", "memory" );
61 printf("%s\n", a2);
62 for (i = 0; i < 12; i++)
63 printf("%d = 0x%2x\n", i, a2[i]);
64 printf("\n");
65
66
67 announce("stswi n == 8 (fe special cased)");
68 free(a2);
69 a2 = calloc(100,1);
70 asm volatile("lswi 3,%0, 19\n\t"
71 "stswi 3,%1, 8\n"
72 : : "b"(a1), "b"(a2) : "r3","r4","r5","r6","r7",
73 "cc", "memory" );
74 printf("%s\n", a2);
75 printf("\n");
76
77
78 announce("stswi n /= 8");
79 free(a2);
80 a2 = calloc(100,1);
81 asm volatile("lswi 3,%0, 19\n\t"
82 "stswi 3,%1, 17\n"
83 : : "b"(a1), "b"(a2) : "r3","r4","r5","r6","r7",
84 "cc", "memory" );
85 printf("%s\n", a2);
86 printf("\n");
87
88
89 announce("stswx");
90 free(a2);
91 a2 = calloc(100,1);
92 asm volatile("li 8, 11\n\t"
93 "mtxer 8\n\t"
94 "lswx 3,%0,%2\n\t"
95 "stswx 3,%1,%2\n\t"
96 : : "b"(a1), "b"(a2), "b"(16) : "r3", "r4", "r5", "r8",
97 "cc", "memory" );
98 printf("%s\n", a2+16);
99 printf("\n");
100
101 return 0;
102 }
103