Commit c38ac98da54d2da7a71efde0cbf5ad9021dac4e4
1 parent
85220fba
CRIS: Use a helper for lz.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6205 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
8 additions
and
69 deletions
target-cris/helper.h
... | ... | @@ -10,6 +10,7 @@ DEF_HELPER_0(rfn, void); |
10 | 10 | DEF_HELPER_2(movl_sreg_reg, void, i32, i32) |
11 | 11 | DEF_HELPER_2(movl_reg_sreg, void, i32, i32) |
12 | 12 | |
13 | +DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32); | |
13 | 14 | DEF_HELPER_FLAGS_3(btst, TCG_CALL_PURE, i32, i32, i32, i32); |
14 | 15 | |
15 | 16 | DEF_HELPER_0(evaluate_flags_muls, void) |
... | ... |
target-cris/op_helper.c
... | ... | @@ -23,6 +23,7 @@ |
23 | 23 | #include "exec.h" |
24 | 24 | #include "mmu.h" |
25 | 25 | #include "helper.h" |
26 | +#include "host-utils.h" | |
26 | 27 | |
27 | 28 | #define D(x) |
28 | 29 | |
... | ... | @@ -243,6 +244,11 @@ void helper_rfn(void) |
243 | 244 | env->pregs[PR_CCS] |= M_FLAG; |
244 | 245 | } |
245 | 246 | |
247 | +uint32_t helper_lz(uint32_t t0) | |
248 | +{ | |
249 | + return clz32(t0); | |
250 | +} | |
251 | + | |
246 | 252 | uint32_t helper_btst(uint32_t t0, uint32_t t1, uint32_t ccs) |
247 | 253 | { |
248 | 254 | /* FIXME: clean this up. */ |
... | ... |
target-cris/translate.c
... | ... | @@ -320,74 +320,6 @@ static void t_gen_mulu(TCGv d, TCGv d2, TCGv a, TCGv b) |
320 | 320 | tcg_temp_free_i64(t1); |
321 | 321 | } |
322 | 322 | |
323 | -/* 32bit branch-free binary search for counting leading zeros. */ | |
324 | -static void t_gen_lz_i32(TCGv d, TCGv x) | |
325 | -{ | |
326 | - TCGv_i32 y, m, n; | |
327 | - | |
328 | - y = tcg_temp_new_i32(); | |
329 | - m = tcg_temp_new_i32(); | |
330 | - n = tcg_temp_new_i32(); | |
331 | - | |
332 | - /* y = -(x >> 16) */ | |
333 | - tcg_gen_shri_i32(y, x, 16); | |
334 | - tcg_gen_neg_i32(y, y); | |
335 | - | |
336 | - /* m = (y >> 16) & 16 */ | |
337 | - tcg_gen_sari_i32(m, y, 16); | |
338 | - tcg_gen_andi_i32(m, m, 16); | |
339 | - | |
340 | - /* n = 16 - m */ | |
341 | - tcg_gen_sub_i32(n, tcg_const_i32(16), m); | |
342 | - /* x = x >> m */ | |
343 | - tcg_gen_shr_i32(x, x, m); | |
344 | - | |
345 | - /* y = x - 0x100 */ | |
346 | - tcg_gen_subi_i32(y, x, 0x100); | |
347 | - /* m = (y >> 16) & 8 */ | |
348 | - tcg_gen_sari_i32(m, y, 16); | |
349 | - tcg_gen_andi_i32(m, m, 8); | |
350 | - /* n = n + m */ | |
351 | - tcg_gen_add_i32(n, n, m); | |
352 | - /* x = x << m */ | |
353 | - tcg_gen_shl_i32(x, x, m); | |
354 | - | |
355 | - /* y = x - 0x1000 */ | |
356 | - tcg_gen_subi_i32(y, x, 0x1000); | |
357 | - /* m = (y >> 16) & 4 */ | |
358 | - tcg_gen_sari_i32(m, y, 16); | |
359 | - tcg_gen_andi_i32(m, m, 4); | |
360 | - /* n = n + m */ | |
361 | - tcg_gen_add_i32(n, n, m); | |
362 | - /* x = x << m */ | |
363 | - tcg_gen_shl_i32(x, x, m); | |
364 | - | |
365 | - /* y = x - 0x4000 */ | |
366 | - tcg_gen_subi_i32(y, x, 0x4000); | |
367 | - /* m = (y >> 16) & 2 */ | |
368 | - tcg_gen_sari_i32(m, y, 16); | |
369 | - tcg_gen_andi_i32(m, m, 2); | |
370 | - /* n = n + m */ | |
371 | - tcg_gen_add_i32(n, n, m); | |
372 | - /* x = x << m */ | |
373 | - tcg_gen_shl_i32(x, x, m); | |
374 | - | |
375 | - /* y = x >> 14 */ | |
376 | - tcg_gen_shri_i32(y, x, 14); | |
377 | - /* m = y & ~(y >> 1) */ | |
378 | - tcg_gen_sari_i32(m, y, 1); | |
379 | - tcg_gen_not_i32(m, m); | |
380 | - tcg_gen_and_i32(m, m, y); | |
381 | - | |
382 | - /* d = n + 2 - m */ | |
383 | - tcg_gen_addi_i32(d, n, 2); | |
384 | - tcg_gen_sub_i32(d, d, m); | |
385 | - | |
386 | - tcg_temp_free(y); | |
387 | - tcg_temp_free(m); | |
388 | - tcg_temp_free(n); | |
389 | -} | |
390 | - | |
391 | 323 | static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b) |
392 | 324 | { |
393 | 325 | int l1; |
... | ... | @@ -825,7 +757,7 @@ static void cris_alu_op_exec(DisasContext *dc, int op, |
825 | 757 | t_gen_subx_carry(dc, dst); |
826 | 758 | break; |
827 | 759 | case CC_OP_LZ: |
828 | - t_gen_lz_i32(dst, b); | |
760 | + gen_helper_lz(dst, b); | |
829 | 761 | break; |
830 | 762 | case CC_OP_MULS: |
831 | 763 | t_gen_muls(dst, cpu_PR[PR_MOF], a, b); |
... | ... |