1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar base[] ="0123456789012345678901234567890123456789";
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstmg_no_wrap(void)
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   char buf[24];
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* No-wrap around case; copies 24 bytes from BASE to BUF */
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lg   5,  0(%1)\n\t"
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lg   6,  8(%1)\n\t"
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lg   7, 16(%1)\n\t"
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "stmg 5, 7, %0\n\t"
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 :"=m" (buf)
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "a" (base)
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "5", "6", "7");
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Write out BUF */
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 2, 1\n\t"   // stdout
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"  // buf
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, 24\n\t"  // len = 3*8 bytes
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  4\n\t"
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (buf)
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "2", "3", "4");
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstmg_wrap(void)
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   char buf[64];
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Wrap around case; copies 32 bytes from BASE to BUF */
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lg   15,  0(%1)\n\t"
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lg    0,  8(%1)\n\t"
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lg    1, 16(%1)\n\t"
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lg    2, 24(%1)\n\t"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "stmg 15, 2, %0\n\t"
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 :"=m" (buf)
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "a" (base)
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "15", "0", "1", "2");
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Write out BUF */
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "lghi 2, 1\n\t"   // stdout
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lgr  3, %0\n\t"  // buf
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "lghi 4, 32\n\t"  // len = 4*8 bytes
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "svc  4\n\t"
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : : "a" (buf)
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "2", "3", "4");
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void)
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmg_no_wrap();
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmg_wrap();
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
60