You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.7 KiB
102 lines
2.7 KiB
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
/* Apparently the "b" register constraint is like "r" except that it |
|
disallows the use of r0, which means it is safe to use in places |
|
where the appearance of r0 would cause a problem due to it being |
|
read as zero. */ |
|
|
|
static void announce ( char* str ) |
|
{ |
|
printf("------ %s ------\n", str); |
|
} |
|
|
|
int main ( void ) |
|
{ |
|
int i; |
|
char* a1 = malloc(100); |
|
char* a2 = malloc(100); |
|
strcpy(a1,"here is a stringHERE IS A STRING"); |
|
|
|
announce("lswi n == 8 (fe special cased)"); |
|
asm volatile("li 5,0\n\t" |
|
"lswi 3,%0, 8\n\t" |
|
"stw 3,0(%1)\n\t" |
|
"stw 4,4(%1)\n\t" |
|
"stw 5,8(%1)\n\t" |
|
: : "b"(a1), "b"(a2) : "r3", "r4", "r5", |
|
"cc", "memory" ); |
|
printf("%s\n", a2); |
|
for (i = 0; i < 12; i++) |
|
printf("%d = 0x%2x\n", i, a2[i]); |
|
printf("\n"); |
|
|
|
|
|
announce("lswi n /= 8"); |
|
asm volatile("lswi 3,%0, 9\n\t" |
|
"stw 3,0(%1)\n\t" |
|
"stw 4,4(%1)\n\t" |
|
"stw 5,8(%1)\n\t" |
|
: : "b"(a1), "b"(a2) : "r3", "r4", "r5", |
|
"cc", "memory" ); |
|
printf("%s\n", a2); |
|
for (i = 0; i < 12; i++) |
|
printf("%d = 0x%2x\n", i, a2[i]); |
|
printf("\n"); |
|
|
|
|
|
announce("lswx"); |
|
free(a2); |
|
a2 = malloc(100); |
|
asm volatile("li 8, 11\n\t" |
|
"mtxer 8\n\t" |
|
"lswx 3,%0,%2\n\t" |
|
"stw 3,0(%1)\n\t" |
|
"stw 4,4(%1)\n\t" |
|
"stw 5,8(%1)\n\t" |
|
: : "b"(a1), "b"(a2), "b"(16) : "r3", "r4", "r5", "r8", |
|
"cc", "memory" ); |
|
printf("%s\n", a2); |
|
for (i = 0; i < 12; i++) |
|
printf("%d = 0x%2x\n", i, a2[i]); |
|
printf("\n"); |
|
|
|
|
|
announce("stswi n == 8 (fe special cased)"); |
|
free(a2); |
|
a2 = calloc(100,1); |
|
asm volatile("lswi 3,%0, 19\n\t" |
|
"stswi 3,%1, 8\n" |
|
: : "b"(a1), "b"(a2) : "r3","r4","r5","r6","r7", |
|
"cc", "memory" ); |
|
printf("%s\n", a2); |
|
printf("\n"); |
|
|
|
|
|
announce("stswi n /= 8"); |
|
free(a2); |
|
a2 = calloc(100,1); |
|
asm volatile("lswi 3,%0, 19\n\t" |
|
"stswi 3,%1, 17\n" |
|
: : "b"(a1), "b"(a2) : "r3","r4","r5","r6","r7", |
|
"cc", "memory" ); |
|
printf("%s\n", a2); |
|
printf("\n"); |
|
|
|
|
|
announce("stswx"); |
|
free(a2); |
|
a2 = calloc(100,1); |
|
asm volatile("li 8, 11\n\t" |
|
"mtxer 8\n\t" |
|
"lswx 3,%0,%2\n\t" |
|
"stswx 3,%1,%2\n\t" |
|
: : "b"(a1), "b"(a2), "b"(16) : "r3", "r4", "r5", "r8", |
|
"cc", "memory" ); |
|
printf("%s\n", a2+16); |
|
printf("\n"); |
|
|
|
return 0; |
|
}
|
|
|