From 5ba52fa193decc8b123e2bcf790af327a32cc2d4 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Fri, 26 Jun 2009 11:05:45 -0700 Subject: [PATCH] neon: test --- orc-test/orctest.c | 1 + orc/orcprogram-neon.c | 52 ++++++++++++++++++++++++++++----------------------- orc/orcprogram.h | 4 ++++ 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/orc-test/orctest.c b/orc-test/orctest.c index d3c0e54..ded5674 100644 --- a/orc-test/orctest.c +++ b/orc-test/orctest.c @@ -159,6 +159,7 @@ orc_test_gcc_compile_neon (OrcProgram *p) target = orc_target_get_by_name ("neon"); flags = orc_target_get_default_flags (target); + flags |= ORC_TARGET_NEON_CLEAN_COMPILE; result = orc_program_compile_full (p, target, flags); if (!ORC_COMPILE_RESULT_IS_SUCCESSFUL(result)) { diff --git a/orc/orcprogram-neon.c b/orc/orcprogram-neon.c index 3a1664c..34c6a90 100644 --- a/orc/orcprogram-neon.c +++ b/orc/orcprogram-neon.c @@ -187,7 +187,6 @@ orc_compiler_neon_init (OrcCompiler *compiler) if (loop_shift < compiler->loop_shift) { compiler->loop_shift = loop_shift; } -compiler->loop_shift = 0; compiler->need_mask_regs = TRUE; } @@ -271,7 +270,23 @@ orc_neon_load_alignment_masks (OrcCompiler *compiler) orc_arm_emit_lsl_imm (compiler, compiler->gp_tmpreg, compiler->gp_tmpreg, 3); - if (1) { + if (compiler->target_flags & ORC_TARGET_NEON_CLEAN_COMPILE) { + for(j=0;jmask_alloc), j, + orc_arm_reg_name (compiler->gp_tmpreg)); + code = 0xee400b10; + code |= (var->mask_alloc&0xf)<<16; + code |= ((var->mask_alloc>>4)&0x1)<<7; + code |= (compiler->gp_tmpreg&0xf)<<12; + code |= (j&3)<<5; + code |= (j>>2)<<21; + orc_arm_emit (compiler, code); + + orc_arm_emit_add_imm (compiler, compiler->gp_tmpreg, + compiler->gp_tmpreg, 1); + } + } else { orc_arm_emit_align (compiler, 3); orc_arm_emit_add (compiler, compiler->gp_tmpreg, compiler->gp_tmpreg, ORC_ARM_PC); @@ -301,22 +316,6 @@ orc_neon_load_alignment_masks (OrcCompiler *compiler) orc_arm_emit_label (compiler, 8+b); b++; - } else { - for(j=0;jmask_alloc), j, - orc_arm_reg_name (compiler->gp_tmpreg)); - code = 0xee400b10; - code |= (var->mask_alloc&0xf)<<16; - code |= ((var->mask_alloc>>4)&0x1)<<7; - code |= (compiler->gp_tmpreg&0xf)<<12; - code |= (j&3)<<5; - code |= (j>>2)<<21; - orc_arm_emit (compiler, code); - - orc_arm_emit_add_imm (compiler, compiler->gp_tmpreg, - compiler->gp_tmpreg, 1); - } } orc_arm_emit_and_imm (compiler, var->ptr_offset, var->ptr_register, @@ -738,6 +737,15 @@ orc_neon_emit_loop (OrcCompiler *compiler) #endif } +#define NEON_BINARY(code,a,b,c) \ + ((code) | \ + (((a)&0xf)<<12) | \ + ((((a)>>4)&0x1)<<22) | \ + (((b)&0xf)<<16) | \ + ((((b)>>4)&0x1)<<7) | \ + (((c)&0xf)<<0) | \ + ((((c)>>4)&0x1)<<5)) + void orc_neon_save_accumulators (OrcCompiler *compiler) { @@ -790,13 +798,11 @@ orc_neon_save_accumulators (OrcCompiler *compiler) break; case 4: if (compiler->loop_shift > 0) { - ORC_ASM_CODE(compiler," vpaddl.u32 %s, %s\n", + ORC_ASM_CODE(compiler," vpadd.u32 %s, %s, %s\n", + orc_neon_reg_name (src), orc_neon_reg_name (src), orc_neon_reg_name (src)); - code = 0xf3b80280; - code |= (src&0xf) << 12; - code |= ((src>>4)&0x1) << 22; - code |= (src&0xf) << 0; + code = NEON_BINARY(0xf2200b10, src, src, src); orc_arm_emit (compiler, code); } diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 086b7de..b395e64 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -76,6 +76,10 @@ enum { ORC_TARGET_ALTIVEC_ALTIVEC = (1<<0) }; +enum { + ORC_TARGET_NEON_CLEAN_COMPILE = (1<<0) +}; + typedef enum { ORC_VAR_TYPE_TEMP, ORC_VAR_TYPE_SRC, -- 2.7.4