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