@samitouri / QOSamiQemu / commits / a8af0fb24d

include/tcg/tcg-op: extract memory operations to tcg-op-mem.h

This new header defines a new type for target virtual address, independent from TCGv and is parameterized by a new define TCG_ADDRESS_BITS (name was suggested by Paolo instead of TARGET_ADDRESS_BITS). By default, tcg-op.h include set this define to TARGET_LONG_BITS, but it's also possible to include only tcg-op-common.h and tcg-op-mem.h and set TCG_ADDRESS_BITS manually, which is what next commits will do. We preserve existing MIT license when extracting this new header. Implemented from: https://lore.kernel.org/qemu-devel/a68321f0-3d54-4909-864c-9793cda05b2a@linaro.org/ Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-id: 20260407222208.271838-2-pierrick.bouvier@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Pierrick Bouvier committed Apr 23, 2026 at 10:24 UTC a8af0fb24dae7323284e39e2104f762ab47126ab
2 files changed +129 -97
include/tcg/tcg-op-mem.h new
+126
@@ -0,0 +1,126 @@
1 +/* SPDX-License-Identifier: MIT */
2 +/*
3 + * Target dependent memory related functions.
4 + *
5 + * Copyright (c) 2008 Fabrice Bellard
6 + */
7 +
8 +#ifndef TCG_TCG_OP_MEM_H
9 +#define TCG_TCG_OP_MEM_H
10 +
11 +#ifndef TCG_ADDRESS_BITS
12 +#error TCG_ADDRESS_BITS must be defined
13 +#endif
14 +
15 +#if TCG_ADDRESS_BITS == 32
16 +typedef TCGv_i32 TCGv_va;
17 +#define TCG_TYPE_VA TCG_TYPE_I32
18 +#define tcgv_va_temp tcgv_i32_temp
19 +#define tcgv_va_temp_new tcg_temp_new_i32
20 +#elif TCG_ADDRESS_BITS == 64
21 +typedef TCGv_i64 TCGv_va;
22 +#define TCG_TYPE_VA TCG_TYPE_I64
23 +#define tcgv_va_temp tcgv_i64_temp
24 +#define tcgv_va_temp_new tcg_temp_new_i64
25 +#else
26 +#error
27 +#endif
28 +
29 +static inline void
30 +tcg_gen_qemu_ld_i32(TCGv_i32 v, TCGv_va a, TCGArg i, MemOp m)
31 +{
32 + tcg_gen_qemu_ld_i32_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
33 +}
34 +
35 +static inline void
36 +tcg_gen_qemu_st_i32(TCGv_i32 v, TCGv_va a, TCGArg i, MemOp m)
37 +{
38 + tcg_gen_qemu_st_i32_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
39 +}
40 +
41 +static inline void
42 +tcg_gen_qemu_ld_i64(TCGv_i64 v, TCGv_va a, TCGArg i, MemOp m)
43 +{
44 + tcg_gen_qemu_ld_i64_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
45 +}
46 +
47 +static inline void
48 +tcg_gen_qemu_st_i64(TCGv_i64 v, TCGv_va a, TCGArg i, MemOp m)
49 +{
50 + tcg_gen_qemu_st_i64_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
51 +}
52 +
53 +static inline void
54 +tcg_gen_qemu_ld_i128(TCGv_i128 v, TCGv_va a, TCGArg i, MemOp m)
55 +{
56 + tcg_gen_qemu_ld_i128_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
57 +}
58 +
59 +static inline void
60 +tcg_gen_qemu_st_i128(TCGv_i128 v, TCGv_va a, TCGArg i, MemOp m)
61 +{
62 + tcg_gen_qemu_st_i128_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
63 +}
64 +
65 +#define DEF_ATOMIC2(N, S) \
66 + static inline void N##_##S(TCGv_##S r, TCGv_va a, TCGv_##S v, \
67 + TCGArg i, MemOp m) \
68 + { N##_##S##_chk(r, tcgv_va_temp(a), v, i, m, TCG_TYPE_VA); }
69 +
70 +#define DEF_ATOMIC3(N, S) \
71 + static inline void N##_##S(TCGv_##S r, TCGv_va a, TCGv_##S o, \
72 + TCGv_##S n, TCGArg i, MemOp m) \
73 + { N##_##S##_chk(r, tcgv_va_temp(a), o, n, i, m, TCG_TYPE_VA); }
74 +
75 +DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i32)
76 +DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i64)
77 +DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i128)
78 +
79 +DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i32)
80 +DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i64)
81 +DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i128)
82 +
83 +DEF_ATOMIC2(tcg_gen_atomic_xchg, i32)
84 +DEF_ATOMIC2(tcg_gen_atomic_xchg, i64)
85 +DEF_ATOMIC2(tcg_gen_atomic_xchg, i128)
86 +
87 +DEF_ATOMIC2(tcg_gen_atomic_fetch_add, i32)
88 +DEF_ATOMIC2(tcg_gen_atomic_fetch_add, i64)
89 +DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i32)
90 +DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i64)
91 +DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i128)
92 +DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i32)
93 +DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i64)
94 +DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i128)
95 +DEF_ATOMIC2(tcg_gen_atomic_fetch_xor, i32)
96 +DEF_ATOMIC2(tcg_gen_atomic_fetch_xor, i64)
97 +DEF_ATOMIC2(tcg_gen_atomic_fetch_smin, i32)
98 +DEF_ATOMIC2(tcg_gen_atomic_fetch_smin, i64)
99 +DEF_ATOMIC2(tcg_gen_atomic_fetch_umin, i32)
100 +DEF_ATOMIC2(tcg_gen_atomic_fetch_umin, i64)
101 +DEF_ATOMIC2(tcg_gen_atomic_fetch_smax, i32)
102 +DEF_ATOMIC2(tcg_gen_atomic_fetch_smax, i64)
103 +DEF_ATOMIC2(tcg_gen_atomic_fetch_umax, i32)
104 +DEF_ATOMIC2(tcg_gen_atomic_fetch_umax, i64)
105 +
106 +DEF_ATOMIC2(tcg_gen_atomic_add_fetch, i32)
107 +DEF_ATOMIC2(tcg_gen_atomic_add_fetch, i64)
108 +DEF_ATOMIC2(tcg_gen_atomic_and_fetch, i32)
109 +DEF_ATOMIC2(tcg_gen_atomic_and_fetch, i64)
110 +DEF_ATOMIC2(tcg_gen_atomic_or_fetch, i32)
111 +DEF_ATOMIC2(tcg_gen_atomic_or_fetch, i64)
112 +DEF_ATOMIC2(tcg_gen_atomic_xor_fetch, i32)
113 +DEF_ATOMIC2(tcg_gen_atomic_xor_fetch, i64)
114 +DEF_ATOMIC2(tcg_gen_atomic_smin_fetch, i32)
115 +DEF_ATOMIC2(tcg_gen_atomic_smin_fetch, i64)
116 +DEF_ATOMIC2(tcg_gen_atomic_umin_fetch, i32)
117 +DEF_ATOMIC2(tcg_gen_atomic_umin_fetch, i64)
118 +DEF_ATOMIC2(tcg_gen_atomic_smax_fetch, i32)
119 +DEF_ATOMIC2(tcg_gen_atomic_smax_fetch, i64)
120 +DEF_ATOMIC2(tcg_gen_atomic_umax_fetch, i32)
121 +DEF_ATOMIC2(tcg_gen_atomic_umax_fetch, i64)
122 +
123 +#undef DEF_ATOMIC2
124 +#undef DEF_ATOMIC3
125 +
126 +#endif /* TCG_TCG_OP_MEM_H */
include/tcg/tcg-op.h
+3 -97
@@ -16,6 +16,9 @@
16 #error must include QEMU headers
17 #endif
18
19 +#define TCG_ADDRESS_BITS TARGET_LONG_BITS
20 +#include "tcg/tcg-op-mem.h"
21 +
22 #if TARGET_LONG_BITS == 32
23 # define TCG_TYPE_TL TCG_TYPE_I32
24 #elif TARGET_LONG_BITS == 64
@@ -46,103 +49,6 @@ typedef TCGv_i64 TCGv;
49 #error Unhandled TARGET_LONG_BITS value
50 #endif
51
49 -static inline void
50 -tcg_gen_qemu_ld_i32(TCGv_i32 v, TCGv a, TCGArg i, MemOp m)
51 -{
52 - tcg_gen_qemu_ld_i32_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
53 -}
54 -
55 -static inline void
56 -tcg_gen_qemu_st_i32(TCGv_i32 v, TCGv a, TCGArg i, MemOp m)
57 -{
58 - tcg_gen_qemu_st_i32_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
59 -}
60 -
61 -static inline void
62 -tcg_gen_qemu_ld_i64(TCGv_i64 v, TCGv a, TCGArg i, MemOp m)
63 -{
64 - tcg_gen_qemu_ld_i64_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
65 -}
66 -
67 -static inline void
68 -tcg_gen_qemu_st_i64(TCGv_i64 v, TCGv a, TCGArg i, MemOp m)
69 -{
70 - tcg_gen_qemu_st_i64_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
71 -}
72 -
73 -static inline void
74 -tcg_gen_qemu_ld_i128(TCGv_i128 v, TCGv a, TCGArg i, MemOp m)
75 -{
76 - tcg_gen_qemu_ld_i128_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
77 -}
78 -
79 -static inline void
80 -tcg_gen_qemu_st_i128(TCGv_i128 v, TCGv a, TCGArg i, MemOp m)
81 -{
82 - tcg_gen_qemu_st_i128_chk(v, tcgv_tl_temp(a), i, m, TCG_TYPE_TL);
83 -}
84 -
85 -#define DEF_ATOMIC2(N, S) \
86 - static inline void N##_##S(TCGv_##S r, TCGv a, TCGv_##S v, \
87 - TCGArg i, MemOp m) \
88 - { N##_##S##_chk(r, tcgv_tl_temp(a), v, i, m, TCG_TYPE_TL); }
89 -
90 -#define DEF_ATOMIC3(N, S) \
91 - static inline void N##_##S(TCGv_##S r, TCGv a, TCGv_##S o, \
92 - TCGv_##S n, TCGArg i, MemOp m) \
93 - { N##_##S##_chk(r, tcgv_tl_temp(a), o, n, i, m, TCG_TYPE_TL); }
94 -
95 -DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i32)
96 -DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i64)
97 -DEF_ATOMIC3(tcg_gen_atomic_cmpxchg, i128)
98 -
99 -DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i32)
100 -DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i64)
101 -DEF_ATOMIC3(tcg_gen_nonatomic_cmpxchg, i128)
102 -
103 -DEF_ATOMIC2(tcg_gen_atomic_xchg, i32)
104 -DEF_ATOMIC2(tcg_gen_atomic_xchg, i64)
105 -DEF_ATOMIC2(tcg_gen_atomic_xchg, i128)
106 -
107 -DEF_ATOMIC2(tcg_gen_atomic_fetch_add, i32)
108 -DEF_ATOMIC2(tcg_gen_atomic_fetch_add, i64)
109 -DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i32)
110 -DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i64)
111 -DEF_ATOMIC2(tcg_gen_atomic_fetch_and, i128)
112 -DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i32)
113 -DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i64)
114 -DEF_ATOMIC2(tcg_gen_atomic_fetch_or, i128)
115 -DEF_ATOMIC2(tcg_gen_atomic_fetch_xor, i32)
116 -DEF_ATOMIC2(tcg_gen_atomic_fetch_xor, i64)
117 -DEF_ATOMIC2(tcg_gen_atomic_fetch_smin, i32)
118 -DEF_ATOMIC2(tcg_gen_atomic_fetch_smin, i64)
119 -DEF_ATOMIC2(tcg_gen_atomic_fetch_umin, i32)
120 -DEF_ATOMIC2(tcg_gen_atomic_fetch_umin, i64)
121 -DEF_ATOMIC2(tcg_gen_atomic_fetch_smax, i32)
122 -DEF_ATOMIC2(tcg_gen_atomic_fetch_smax, i64)
123 -DEF_ATOMIC2(tcg_gen_atomic_fetch_umax, i32)
124 -DEF_ATOMIC2(tcg_gen_atomic_fetch_umax, i64)
125 -
126 -DEF_ATOMIC2(tcg_gen_atomic_add_fetch, i32)
127 -DEF_ATOMIC2(tcg_gen_atomic_add_fetch, i64)
128 -DEF_ATOMIC2(tcg_gen_atomic_and_fetch, i32)
129 -DEF_ATOMIC2(tcg_gen_atomic_and_fetch, i64)
130 -DEF_ATOMIC2(tcg_gen_atomic_or_fetch, i32)
131 -DEF_ATOMIC2(tcg_gen_atomic_or_fetch, i64)
132 -DEF_ATOMIC2(tcg_gen_atomic_xor_fetch, i32)
133 -DEF_ATOMIC2(tcg_gen_atomic_xor_fetch, i64)
134 -DEF_ATOMIC2(tcg_gen_atomic_smin_fetch, i32)
135 -DEF_ATOMIC2(tcg_gen_atomic_smin_fetch, i64)
136 -DEF_ATOMIC2(tcg_gen_atomic_umin_fetch, i32)
137 -DEF_ATOMIC2(tcg_gen_atomic_umin_fetch, i64)
138 -DEF_ATOMIC2(tcg_gen_atomic_smax_fetch, i32)
139 -DEF_ATOMIC2(tcg_gen_atomic_smax_fetch, i64)
140 -DEF_ATOMIC2(tcg_gen_atomic_umax_fetch, i32)
141 -DEF_ATOMIC2(tcg_gen_atomic_umax_fetch, i64)
142 -
143 -#undef DEF_ATOMIC2
144 -#undef DEF_ATOMIC3
145 -
52 #if TARGET_LONG_BITS == 64
53 #define tcg_gen_movi_tl tcg_gen_movi_i64
54 #define tcg_gen_mov_tl tcg_gen_mov_i64