Lines Matching full:env
34 static void copy_window_from_phys(CPUXtensaState *env, in copy_window_from_phys() argument
37 assert(phys < env->config->nareg); in copy_window_from_phys()
38 if (phys + n <= env->config->nareg) { in copy_window_from_phys()
39 memcpy(env->regs + window, env->phys_regs + phys, in copy_window_from_phys()
42 uint32_t n1 = env->config->nareg - phys; in copy_window_from_phys()
43 memcpy(env->regs + window, env->phys_regs + phys, in copy_window_from_phys()
45 memcpy(env->regs + window + n1, env->phys_regs, in copy_window_from_phys()
50 static void copy_phys_from_window(CPUXtensaState *env, in copy_phys_from_window() argument
53 assert(phys < env->config->nareg); in copy_phys_from_window()
54 if (phys + n <= env->config->nareg) { in copy_phys_from_window()
55 memcpy(env->phys_regs + phys, env->regs + window, in copy_phys_from_window()
58 uint32_t n1 = env->config->nareg - phys; in copy_phys_from_window()
59 memcpy(env->phys_regs + phys, env->regs + window, in copy_phys_from_window()
61 memcpy(env->phys_regs, env->regs + window + n1, in copy_phys_from_window()
66 static inline unsigned windowbase_bound(unsigned a, const CPUXtensaState *env) in windowbase_bound() argument
68 return a & (env->config->nareg / 4 - 1); in windowbase_bound()
71 static inline unsigned windowstart_bit(unsigned a, const CPUXtensaState *env) in windowstart_bit() argument
73 return 1 << windowbase_bound(a, env); in windowstart_bit()
76 void xtensa_sync_window_from_phys(CPUXtensaState *env) in xtensa_sync_window_from_phys() argument
78 copy_window_from_phys(env, 0, env->sregs[WINDOW_BASE] * 4, 16); in xtensa_sync_window_from_phys()
81 void xtensa_sync_phys_from_window(CPUXtensaState *env) in xtensa_sync_phys_from_window() argument
83 copy_phys_from_window(env, env->sregs[WINDOW_BASE] * 4, 0, 16); in xtensa_sync_phys_from_window()
86 static void xtensa_rotate_window_abs(CPUXtensaState *env, uint32_t position) in xtensa_rotate_window_abs() argument
88 xtensa_sync_phys_from_window(env); in xtensa_rotate_window_abs()
89 env->sregs[WINDOW_BASE] = windowbase_bound(position, env); in xtensa_rotate_window_abs()
90 xtensa_sync_window_from_phys(env); in xtensa_rotate_window_abs()
93 void xtensa_rotate_window(CPUXtensaState *env, uint32_t delta) in xtensa_rotate_window() argument
95 xtensa_rotate_window_abs(env, env->sregs[WINDOW_BASE] + delta); in xtensa_rotate_window()
98 void HELPER(sync_windowbase)(CPUXtensaState *env) in HELPER()
100 xtensa_rotate_window_abs(env, env->windowbase_next); in HELPER()
103 void HELPER(entry)(CPUXtensaState *env, uint32_t pc, uint32_t s, uint32_t imm) in HELPER()
105 int callinc = (env->sregs[PS] & PS_CALLINC) >> PS_CALLINC_SHIFT; in HELPER()
107 env->regs[(callinc << 2) | (s & 3)] = env->regs[s] - imm; in HELPER()
108 env->windowbase_next = env->sregs[WINDOW_BASE] + callinc; in HELPER()
109 env->sregs[WINDOW_START] |= windowstart_bit(env->windowbase_next, env); in HELPER()
112 void HELPER(window_check)(CPUXtensaState *env, uint32_t pc, uint32_t w) in HELPER()
114 uint32_t windowbase = windowbase_bound(env->sregs[WINDOW_BASE], env); in HELPER()
115 uint32_t windowstart = xtensa_replicate_windowstart(env) >> in HELPER()
116 (env->sregs[WINDOW_BASE] + 1); in HELPER()
121 xtensa_rotate_window(env, n); in HELPER()
122 env->sregs[PS] = (env->sregs[PS] & ~PS_OWB) | in HELPER()
124 env->sregs[EPC1] = env->pc = pc; in HELPER()
128 HELPER(exception)(env, EXC_WINDOW_OVERFLOW4); in HELPER()
131 HELPER(exception)(env, EXC_WINDOW_OVERFLOW8); in HELPER()
134 HELPER(exception)(env, EXC_WINDOW_OVERFLOW12); in HELPER()
139 void HELPER(test_ill_retw)(CPUXtensaState *env, uint32_t pc) in HELPER()
141 int n = (env->regs[0] >> 30) & 0x3; in HELPER()
143 uint32_t windowbase = windowbase_bound(env->sregs[WINDOW_BASE], env); in HELPER()
144 uint32_t windowstart = env->sregs[WINDOW_START]; in HELPER()
146 if (windowstart & windowstart_bit(windowbase - 1, env)) { in HELPER()
148 } else if (windowstart & windowstart_bit(windowbase - 2, env)) { in HELPER()
150 } else if (windowstart & windowstart_bit(windowbase - 3, env)) { in HELPER()
157 pc, env->sregs[PS], m, n); in HELPER()
158 HELPER(exception_cause)(env, pc, ILLEGAL_INSTRUCTION_CAUSE); in HELPER()
162 void HELPER(test_underflow_retw)(CPUXtensaState *env, uint32_t pc) in HELPER()
164 int n = (env->regs[0] >> 30) & 0x3; in HELPER()
166 if (!(env->sregs[WINDOW_START] & in HELPER()
167 windowstart_bit(env->sregs[WINDOW_BASE] - n, env))) { in HELPER()
168 uint32_t windowbase = windowbase_bound(env->sregs[WINDOW_BASE], env); in HELPER()
170 xtensa_rotate_window(env, -n); in HELPER()
172 env->sregs[PS] = (env->sregs[PS] & ~PS_OWB) | in HELPER()
174 env->sregs[EPC1] = env->pc = pc; in HELPER()
177 HELPER(exception)(env, EXC_WINDOW_UNDERFLOW4); in HELPER()
179 HELPER(exception)(env, EXC_WINDOW_UNDERFLOW8); in HELPER()
181 HELPER(exception)(env, EXC_WINDOW_UNDERFLOW12); in HELPER()
186 void HELPER(retw)(CPUXtensaState *env, uint32_t a0) in HELPER()
190 xtensa_rotate_window(env, -n); in HELPER()
193 void xtensa_restore_owb(CPUXtensaState *env) in xtensa_restore_owb() argument
195 xtensa_rotate_window_abs(env, (env->sregs[PS] & PS_OWB) >> PS_OWB_SHIFT); in xtensa_restore_owb()
198 void HELPER(restore_owb)(CPUXtensaState *env) in HELPER()
200 xtensa_restore_owb(env); in HELPER()
203 void HELPER(movsp)(CPUXtensaState *env, uint32_t pc) in HELPER()
205 if ((env->sregs[WINDOW_START] & in HELPER()
206 (windowstart_bit(env->sregs[WINDOW_BASE] - 3, env) | in HELPER()
207 windowstart_bit(env->sregs[WINDOW_BASE] - 2, env) | in HELPER()
208 windowstart_bit(env->sregs[WINDOW_BASE] - 1, env))) == 0) { in HELPER()
209 HELPER(exception_cause)(env, pc, ALLOCA_CAUSE); in HELPER()