1 #include <unistd.h>
2 
3 char base[] ="0123456789012345678901234567890123456789";
4 
5 void
stmg_no_wrap(void)6 stmg_no_wrap(void)
7 {
8    char buf[24];
9 
10    /* No-wrap around case; copies 24 bytes from BASE to BUF */
11    asm volatile( "lg   5,  0(%1)\n\t"
12                  "lg   6,  8(%1)\n\t"
13                  "lg   7, 16(%1)\n\t"
14                  "stmg 5, 7, %0\n\t"
15                  :"=m" (buf)
16                  : "a" (base)
17                  : "5", "6", "7");
18    /* Write out BUF */
19    asm volatile( "lghi 2, 1\n\t"   // stdout
20                  "lgr  3, %0\n\t"  // buf
21                  "lghi 4, 24\n\t"  // len = 3*8 bytes
22                  "svc  4\n\t"
23                  : : "a" (buf)
24                  : "2", "3", "4");
25 }
26 
27 void
stmg_wrap(void)28 stmg_wrap(void)
29 {
30    char buf[64];
31 
32    /* Wrap around case; copies 32 bytes from BASE to BUF */
33    asm volatile( "lg   15,  0(%1)\n\t"
34                  "lg    0,  8(%1)\n\t"
35                  "lg    1, 16(%1)\n\t"
36                  "lg    2, 24(%1)\n\t"
37                  "stmg 15, 2, %0\n\t"
38                  :"=m" (buf)
39                  : "a" (base)
40                  : "15", "0", "1", "2");
41    /* Write out BUF */
42    asm volatile( "lghi 2, 1\n\t"   // stdout
43                  "lgr  3, %0\n\t"  // buf
44                  "lghi 4, 32\n\t"  // len = 4*8 bytes
45                  "svc  4\n\t"
46                  : : "a" (buf)
47                  : "2", "3", "4");
48 }
49 
50 
main(void)51 int main(void)
52 {
53    stmg_no_wrap();
54    write(1, "\n", 1);
55    stmg_wrap();
56    write(1, "\n", 1);
57 
58    return 0;
59 }
60