1 /*
2 * vxeh2_vlstr: vector-enhancements facility 2 vector load/store reversed *
3 */
4 #include <stdint.h>
5 #include "vx.h"
6
7 #define vtst(v1, v2) \
8 if (v1.d[0] != v2.d[0] || v1.d[1] != v2.d[1]) { \
9 return 1; \
10 }
11
vler(S390Vector * v1,const void * va,uint8_t m3)12 static inline void vler(S390Vector *v1, const void *va, uint8_t m3)
13 {
14 asm volatile("vler %[v1], 0(%[va]), %[m3]\n"
15 : [v1] "+v" (v1->v)
16 : [va] "a" (va)
17 , [m3] "i" (m3)
18 : "memory");
19 }
20
vster(S390Vector * v1,const void * va,uint8_t m3)21 static inline void vster(S390Vector *v1, const void *va, uint8_t m3)
22 {
23 asm volatile("vster %[v1], 0(%[va]), %[m3]\n"
24 : [va] "+a" (va)
25 : [v1] "v" (v1->v)
26 , [m3] "i" (m3)
27 : "memory");
28 }
29
vlbr(S390Vector * v1,void * va,const uint8_t m3)30 static inline void vlbr(S390Vector *v1, void *va, const uint8_t m3)
31 {
32 asm volatile("vlbr %[v1], 0(%[va]), %[m3]\n"
33 : [v1] "+v" (v1->v)
34 : [va] "a" (va)
35 , [m3] "i" (m3)
36 : "memory");
37 }
38
vstbr(S390Vector * v1,void * va,const uint8_t m3)39 static inline void vstbr(S390Vector *v1, void *va, const uint8_t m3)
40 {
41 asm volatile("vstbr %[v1], 0(%[va]), %[m3]\n"
42 : [va] "+a" (va)
43 : [v1] "v" (v1->v)
44 , [m3] "i" (m3)
45 : "memory");
46 }
47
48
vlebrh(S390Vector * v1,void * va,const uint8_t m3)49 static inline void vlebrh(S390Vector *v1, void *va, const uint8_t m3)
50 {
51 asm volatile("vlebrh %[v1], 0(%[va]), %[m3]\n"
52 : [v1] "+v" (v1->v)
53 : [va] "a" (va)
54 , [m3] "i" (m3)
55 : "memory");
56 }
57
vstebrh(S390Vector * v1,void * va,const uint8_t m3)58 static inline void vstebrh(S390Vector *v1, void *va, const uint8_t m3)
59 {
60 asm volatile("vstebrh %[v1], 0(%[va]), %[m3]\n"
61 : [va] "+a" (va)
62 : [v1] "v" (v1->v)
63 , [m3] "i" (m3)
64 : "memory");
65 }
66
vllebrz(S390Vector * v1,void * va,const uint8_t m3)67 static inline void vllebrz(S390Vector *v1, void *va, const uint8_t m3)
68 {
69 asm volatile("vllebrz %[v1], 0(%[va]), %[m3]\n"
70 : [v1] "+v" (v1->v)
71 : [va] "a" (va)
72 , [m3] "i" (m3)
73 : "memory");
74 }
75
vlbrrep(S390Vector * v1,void * va,const uint8_t m3)76 static inline void vlbrrep(S390Vector *v1, void *va, const uint8_t m3)
77 {
78 asm volatile("vlbrrep %[v1], 0(%[va]), %[m3]\n"
79 : [v1] "+v" (v1->v)
80 : [va] "a" (va)
81 , [m3] "i" (m3)
82 : "memory");
83 }
84
main(int argc,char * argv[])85 int main(int argc, char *argv[])
86 {
87 S390Vector vd = { .d[0] = 0, .d[1] = 0 };
88 S390Vector vs = { .d[0] = 0x8FEEDDCCBBAA9988ull,
89 .d[1] = 0x7766554433221107ull };
90
91 const S390Vector vt_v_er16 = {
92 .h[0] = 0x1107, .h[1] = 0x3322, .h[2] = 0x5544, .h[3] = 0x7766,
93 .h[4] = 0x9988, .h[5] = 0xBBAA, .h[6] = 0xDDCC, .h[7] = 0x8FEE };
94
95 const S390Vector vt_v_br16 = {
96 .h[0] = 0xEE8F, .h[1] = 0xCCDD, .h[2] = 0xAABB, .h[3] = 0x8899,
97 .h[4] = 0x6677, .h[5] = 0x4455, .h[6] = 0x2233, .h[7] = 0x0711 };
98
99 int ix;
100 uint64_t ss64 = 0xFEEDFACE0BADBEEFull, sd64 = 0;
101
102 vler(&vd, &vs, ES16);
103 vtst(vd, vt_v_er16);
104
105 vster(&vs, &vd, ES16);
106 vtst(vd, vt_v_er16);
107
108 vlbr(&vd, &vs, ES16);
109 vtst(vd, vt_v_br16);
110
111 vstbr(&vs, &vd, ES16);
112 vtst(vd, vt_v_br16);
113
114 vlebrh(&vd, &ss64, 5);
115 if (0xEDFE != vd.h[5]) {
116 return 1;
117 }
118
119 vstebrh(&vs, (uint8_t *)&sd64 + 4, 7);
120 if (0x0000000007110000ull != sd64) {
121 return 1;
122 }
123
124 vllebrz(&vd, (uint8_t *)&ss64 + 3, 2);
125 for (ix = 0; ix < 4; ix++) {
126 if (vd.w[ix] != (ix != 1 ? 0 : 0xBEAD0BCE)) {
127 return 1;
128 }
129 }
130
131 vlbrrep(&vd, (uint8_t *)&ss64 + 4, 1);
132 for (ix = 0; ix < 8; ix++) {
133 if (0xAD0B != vd.h[ix]) {
134 return 1;
135 }
136 }
137
138 return 0;
139 }
140