1 /*
2 * vxeh2_vs: vector-enhancements facility 2 vector shift
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
vsl(S390Vector * v1,S390Vector * v2,S390Vector * v3)12 static inline void vsl(S390Vector *v1, S390Vector *v2, S390Vector *v3)
13 {
14 asm volatile("vsl %[v1], %[v2], %[v3]\n"
15 : [v1] "=v" (v1->v)
16 : [v2] "v" (v2->v)
17 , [v3] "v" (v3->v));
18 }
19
vsra(S390Vector * v1,S390Vector * v2,S390Vector * v3)20 static inline void vsra(S390Vector *v1, S390Vector *v2, S390Vector *v3)
21 {
22 asm volatile("vsra %[v1], %[v2], %[v3]\n"
23 : [v1] "=v" (v1->v)
24 : [v2] "v" (v2->v)
25 , [v3] "v" (v3->v));
26 }
27
vsrl(S390Vector * v1,S390Vector * v2,S390Vector * v3)28 static inline void vsrl(S390Vector *v1, S390Vector *v2, S390Vector *v3)
29 {
30 asm volatile("vsrl %[v1], %[v2], %[v3]\n"
31 : [v1] "=v" (v1->v)
32 : [v2] "v" (v2->v)
33 , [v3] "v" (v3->v));
34 }
35
vsld(S390Vector * v1,S390Vector * v2,S390Vector * v3,const uint8_t I)36 static inline void vsld(S390Vector *v1, S390Vector *v2,
37 S390Vector *v3, const uint8_t I)
38 {
39 asm volatile("vsld %[v1], %[v2], %[v3], %[I]\n"
40 : [v1] "=v" (v1->v)
41 : [v2] "v" (v2->v)
42 , [v3] "v" (v3->v)
43 , [I] "i" (I & 7));
44 }
45
vsrd(S390Vector * v1,S390Vector * v2,S390Vector * v3,const uint8_t I)46 static inline void vsrd(S390Vector *v1, S390Vector *v2,
47 S390Vector *v3, const uint8_t I)
48 {
49 asm volatile("vsrd %[v1], %[v2], %[v3], %[I]\n"
50 : [v1] "=v" (v1->v)
51 : [v2] "v" (v2->v)
52 , [v3] "v" (v3->v)
53 , [I] "i" (I & 7));
54 }
55
main(int argc,char * argv[])56 int main(int argc, char *argv[])
57 {
58 const S390Vector vt_vsl = { .d[0] = 0x7FEDBB32D5AA311Dull,
59 .d[1] = 0xBB65AA10912220C0ull };
60 const S390Vector vt_vsra = { .d[0] = 0xF1FE6E7399AA5466ull,
61 .d[1] = 0x0E762A5188221044ull };
62 const S390Vector vt_vsrl = { .d[0] = 0x11FE6E7399AA5466ull,
63 .d[1] = 0x0E762A5188221044ull };
64 const S390Vector vt_vsld = { .d[0] = 0x7F76EE65DD54CC43ull,
65 .d[1] = 0xBB32AA2199108838ull };
66 const S390Vector vt_vsrd = { .d[0] = 0x0E060802040E000Aull,
67 .d[1] = 0x0C060802040E000Aull };
68 S390Vector vs = { .d[0] = 0x8FEEDDCCBBAA9988ull,
69 .d[1] = 0x7766554433221107ull };
70 S390Vector vd = { .d[0] = 0, .d[1] = 0 };
71 S390Vector vsi = { .d[0] = 0, .d[1] = 0 };
72
73 for (int ix = 0; ix < 16; ix++) {
74 vsi.b[ix] = (1 + (5 ^ ~ix)) & 7;
75 }
76
77 vsl(&vd, &vs, &vsi);
78 vtst(vd, vt_vsl);
79
80 vsra(&vd, &vs, &vsi);
81 vtst(vd, vt_vsra);
82
83 vsrl(&vd, &vs, &vsi);
84 vtst(vd, vt_vsrl);
85
86 vsld(&vd, &vs, &vsi, 3);
87 vtst(vd, vt_vsld);
88
89 vsrd(&vd, &vs, &vsi, 15);
90 vtst(vd, vt_vsrd);
91
92 return 0;
93 }
94