qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

target/cris: Reindent op_helper.c

Fix all of the coding style errors in this file at once.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

+398 -419
+398 -419
target/cris/op_helper.c
··· 48 48 void helper_tlb_flush_pid(CPUCRISState *env, uint32_t pid) 49 49 { 50 50 #if !defined(CONFIG_USER_ONLY) 51 - pid &= 0xff; 52 - if (pid != (env->pregs[PR_PID] & 0xff)) 53 - cris_mmu_flush_pid(env, env->pregs[PR_PID]); 51 + pid &= 0xff; 52 + if (pid != (env->pregs[PR_PID] & 0xff)) { 53 + cris_mmu_flush_pid(env, env->pregs[PR_PID]); 54 + } 54 55 #endif 55 56 } 56 57 ··· 66 67 } 67 68 68 69 /* Used by the tlb decoder. */ 69 - #define EXTRACT_FIELD(src, start, end) \ 70 - (((src) >> start) & ((1 << (end - start + 1)) - 1)) 70 + #define EXTRACT_FIELD(src, start, end) \ 71 + (((src) >> start) & ((1 << (end - start + 1)) - 1)) 71 72 72 73 void helper_movl_sreg_reg(CPUCRISState *env, uint32_t sreg, uint32_t reg) 73 74 { 74 75 #if !defined(CONFIG_USER_ONLY) 75 76 CRISCPU *cpu = cris_env_get_cpu(env); 76 77 #endif 77 - uint32_t srs; 78 - srs = env->pregs[PR_SRS]; 79 - srs &= 3; 80 - env->sregs[srs][sreg] = env->regs[reg]; 78 + uint32_t srs; 79 + srs = env->pregs[PR_SRS]; 80 + srs &= 3; 81 + env->sregs[srs][sreg] = env->regs[reg]; 81 82 82 83 #if !defined(CONFIG_USER_ONLY) 83 - if (srs == 1 || srs == 2) { 84 - if (sreg == 6) { 85 - /* Writes to tlb-hi write to mm_cause as a side 86 - effect. */ 87 - env->sregs[SFR_RW_MM_TLB_HI] = env->regs[reg]; 88 - env->sregs[SFR_R_MM_CAUSE] = env->regs[reg]; 89 - } 90 - else if (sreg == 5) { 91 - uint32_t set; 92 - uint32_t idx; 93 - uint32_t lo, hi; 94 - uint32_t vaddr; 95 - int tlb_v; 84 + if (srs == 1 || srs == 2) { 85 + if (sreg == 6) { 86 + /* Writes to tlb-hi write to mm_cause as a side effect. */ 87 + env->sregs[SFR_RW_MM_TLB_HI] = env->regs[reg]; 88 + env->sregs[SFR_R_MM_CAUSE] = env->regs[reg]; 89 + } else if (sreg == 5) { 90 + uint32_t set; 91 + uint32_t idx; 92 + uint32_t lo, hi; 93 + uint32_t vaddr; 94 + int tlb_v; 96 95 97 - idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; 98 - set >>= 4; 99 - set &= 3; 96 + idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; 97 + set >>= 4; 98 + set &= 3; 100 99 101 - idx &= 15; 102 - /* We've just made a write to tlb_lo. */ 103 - lo = env->sregs[SFR_RW_MM_TLB_LO]; 104 - /* Writes are done via r_mm_cause. */ 105 - hi = env->sregs[SFR_R_MM_CAUSE]; 100 + idx &= 15; 101 + /* We've just made a write to tlb_lo. */ 102 + lo = env->sregs[SFR_RW_MM_TLB_LO]; 103 + /* Writes are done via r_mm_cause. */ 104 + hi = env->sregs[SFR_R_MM_CAUSE]; 106 105 107 - vaddr = EXTRACT_FIELD(env->tlbsets[srs-1][set][idx].hi, 108 - 13, 31); 109 - vaddr <<= TARGET_PAGE_BITS; 110 - tlb_v = EXTRACT_FIELD(env->tlbsets[srs-1][set][idx].lo, 111 - 3, 3); 112 - env->tlbsets[srs - 1][set][idx].lo = lo; 113 - env->tlbsets[srs - 1][set][idx].hi = hi; 106 + vaddr = EXTRACT_FIELD(env->tlbsets[srs - 1][set][idx].hi, 13, 31); 107 + vaddr <<= TARGET_PAGE_BITS; 108 + tlb_v = EXTRACT_FIELD(env->tlbsets[srs - 1][set][idx].lo, 3, 3); 109 + env->tlbsets[srs - 1][set][idx].lo = lo; 110 + env->tlbsets[srs - 1][set][idx].hi = hi; 114 111 115 - D_LOG("tlb flush vaddr=%x v=%d pc=%x\n", 116 - vaddr, tlb_v, env->pc); 117 - if (tlb_v) { 112 + D_LOG("tlb flush vaddr=%x v=%d pc=%x\n", 113 + vaddr, tlb_v, env->pc); 114 + if (tlb_v) { 118 115 tlb_flush_page(CPU(cpu), vaddr); 119 - } 120 - } 121 - } 116 + } 117 + } 118 + } 122 119 #endif 123 120 } 124 121 125 122 void helper_movl_reg_sreg(CPUCRISState *env, uint32_t reg, uint32_t sreg) 126 123 { 127 - uint32_t srs; 128 - env->pregs[PR_SRS] &= 3; 129 - srs = env->pregs[PR_SRS]; 130 - 124 + uint32_t srs; 125 + env->pregs[PR_SRS] &= 3; 126 + srs = env->pregs[PR_SRS]; 127 + 131 128 #if !defined(CONFIG_USER_ONLY) 132 - if (srs == 1 || srs == 2) 133 - { 134 - uint32_t set; 135 - uint32_t idx; 136 - uint32_t lo, hi; 129 + if (srs == 1 || srs == 2) { 130 + uint32_t set; 131 + uint32_t idx; 132 + uint32_t lo, hi; 137 133 138 - idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; 139 - set >>= 4; 140 - set &= 3; 141 - idx &= 15; 134 + idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; 135 + set >>= 4; 136 + set &= 3; 137 + idx &= 15; 142 138 143 - /* Update the mirror regs. */ 144 - hi = env->tlbsets[srs - 1][set][idx].hi; 145 - lo = env->tlbsets[srs - 1][set][idx].lo; 146 - env->sregs[SFR_RW_MM_TLB_HI] = hi; 147 - env->sregs[SFR_RW_MM_TLB_LO] = lo; 148 - } 139 + /* Update the mirror regs. */ 140 + hi = env->tlbsets[srs - 1][set][idx].hi; 141 + lo = env->tlbsets[srs - 1][set][idx].lo; 142 + env->sregs[SFR_RW_MM_TLB_HI] = hi; 143 + env->sregs[SFR_RW_MM_TLB_LO] = lo; 144 + } 149 145 #endif 150 - env->regs[reg] = env->sregs[srs][sreg]; 146 + env->regs[reg] = env->sregs[srs][sreg]; 151 147 } 152 148 153 149 static void cris_ccs_rshift(CPUCRISState *env) 154 150 { 155 - uint32_t ccs; 151 + uint32_t ccs; 156 152 157 - /* Apply the ccs shift. */ 158 - ccs = env->pregs[PR_CCS]; 159 - ccs = (ccs & 0xc0000000) | ((ccs & 0x0fffffff) >> 10); 160 - if (ccs & U_FLAG) 161 - { 162 - /* Enter user mode. */ 163 - env->ksp = env->regs[R_SP]; 164 - env->regs[R_SP] = env->pregs[PR_USP]; 165 - } 153 + /* Apply the ccs shift. */ 154 + ccs = env->pregs[PR_CCS]; 155 + ccs = (ccs & 0xc0000000) | ((ccs & 0x0fffffff) >> 10); 156 + if (ccs & U_FLAG) { 157 + /* Enter user mode. */ 158 + env->ksp = env->regs[R_SP]; 159 + env->regs[R_SP] = env->pregs[PR_USP]; 160 + } 166 161 167 - env->pregs[PR_CCS] = ccs; 162 + env->pregs[PR_CCS] = ccs; 168 163 } 169 164 170 165 void helper_rfe(CPUCRISState *env) 171 166 { 172 - int rflag = env->pregs[PR_CCS] & R_FLAG; 167 + int rflag = env->pregs[PR_CCS] & R_FLAG; 173 168 174 - D_LOG("rfe: erp=%x pid=%x ccs=%x btarget=%x\n", 175 - env->pregs[PR_ERP], env->pregs[PR_PID], 176 - env->pregs[PR_CCS], 177 - env->btarget); 169 + D_LOG("rfe: erp=%x pid=%x ccs=%x btarget=%x\n", 170 + env->pregs[PR_ERP], env->pregs[PR_PID], 171 + env->pregs[PR_CCS], 172 + env->btarget); 178 173 179 - cris_ccs_rshift(env); 174 + cris_ccs_rshift(env); 180 175 181 - /* RFE sets the P_FLAG only if the R_FLAG is not set. */ 182 - if (!rflag) 183 - env->pregs[PR_CCS] |= P_FLAG; 176 + /* RFE sets the P_FLAG only if the R_FLAG is not set. */ 177 + if (!rflag) { 178 + env->pregs[PR_CCS] |= P_FLAG; 179 + } 184 180 } 185 181 186 182 void helper_rfn(CPUCRISState *env) 187 183 { 188 - int rflag = env->pregs[PR_CCS] & R_FLAG; 184 + int rflag = env->pregs[PR_CCS] & R_FLAG; 189 185 190 - D_LOG("rfn: erp=%x pid=%x ccs=%x btarget=%x\n", 191 - env->pregs[PR_ERP], env->pregs[PR_PID], 192 - env->pregs[PR_CCS], 193 - env->btarget); 186 + D_LOG("rfn: erp=%x pid=%x ccs=%x btarget=%x\n", 187 + env->pregs[PR_ERP], env->pregs[PR_PID], 188 + env->pregs[PR_CCS], 189 + env->btarget); 194 190 195 - cris_ccs_rshift(env); 191 + cris_ccs_rshift(env); 196 192 197 - /* Set the P_FLAG only if the R_FLAG is not set. */ 198 - if (!rflag) 199 - env->pregs[PR_CCS] |= P_FLAG; 193 + /* Set the P_FLAG only if the R_FLAG is not set. */ 194 + if (!rflag) { 195 + env->pregs[PR_CCS] |= P_FLAG; 196 + } 200 197 201 - /* Always set the M flag. */ 202 - env->pregs[PR_CCS] |= M_FLAG_V32; 198 + /* Always set the M flag. */ 199 + env->pregs[PR_CCS] |= M_FLAG_V32; 203 200 } 204 201 205 202 uint32_t helper_btst(CPUCRISState *env, uint32_t t0, uint32_t t1, uint32_t ccs) 206 203 { 207 - /* FIXME: clean this up. */ 204 + /* FIXME: clean this up. */ 208 205 209 - /* des ref: 210 - The N flag is set according to the selected bit in the dest reg. 211 - The Z flag is set if the selected bit and all bits to the right are 212 - zero. 213 - The X flag is cleared. 214 - Other flags are left untouched. 215 - The destination reg is not affected.*/ 216 - unsigned int fz, sbit, bset, mask, masked_t0; 206 + /* 207 + * des ref: 208 + * The N flag is set according to the selected bit in the dest reg. 209 + * The Z flag is set if the selected bit and all bits to the right are 210 + * zero. 211 + * The X flag is cleared. 212 + * Other flags are left untouched. 213 + * The destination reg is not affected. 214 + */ 215 + unsigned int fz, sbit, bset, mask, masked_t0; 217 216 218 - sbit = t1 & 31; 219 - bset = !!(t0 & (1 << sbit)); 220 - mask = sbit == 31 ? -1 : (1 << (sbit + 1)) - 1; 221 - masked_t0 = t0 & mask; 222 - fz = !(masked_t0 | bset); 217 + sbit = t1 & 31; 218 + bset = !!(t0 & (1 << sbit)); 219 + mask = sbit == 31 ? -1 : (1 << (sbit + 1)) - 1; 220 + masked_t0 = t0 & mask; 221 + fz = !(masked_t0 | bset); 223 222 224 - /* Clear the X, N and Z flags. */ 225 - ccs = ccs & ~(X_FLAG | N_FLAG | Z_FLAG); 226 - if (env->pregs[PR_VR] < 32) 227 - ccs &= ~(V_FLAG | C_FLAG); 228 - /* Set the N and Z flags accordingly. */ 229 - ccs |= (bset << 3) | (fz << 2); 230 - return ccs; 223 + /* Clear the X, N and Z flags. */ 224 + ccs = ccs & ~(X_FLAG | N_FLAG | Z_FLAG); 225 + if (env->pregs[PR_VR] < 32) { 226 + ccs &= ~(V_FLAG | C_FLAG); 227 + } 228 + /* Set the N and Z flags accordingly. */ 229 + ccs |= (bset << 3) | (fz << 2); 230 + return ccs; 231 231 } 232 232 233 233 static inline uint32_t evaluate_flags_writeback(CPUCRISState *env, 234 234 uint32_t flags, uint32_t ccs) 235 235 { 236 - unsigned int x, z, mask; 236 + unsigned int x, z, mask; 237 237 238 - /* Extended arithmetics, leave the z flag alone. */ 239 - x = env->cc_x; 240 - mask = env->cc_mask | X_FLAG; 241 - if (x) { 242 - z = flags & Z_FLAG; 243 - mask = mask & ~z; 244 - } 245 - flags &= mask; 238 + /* Extended arithmetics, leave the z flag alone. */ 239 + x = env->cc_x; 240 + mask = env->cc_mask | X_FLAG; 241 + if (x) { 242 + z = flags & Z_FLAG; 243 + mask = mask & ~z; 244 + } 245 + flags &= mask; 246 246 247 - /* all insn clear the x-flag except setf or clrf. */ 248 - ccs &= ~mask; 249 - ccs |= flags; 250 - return ccs; 247 + /* all insn clear the x-flag except setf or clrf. */ 248 + ccs &= ~mask; 249 + ccs |= flags; 250 + return ccs; 251 251 } 252 252 253 253 uint32_t helper_evaluate_flags_muls(CPUCRISState *env, 254 254 uint32_t ccs, uint32_t res, uint32_t mof) 255 255 { 256 - uint32_t flags = 0; 257 - int64_t tmp; 258 - int dneg; 256 + uint32_t flags = 0; 257 + int64_t tmp; 258 + int dneg; 259 259 260 - dneg = ((int32_t)res) < 0; 260 + dneg = ((int32_t)res) < 0; 261 261 262 - tmp = mof; 263 - tmp <<= 32; 264 - tmp |= res; 265 - if (tmp == 0) 266 - flags |= Z_FLAG; 267 - else if (tmp < 0) 268 - flags |= N_FLAG; 269 - if ((dneg && mof != -1) 270 - || (!dneg && mof != 0)) 271 - flags |= V_FLAG; 272 - return evaluate_flags_writeback(env, flags, ccs); 262 + tmp = mof; 263 + tmp <<= 32; 264 + tmp |= res; 265 + if (tmp == 0) { 266 + flags |= Z_FLAG; 267 + } else if (tmp < 0) { 268 + flags |= N_FLAG; 269 + } 270 + if ((dneg && mof != -1) || (!dneg && mof != 0)) { 271 + flags |= V_FLAG; 272 + } 273 + return evaluate_flags_writeback(env, flags, ccs); 273 274 } 274 275 275 276 uint32_t helper_evaluate_flags_mulu(CPUCRISState *env, 276 277 uint32_t ccs, uint32_t res, uint32_t mof) 277 278 { 278 - uint32_t flags = 0; 279 - uint64_t tmp; 279 + uint32_t flags = 0; 280 + uint64_t tmp; 280 281 281 - tmp = mof; 282 - tmp <<= 32; 283 - tmp |= res; 284 - if (tmp == 0) 285 - flags |= Z_FLAG; 286 - else if (tmp >> 63) 287 - flags |= N_FLAG; 288 - if (mof) 289 - flags |= V_FLAG; 282 + tmp = mof; 283 + tmp <<= 32; 284 + tmp |= res; 285 + if (tmp == 0) { 286 + flags |= Z_FLAG; 287 + } else if (tmp >> 63) { 288 + flags |= N_FLAG; 289 + } 290 + if (mof) { 291 + flags |= V_FLAG; 292 + } 290 293 291 - return evaluate_flags_writeback(env, flags, ccs); 294 + return evaluate_flags_writeback(env, flags, ccs); 292 295 } 293 296 294 297 uint32_t helper_evaluate_flags_mcp(CPUCRISState *env, uint32_t ccs, 295 298 uint32_t src, uint32_t dst, uint32_t res) 296 299 { 297 - uint32_t flags = 0; 300 + uint32_t flags = 0; 298 301 299 - src = src & 0x80000000; 300 - dst = dst & 0x80000000; 302 + src = src & 0x80000000; 303 + dst = dst & 0x80000000; 301 304 302 - if ((res & 0x80000000L) != 0L) 303 - { 304 - flags |= N_FLAG; 305 - if (!src && !dst) 306 - flags |= V_FLAG; 307 - else if (src & dst) 308 - flags |= R_FLAG; 309 - } 310 - else 311 - { 312 - if (res == 0L) 313 - flags |= Z_FLAG; 314 - if (src & dst) 315 - flags |= V_FLAG; 316 - if (dst | src) 317 - flags |= R_FLAG; 318 - } 305 + if ((res & 0x80000000L) != 0L) { 306 + flags |= N_FLAG; 307 + if (!src && !dst) { 308 + flags |= V_FLAG; 309 + } else if (src & dst) { 310 + flags |= R_FLAG; 311 + } 312 + } else { 313 + if (res == 0L) { 314 + flags |= Z_FLAG; 315 + } 316 + if (src & dst) { 317 + flags |= V_FLAG; 318 + } 319 + if (dst | src) { 320 + flags |= R_FLAG; 321 + } 322 + } 319 323 320 - return evaluate_flags_writeback(env, flags, ccs); 324 + return evaluate_flags_writeback(env, flags, ccs); 321 325 } 322 326 323 327 uint32_t helper_evaluate_flags_alu_4(CPUCRISState *env, uint32_t ccs, 324 328 uint32_t src, uint32_t dst, uint32_t res) 325 329 { 326 - uint32_t flags = 0; 330 + uint32_t flags = 0; 327 331 328 - src = src & 0x80000000; 329 - dst = dst & 0x80000000; 332 + src = src & 0x80000000; 333 + dst = dst & 0x80000000; 330 334 331 - if ((res & 0x80000000L) != 0L) 332 - { 333 - flags |= N_FLAG; 334 - if (!src && !dst) 335 - flags |= V_FLAG; 336 - else if (src & dst) 337 - flags |= C_FLAG; 338 - } 339 - else 340 - { 341 - if (res == 0L) 342 - flags |= Z_FLAG; 343 - if (src & dst) 344 - flags |= V_FLAG; 345 - if (dst | src) 346 - flags |= C_FLAG; 347 - } 335 + if ((res & 0x80000000L) != 0L) { 336 + flags |= N_FLAG; 337 + if (!src && !dst) { 338 + flags |= V_FLAG; 339 + } else if (src & dst) { 340 + flags |= C_FLAG; 341 + } 342 + } else { 343 + if (res == 0L) { 344 + flags |= Z_FLAG; 345 + } 346 + if (src & dst) { 347 + flags |= V_FLAG; 348 + } 349 + if (dst | src) { 350 + flags |= C_FLAG; 351 + } 352 + } 348 353 349 - return evaluate_flags_writeback(env, flags, ccs); 354 + return evaluate_flags_writeback(env, flags, ccs); 350 355 } 351 356 352 357 uint32_t helper_evaluate_flags_sub_4(CPUCRISState *env, uint32_t ccs, 353 358 uint32_t src, uint32_t dst, uint32_t res) 354 359 { 355 - uint32_t flags = 0; 360 + uint32_t flags = 0; 356 361 357 - src = (~src) & 0x80000000; 358 - dst = dst & 0x80000000; 362 + src = (~src) & 0x80000000; 363 + dst = dst & 0x80000000; 359 364 360 - if ((res & 0x80000000L) != 0L) 361 - { 362 - flags |= N_FLAG; 363 - if (!src && !dst) 364 - flags |= V_FLAG; 365 - else if (src & dst) 366 - flags |= C_FLAG; 367 - } 368 - else 369 - { 370 - if (res == 0L) 371 - flags |= Z_FLAG; 372 - if (src & dst) 373 - flags |= V_FLAG; 374 - if (dst | src) 375 - flags |= C_FLAG; 376 - } 365 + if ((res & 0x80000000L) != 0L) { 366 + flags |= N_FLAG; 367 + if (!src && !dst) { 368 + flags |= V_FLAG; 369 + } else if (src & dst) { 370 + flags |= C_FLAG; 371 + } 372 + } else { 373 + if (res == 0L) { 374 + flags |= Z_FLAG; 375 + } 376 + if (src & dst) { 377 + flags |= V_FLAG; 378 + } 379 + if (dst | src) { 380 + flags |= C_FLAG; 381 + } 382 + } 377 383 378 - flags ^= C_FLAG; 379 - return evaluate_flags_writeback(env, flags, ccs); 384 + flags ^= C_FLAG; 385 + return evaluate_flags_writeback(env, flags, ccs); 380 386 } 381 387 382 388 uint32_t helper_evaluate_flags_move_4(CPUCRISState *env, 383 389 uint32_t ccs, uint32_t res) 384 390 { 385 - uint32_t flags = 0; 391 + uint32_t flags = 0; 386 392 387 - if ((int32_t)res < 0) 388 - flags |= N_FLAG; 389 - else if (res == 0L) 390 - flags |= Z_FLAG; 393 + if ((int32_t)res < 0) { 394 + flags |= N_FLAG; 395 + } else if (res == 0L) { 396 + flags |= Z_FLAG; 397 + } 391 398 392 - return evaluate_flags_writeback(env, flags, ccs); 399 + return evaluate_flags_writeback(env, flags, ccs); 393 400 } 401 + 394 402 uint32_t helper_evaluate_flags_move_2(CPUCRISState *env, 395 403 uint32_t ccs, uint32_t res) 396 404 { 397 - uint32_t flags = 0; 405 + uint32_t flags = 0; 398 406 399 - if ((int16_t)res < 0L) 400 - flags |= N_FLAG; 401 - else if (res == 0) 402 - flags |= Z_FLAG; 407 + if ((int16_t)res < 0L) { 408 + flags |= N_FLAG; 409 + } else if (res == 0) { 410 + flags |= Z_FLAG; 411 + } 403 412 404 - return evaluate_flags_writeback(env, flags, ccs); 413 + return evaluate_flags_writeback(env, flags, ccs); 405 414 } 406 415 407 - /* TODO: This is expensive. We could split things up and only evaluate part of 408 - CCR on a need to know basis. For now, we simply re-evaluate everything. */ 416 + /* 417 + * TODO: This is expensive. We could split things up and only evaluate part of 418 + * CCR on a need to know basis. For now, we simply re-evaluate everything. 419 + */ 409 420 void helper_evaluate_flags(CPUCRISState *env) 410 421 { 411 - uint32_t src, dst, res; 412 - uint32_t flags = 0; 422 + uint32_t src, dst, res; 423 + uint32_t flags = 0; 413 424 414 - src = env->cc_src; 415 - dst = env->cc_dest; 416 - res = env->cc_result; 425 + src = env->cc_src; 426 + dst = env->cc_dest; 427 + res = env->cc_result; 417 428 418 - if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) 419 - src = ~src; 429 + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) { 430 + src = ~src; 431 + } 420 432 421 - /* Now, evaluate the flags. This stuff is based on 422 - Per Zander's CRISv10 simulator. */ 423 - switch (env->cc_size) 424 - { 425 - case 1: 426 - if ((res & 0x80L) != 0L) 427 - { 428 - flags |= N_FLAG; 429 - if (((src & 0x80L) == 0L) 430 - && ((dst & 0x80L) == 0L)) 431 - { 432 - flags |= V_FLAG; 433 - } 434 - else if (((src & 0x80L) != 0L) 435 - && ((dst & 0x80L) != 0L)) 436 - { 437 - flags |= C_FLAG; 438 - } 439 - } 440 - else 441 - { 442 - if ((res & 0xFFL) == 0L) 443 - { 444 - flags |= Z_FLAG; 445 - } 446 - if (((src & 0x80L) != 0L) 447 - && ((dst & 0x80L) != 0L)) 448 - { 449 - flags |= V_FLAG; 450 - } 451 - if ((dst & 0x80L) != 0L 452 - || (src & 0x80L) != 0L) 453 - { 454 - flags |= C_FLAG; 455 - } 456 - } 457 - break; 458 - case 2: 459 - if ((res & 0x8000L) != 0L) 460 - { 461 - flags |= N_FLAG; 462 - if (((src & 0x8000L) == 0L) 463 - && ((dst & 0x8000L) == 0L)) 464 - { 465 - flags |= V_FLAG; 466 - } 467 - else if (((src & 0x8000L) != 0L) 468 - && ((dst & 0x8000L) != 0L)) 469 - { 470 - flags |= C_FLAG; 471 - } 472 - } 473 - else 474 - { 475 - if ((res & 0xFFFFL) == 0L) 476 - { 477 - flags |= Z_FLAG; 478 - } 479 - if (((src & 0x8000L) != 0L) 480 - && ((dst & 0x8000L) != 0L)) 481 - { 482 - flags |= V_FLAG; 483 - } 484 - if ((dst & 0x8000L) != 0L 485 - || (src & 0x8000L) != 0L) 486 - { 487 - flags |= C_FLAG; 488 - } 489 - } 490 - break; 491 - case 4: 492 - if ((res & 0x80000000L) != 0L) 493 - { 494 - flags |= N_FLAG; 495 - if (((src & 0x80000000L) == 0L) 496 - && ((dst & 0x80000000L) == 0L)) 497 - { 498 - flags |= V_FLAG; 499 - } 500 - else if (((src & 0x80000000L) != 0L) && 501 - ((dst & 0x80000000L) != 0L)) 502 - { 503 - flags |= C_FLAG; 504 - } 505 - } 506 - else 507 - { 508 - if (res == 0L) 509 - flags |= Z_FLAG; 510 - if (((src & 0x80000000L) != 0L) 511 - && ((dst & 0x80000000L) != 0L)) 512 - flags |= V_FLAG; 513 - if ((dst & 0x80000000L) != 0L 514 - || (src & 0x80000000L) != 0L) 515 - flags |= C_FLAG; 516 - } 517 - break; 518 - default: 519 - break; 520 - } 433 + /* 434 + * Now, evaluate the flags. This stuff is based on 435 + * Per Zander's CRISv10 simulator. 436 + */ 437 + switch (env->cc_size) { 438 + case 1: 439 + if ((res & 0x80L) != 0L) { 440 + flags |= N_FLAG; 441 + if (((src & 0x80L) == 0L) && ((dst & 0x80L) == 0L)) { 442 + flags |= V_FLAG; 443 + } else if (((src & 0x80L) != 0L) && ((dst & 0x80L) != 0L)) { 444 + flags |= C_FLAG; 445 + } 446 + } else { 447 + if ((res & 0xFFL) == 0L) { 448 + flags |= Z_FLAG; 449 + } 450 + if (((src & 0x80L) != 0L) && ((dst & 0x80L) != 0L)) { 451 + flags |= V_FLAG; 452 + } 453 + if ((dst & 0x80L) != 0L || (src & 0x80L) != 0L) { 454 + flags |= C_FLAG; 455 + } 456 + } 457 + break; 458 + case 2: 459 + if ((res & 0x8000L) != 0L) { 460 + flags |= N_FLAG; 461 + if (((src & 0x8000L) == 0L) && ((dst & 0x8000L) == 0L)) { 462 + flags |= V_FLAG; 463 + } else if (((src & 0x8000L) != 0L) && ((dst & 0x8000L) != 0L)) { 464 + flags |= C_FLAG; 465 + } 466 + } else { 467 + if ((res & 0xFFFFL) == 0L) { 468 + flags |= Z_FLAG; 469 + } 470 + if (((src & 0x8000L) != 0L) && ((dst & 0x8000L) != 0L)) { 471 + flags |= V_FLAG; 472 + } 473 + if ((dst & 0x8000L) != 0L || (src & 0x8000L) != 0L) { 474 + flags |= C_FLAG; 475 + } 476 + } 477 + break; 478 + case 4: 479 + if ((res & 0x80000000L) != 0L) { 480 + flags |= N_FLAG; 481 + if (((src & 0x80000000L) == 0L) && ((dst & 0x80000000L) == 0L)) { 482 + flags |= V_FLAG; 483 + } else if (((src & 0x80000000L) != 0L) && 484 + ((dst & 0x80000000L) != 0L)) { 485 + flags |= C_FLAG; 486 + } 487 + } else { 488 + if (res == 0L) { 489 + flags |= Z_FLAG; 490 + } 491 + if (((src & 0x80000000L) != 0L) && ((dst & 0x80000000L) != 0L)) { 492 + flags |= V_FLAG; 493 + } 494 + if ((dst & 0x80000000L) != 0L || (src & 0x80000000L) != 0L) { 495 + flags |= C_FLAG; 496 + } 497 + } 498 + break; 499 + default: 500 + break; 501 + } 521 502 522 - if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) 523 - flags ^= C_FLAG; 503 + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) { 504 + flags ^= C_FLAG; 505 + } 524 506 525 - env->pregs[PR_CCS] = evaluate_flags_writeback(env, flags, 526 - env->pregs[PR_CCS]); 507 + env->pregs[PR_CCS] = evaluate_flags_writeback(env, flags, 508 + env->pregs[PR_CCS]); 527 509 } 528 510 529 511 void helper_top_evaluate_flags(CPUCRISState *env) 530 512 { 531 - switch (env->cc_op) 532 - { 533 - case CC_OP_MCP: 534 - env->pregs[PR_CCS] = helper_evaluate_flags_mcp(env, 535 - env->pregs[PR_CCS], env->cc_src, 536 - env->cc_dest, env->cc_result); 537 - break; 538 - case CC_OP_MULS: 539 - env->pregs[PR_CCS] = helper_evaluate_flags_muls(env, 540 - env->pregs[PR_CCS], env->cc_result, 541 - env->pregs[PR_MOF]); 542 - break; 543 - case CC_OP_MULU: 544 - env->pregs[PR_CCS] = helper_evaluate_flags_mulu(env, 545 - env->pregs[PR_CCS], env->cc_result, 546 - env->pregs[PR_MOF]); 547 - break; 548 - case CC_OP_MOVE: 549 - case CC_OP_AND: 550 - case CC_OP_OR: 551 - case CC_OP_XOR: 552 - case CC_OP_ASR: 553 - case CC_OP_LSR: 554 - case CC_OP_LSL: 555 - switch (env->cc_size) 556 - { 557 - case 4: 558 - env->pregs[PR_CCS] = 559 - helper_evaluate_flags_move_4(env, 560 - env->pregs[PR_CCS], 561 - env->cc_result); 562 - break; 563 - case 2: 564 - env->pregs[PR_CCS] = 565 - helper_evaluate_flags_move_2(env, 566 - env->pregs[PR_CCS], 567 - env->cc_result); 568 - break; 569 - default: 570 - helper_evaluate_flags(env); 571 - break; 572 - } 573 - break; 574 - case CC_OP_FLAGS: 575 - /* live. */ 576 - break; 577 - case CC_OP_SUB: 578 - case CC_OP_CMP: 579 - if (env->cc_size == 4) 580 - env->pregs[PR_CCS] = 581 - helper_evaluate_flags_sub_4(env, 582 - env->pregs[PR_CCS], 583 - env->cc_src, env->cc_dest, 584 - env->cc_result); 585 - else 586 - helper_evaluate_flags(env); 587 - break; 588 - default: 589 - { 590 - switch (env->cc_size) 591 - { 592 - case 4: 593 - env->pregs[PR_CCS] = 594 - helper_evaluate_flags_alu_4(env, 595 - env->pregs[PR_CCS], 596 - env->cc_src, env->cc_dest, 597 - env->cc_result); 598 - break; 599 - default: 600 - helper_evaluate_flags(env); 601 - break; 602 - } 603 - } 604 - break; 605 - } 513 + switch (env->cc_op) { 514 + case CC_OP_MCP: 515 + env->pregs[PR_CCS] 516 + = helper_evaluate_flags_mcp(env, env->pregs[PR_CCS], 517 + env->cc_src, env->cc_dest, 518 + env->cc_result); 519 + break; 520 + case CC_OP_MULS: 521 + env->pregs[PR_CCS] 522 + = helper_evaluate_flags_muls(env, env->pregs[PR_CCS], 523 + env->cc_result, env->pregs[PR_MOF]); 524 + break; 525 + case CC_OP_MULU: 526 + env->pregs[PR_CCS] 527 + = helper_evaluate_flags_mulu(env, env->pregs[PR_CCS], 528 + env->cc_result, env->pregs[PR_MOF]); 529 + break; 530 + case CC_OP_MOVE: 531 + case CC_OP_AND: 532 + case CC_OP_OR: 533 + case CC_OP_XOR: 534 + case CC_OP_ASR: 535 + case CC_OP_LSR: 536 + case CC_OP_LSL: 537 + switch (env->cc_size) { 538 + case 4: 539 + env->pregs[PR_CCS] = 540 + helper_evaluate_flags_move_4(env, 541 + env->pregs[PR_CCS], 542 + env->cc_result); 543 + break; 544 + case 2: 545 + env->pregs[PR_CCS] = 546 + helper_evaluate_flags_move_2(env, 547 + env->pregs[PR_CCS], 548 + env->cc_result); 549 + break; 550 + default: 551 + helper_evaluate_flags(env); 552 + break; 553 + } 554 + break; 555 + case CC_OP_FLAGS: 556 + /* live. */ 557 + break; 558 + case CC_OP_SUB: 559 + case CC_OP_CMP: 560 + if (env->cc_size == 4) { 561 + env->pregs[PR_CCS] = 562 + helper_evaluate_flags_sub_4(env, 563 + env->pregs[PR_CCS], 564 + env->cc_src, env->cc_dest, 565 + env->cc_result); 566 + } else { 567 + helper_evaluate_flags(env); 568 + } 569 + break; 570 + default: 571 + switch (env->cc_size) { 572 + case 4: 573 + env->pregs[PR_CCS] = 574 + helper_evaluate_flags_alu_4(env, 575 + env->pregs[PR_CCS], 576 + env->cc_src, env->cc_dest, 577 + env->cc_result); 578 + break; 579 + default: 580 + helper_evaluate_flags(env); 581 + break; 582 + } 583 + break; 584 + } 606 585 }