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