]> Git Repo - qemu.git/blame - target/s390x/vec.h
s390x/tcg: Implement VECTOR FIND ELEMENT EQUAL
[qemu.git] / target / s390x / vec.h
CommitLineData
5b5d2090
DH
1/*
2 * QEMU TCG support -- s390x vector utilitites
3 *
4 * Copyright (C) 2019 Red Hat Inc
5 *
6 * Authors:
7 * David Hildenbrand <[email protected]>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
12#ifndef S390X_VEC_H
13#define S390X_VEC_H
14
15typedef union S390Vector {
16 uint64_t doubleword[2];
17 uint32_t word[4];
18 uint16_t halfword[8];
19 uint8_t byte[16];
20} S390Vector;
21
22/*
23 * Each vector is stored as two 64bit host values. So when talking about
24 * byte/halfword/word numbers, we have to take care of proper translation
25 * between element numbers.
26 *
27 * Big Endian (target/possible host)
28 * B: [ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7] - [ 8][ 9][10][11][12][13][14][15]
29 * HW: [ 0][ 1][ 2][ 3] - [ 4][ 5][ 6][ 7]
30 * W: [ 0][ 1] - [ 2][ 3]
31 * DW: [ 0] - [ 1]
32 *
33 * Little Endian (possible host)
34 * B: [ 7][ 6][ 5][ 4][ 3][ 2][ 1][ 0] - [15][14][13][12][11][10][ 9][ 8]
35 * HW: [ 3][ 2][ 1][ 0] - [ 7][ 6][ 5][ 4]
36 * W: [ 1][ 0] - [ 3][ 2]
37 * DW: [ 0] - [ 1]
38 */
39#ifndef HOST_WORDS_BIGENDIAN
40#define H1(x) ((x) ^ 7)
41#define H2(x) ((x) ^ 3)
42#define H4(x) ((x) ^ 1)
43#else
44#define H1(x) (x)
45#define H2(x) (x)
46#define H4(x) (x)
47#endif
48
49static inline uint8_t s390_vec_read_element8(const S390Vector *v, uint8_t enr)
50{
51 g_assert(enr < 16);
52 return v->byte[H1(enr)];
53}
54
55static inline uint16_t s390_vec_read_element16(const S390Vector *v, uint8_t enr)
56{
57 g_assert(enr < 8);
58 return v->halfword[H2(enr)];
59}
60
61static inline uint32_t s390_vec_read_element32(const S390Vector *v, uint8_t enr)
62{
63 g_assert(enr < 4);
64 return v->word[H4(enr)];
65}
66
67static inline uint64_t s390_vec_read_element64(const S390Vector *v, uint8_t enr)
68{
69 g_assert(enr < 2);
70 return v->doubleword[enr];
71}
72
73static inline void s390_vec_write_element8(S390Vector *v, uint8_t enr,
74 uint8_t data)
75{
76 g_assert(enr < 16);
77 v->byte[H1(enr)] = data;
78}
79
80static inline void s390_vec_write_element16(S390Vector *v, uint8_t enr,
81 uint16_t data)
82{
83 g_assert(enr < 8);
84 v->halfword[H2(enr)] = data;
85}
86
87static inline void s390_vec_write_element32(S390Vector *v, uint8_t enr,
88 uint32_t data)
89{
90 g_assert(enr < 4);
91 v->word[H4(enr)] = data;
92}
93
94static inline void s390_vec_write_element64(S390Vector *v, uint8_t enr,
95 uint64_t data)
96{
97 g_assert(enr < 2);
98 v->doubleword[enr] = data;
99}
100
101#endif /* S390X_VEC_H */
This page took 0.045421 seconds and 4 git commands to generate.