| 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 | } |