lsw.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
1c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
2c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#include <stdio.h>
3c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#include <stdlib.h>
4c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#include <string.h>
5c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
6c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org/* Apparently the "b" register constraint is like "r" except that it
7c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org   disallows the use of r0, which means it is safe to use in places
8c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org   where the appearance of r0 would cause a problem due to it being
9c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org   read as zero. */
10c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
11c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgstatic void announce ( char* str )
12c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org{
13c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org   printf("------ %s ------\n", str);
14c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org}
15c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
16c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgint main ( void )
17c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org{
18c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  int i;
19c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  char* a1 = malloc(100);
20c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  char* a2 = malloc(100);
21c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  strcpy(a1,"here is a stringHERE IS A STRING");
22c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
23c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  announce("lswi n == 8 (fe special cased)");
24c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  asm volatile("li 5,0\n\t"
25c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "lswi 3,%0, 8\n\t"
26c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 3,0(%1)\n\t"
27c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 4,4(%1)\n\t"
28c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 5,8(%1)\n\t"
29c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               : : "b"(a1), "b"(a2) : "r3", "r4", "r5",
30c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                                      "cc", "memory" );
31c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("%s\n", a2);
32c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  for (i = 0; i < 12; i++)
33c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    printf("%d = 0x%2x\n", i, a2[i]);
34c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("\n");
35c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
36c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
37c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  announce("lswi n /= 8");
38c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  asm volatile("lswi 3,%0, 9\n\t"
39c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 3,0(%1)\n\t"
40c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 4,4(%1)\n\t"
41c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 5,8(%1)\n\t"
42c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               : : "b"(a1), "b"(a2) : "r3", "r4", "r5",
43c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                                      "cc", "memory" );
44c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("%s\n", a2);
45c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  for (i = 0; i < 12; i++)
46c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    printf("%d = 0x%2x\n", i, a2[i]);
47c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("\n");
48c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
49c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
50c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  announce("lswx");
51c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  free(a2);
52c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  a2 = malloc(100);
53c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  asm volatile("li  8, 11\n\t"
54c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "mtxer 8\n\t"
55c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "lswx 3,%0,%2\n\t"
56c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 3,0(%1)\n\t"
57c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 4,4(%1)\n\t"
58c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               "stw 5,8(%1)\n\t"
59c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org               : : "b"(a1), "b"(a2), "b"(16) : "r3", "r4", "r5", "r8",
60c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                                               "cc", "memory" );
61c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("%s\n", a2);
62c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  for (i = 0; i < 12; i++)
63c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org     printf("%d = 0x%2x\n", i, a2[i]);
64c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  printf("\n");
65c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
66c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
67c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  announce("stswi n == 8 (fe special cased)");
68c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  free(a2);
69c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  a2 = calloc(100,1);
70c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  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