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 11static void announce ( char* str ) 12{ 13 printf("------ %s ------\n", str); 14} 15 16int 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