Home | History | Annotate | Download | only in ppc64
      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 
     11 static void announce ( char* str )
     12 {
     13    printf("------ %s ------\n", str);
     14 }
     15 
     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