From: David Schleef Date: Tue, 6 Jul 2010 23:48:29 +0000 (-0700) Subject: neon: add preload X-Git-Tag: orc-0.4.6~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9a04679bb6c05c887db5c491e06572c7f4b22ed7;p=platform%2Fupstream%2Forc.git neon: add preload --- diff --git a/orc/orcneon.h b/orc/orcneon.h index ecde3bf..81fde4d 100644 --- a/orc/orcneon.h +++ b/orc/orcneon.h @@ -28,6 +28,8 @@ void orc_neon_emit_loadil (OrcCompiler *p, int reg, int value); void orc_neon_emit_loadpb (OrcCompiler *p, int reg, int param); void orc_neon_emit_loadpw (OrcCompiler *p, int reg, int param); void orc_neon_emit_loadpl (OrcCompiler *p, int reg, int param); +void orc_neon_preload (OrcCompiler *compiler, OrcVariable *var, int write, + int offset); #endif diff --git a/orc/orcprogram-neon.c b/orc/orcprogram-neon.c index 44ed147..4cb12d5 100644 --- a/orc/orcprogram-neon.c +++ b/orc/orcprogram-neon.c @@ -501,6 +501,8 @@ orc_neon_emit_load_src (OrcCompiler *compiler, OrcVariable *var) default: ORC_ERROR("bad size"); } + + orc_neon_preload (compiler, var, FALSE, 256); } void @@ -530,6 +532,7 @@ orc_neon_emit_store_dest (OrcCompiler *compiler, OrcVariable *var) default: ORC_ERROR("bad size"); } + //orc_neon_preload (compiler, var, TRUE, -32); } static int diff --git a/orc/orcrules-neon.c b/orc/orcrules-neon.c index 2b335be..bd8b2b5 100644 --- a/orc/orcrules-neon.c +++ b/orc/orcrules-neon.c @@ -213,6 +213,30 @@ orc_neon_emit_mov_quad (OrcCompiler *compiler, int dest, int src) } void +orc_neon_preload (OrcCompiler *compiler, OrcVariable *var, int write, + int offset) +{ + orc_uint32 code; + + /* Don't use multiprocessing extensions */ + write = FALSE; + + ORC_ASM_CODE(compiler," pld%s [%s, #%d]\n", + write ? "w" : "", + orc_arm_reg_name (var->ptr_register), offset); + code = 0xf510f000; + if (!write) code |= (1<<22); + code |= (var->ptr_register&0xf) << 16; + if (offset < 0) { + code |= ((-offset)&0xfff) << 0; + } else { + code |= (offset&0xfff) << 0; + code |= (1<<23); + } + orc_arm_emit (compiler, code); +} + +void orc_neon_load_halfvec_aligned (OrcCompiler *compiler, OrcVariable *var, int update) { orc_uint32 code; @@ -606,7 +630,7 @@ orc_neon_storel (OrcCompiler *compiler, int dest, int update, int src1, int is_a orc_neon_reg_name (src1 + 1), orc_arm_reg_name (dest), update ? "!" : ""); - code = 0xf4000a9d; + code = 0xf4000aad; code |= (dest&0xf) << 16; code |= (src1&0xf) << 12; code |= ((src1>>4)&0x1) << 22;