xref: /openbmc/qemu/tests/tcg/s390x/vxeh2_vs.c (revision 3d54cbf2)
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 
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 
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 
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 
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 
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 
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