1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "qemu/osdep.h"
25#include "qemu/host-utils.h"
26#include "cpu.h"
27#include "exec/helper-proto.h"
28#include "exec/cpu_ldst.h"
29#include "exec/exec-all.h"
30
31
32
33int32_t HELPER(div_i32)(int32_t arg1, int32_t arg2)
34{
35 return arg1 / arg2;
36}
37
38int32_t HELPER(rem_i32)(int32_t arg1, int32_t arg2)
39{
40 return arg1 % arg2;
41}
42
43uint32_t HELPER(divu_i32)(uint32_t arg1, uint32_t arg2)
44{
45 return arg1 / arg2;
46}
47
48uint32_t HELPER(remu_i32)(uint32_t arg1, uint32_t arg2)
49{
50 return arg1 % arg2;
51}
52
53
54
55uint64_t HELPER(shl_i64)(uint64_t arg1, uint64_t arg2)
56{
57 return arg1 << arg2;
58}
59
60uint64_t HELPER(shr_i64)(uint64_t arg1, uint64_t arg2)
61{
62 return arg1 >> arg2;
63}
64
65int64_t HELPER(sar_i64)(int64_t arg1, int64_t arg2)
66{
67 return arg1 >> arg2;
68}
69
70int64_t HELPER(div_i64)(int64_t arg1, int64_t arg2)
71{
72 return arg1 / arg2;
73}
74
75int64_t HELPER(rem_i64)(int64_t arg1, int64_t arg2)
76{
77 return arg1 % arg2;
78}
79
80uint64_t HELPER(divu_i64)(uint64_t arg1, uint64_t arg2)
81{
82 return arg1 / arg2;
83}
84
85uint64_t HELPER(remu_i64)(uint64_t arg1, uint64_t arg2)
86{
87 return arg1 % arg2;
88}
89
90uint64_t HELPER(muluh_i64)(uint64_t arg1, uint64_t arg2)
91{
92 uint64_t l, h;
93 mulu64(&l, &h, arg1, arg2);
94 return h;
95}
96
97int64_t HELPER(mulsh_i64)(int64_t arg1, int64_t arg2)
98{
99 uint64_t l, h;
100 muls64(&l, &h, arg1, arg2);
101 return h;
102}
103
104void HELPER(exit_atomic)(CPUArchState *env)
105{
106 cpu_loop_exit_atomic(ENV_GET_CPU(env), GETPC());
107}
108
109#ifndef CONFIG_SOFTMMU
110
111
112
113static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
114 int size, uintptr_t retaddr)
115{
116
117 if (unlikely(addr & (size - 1))) {
118 cpu_loop_exit_atomic(ENV_GET_CPU(env), retaddr);
119 }
120 return g2h(addr);
121}
122
123
124#define ATOMIC_MMU_LOOKUP atomic_mmu_lookup(env, addr, DATA_SIZE, GETPC())
125
126#define ATOMIC_NAME(X) HELPER(glue(glue(atomic_ ## X, SUFFIX), END))
127#define EXTRA_ARGS
128
129#define DATA_SIZE 1
130#include "atomic_template.h"
131
132#define DATA_SIZE 2
133#include "atomic_template.h"
134
135#define DATA_SIZE 4
136#include "atomic_template.h"
137
138#ifdef CONFIG_ATOMIC64
139#define DATA_SIZE 8
140#include "atomic_template.h"
141#endif
142
143
144
145
146#ifdef CONFIG_ATOMIC128
147
148#undef EXTRA_ARGS
149#undef ATOMIC_NAME
150#undef ATOMIC_MMU_LOOKUP
151
152#define EXTRA_ARGS , TCGMemOpIdx oi, uintptr_t retaddr
153#define ATOMIC_NAME(X) \
154 HELPER(glue(glue(glue(atomic_ ## X, SUFFIX), END), _mmu))
155#define ATOMIC_MMU_LOOKUP atomic_mmu_lookup(env, addr, DATA_SIZE, retaddr)
156
157#define DATA_SIZE 16
158#include "atomic_template.h"
159#endif
160
161#endif
162