From de7c5711c5d67e7e69386d6e35e42c8ce15de69b Mon Sep 17 00:00:00 2001 From: Andrew Mahone Date: Sat, 6 Jun 2009 00:00:58 +0000 Subject: Add a system-wide BIT_N macro, implemented via an LUT on SH, and use it in the TAGCACHE_IS_* macros in place of per-set LUTs, removing duplication of data between those LUTs and the mask values used on other targets. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21195 a1c6a512-1295-4272-9138-f99709370657 --- apps/tagcache.c | 30 +++++------------------------- apps/tagcache.h | 8 ++------ firmware/export/system.h | 4 ++++ firmware/target/sh/system-sh.c | 11 +++++++++++ firmware/target/sh/system-target.h | 7 +++++++ 5 files changed, 29 insertions(+), 31 deletions(-) diff --git a/apps/tagcache.c b/apps/tagcache.c index 3d0ab7fbd3..afe55f18a2 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -108,29 +108,10 @@ static long tempbuf_left; /* Buffer space left. */ static long tempbuf_pos; #define SORTED_TAGS_COUNT 8 -#ifdef CPU_SH /* SH lacks a variable shift instruction */ -/* Numeric tags (we can use these tags with conditional clauses). */ -const char tagcache_numeric_tags[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1 }; - -/* Uniqued tags (we can use these tags with filters and conditional clauses). */ -static const char tagcache_unique_tags[] = { 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 }; - -/* Tags we want to get sorted (loaded to the tempbuf). */ -static const char tagcache_sorted_tags[] = { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 }; - -#define TAGCACHE_IS_UNIQUE(tag) ((bool)tagcache_unique_tags[tag]) -#define TAGCACHE_IS_SORTED(tag) ((bool)tagcache_sorted_tags[tag]) - -#else -#define TAGCACHE_IS_UNIQUE(tag) ((1LU << tag) & TAGCACHE_UNIQUE_TAGS) -#define TAGCACHE_IS_SORTED(tag) ((1LU << tag) & TAGCACHE_SORTED_TAGS) - +#define TAGCACHE_IS_UNIQUE(tag) (BIT_N(tag) & TAGCACHE_UNIQUE_TAGS) +#define TAGCACHE_IS_SORTED(tag) (BIT_N(tag) & TAGCACHE_SORTED_TAGS) +#define TAGCACHE_IS_NUMERIC_OR_NONUNIQUE(tag) \ + (BIT_N(tag) & (TAGCACHE_NUMERIC_TAGS | ~TAGCACHE_UNIQUE_TAGS)) /* Tags we want to get sorted (loaded to the tempbuf). */ #define TAGCACHE_SORTED_TAGS ((1LU << tag_artist) | (1LU << tag_album) | \ (1LU << tag_genre) | (1LU << tag_composer) | (1LU << tag_comment) | \ @@ -140,7 +121,6 @@ static const char tagcache_sorted_tags[] = { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, #define TAGCACHE_UNIQUE_TAGS ((1LU << tag_artist) | (1LU << tag_album) | \ (1LU << tag_genre) | (1LU << tag_composer) | (1LU << tag_comment) | \ (1LU << tag_albumartist) | (1LU << tag_grouping)) -#endif /* String presentation of the tags defined in tagcache.h. Must be in correct order! */ static const char *tags_str[] = { "artist", "album", "genre", "title", @@ -1248,7 +1228,7 @@ bool tagcache_search_add_filter(struct tagcache_search *tcs, if (tcs->filter_count == TAGCACHE_MAX_FILTERS) return false; - if (!TAGCACHE_IS_UNIQUE(tag) || TAGCACHE_IS_NUMERIC(tag)) + if (TAGCACHE_IS_NUMERIC_OR_NONUNIQUE(tag)) return false; tcs->filter_tag[tcs->filter_count] = tag; diff --git a/apps/tagcache.h b/apps/tagcache.h index d7047178e1..f2b975c566 100644 --- a/apps/tagcache.h +++ b/apps/tagcache.h @@ -22,6 +22,7 @@ #ifndef _TAGCACHE_H #define _TAGCACHE_H +#include "system.h" #include "metadata.h" /** @@ -103,12 +104,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title, (1LU << tag_virt_playtime_min) | (1LU << tag_virt_playtime_sec) | \ (1LU << tag_virt_entryage) | (1LU << tag_virt_autoscore)) -#ifdef CPU_SH -extern const char tagcache_numeric_tags[]; -#define TAGCACHE_IS_NUMERIC(tag) ((bool)tagcache_numeric_tags[tag]) -#else -#define TAGCACHE_IS_NUMERIC(tag) ((1LU << tag) & TAGCACHE_NUMERIC_TAGS) -#endif +#define TAGCACHE_IS_NUMERIC(tag) (BIT_N(tag) & TAGCACHE_NUMERIC_TAGS) /* Flags */ #define FLAG_DELETED 0x0001 /* Entry has been removed from db */ diff --git a/firmware/export/system.h b/firmware/export/system.h index b44600d2c2..489ed8dc12 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h @@ -266,6 +266,10 @@ static inline uint32_t swap_odd_even32(uint32_t value) #endif /* !SIMULATOR */ +#ifndef TEST_BIT_N +#define TEST_BIT_N(n, mask) ((1UL << (n)) & (mask)) +#endif + /* Declare this as HIGHEST_IRQ_LEVEL if they don't differ */ #ifndef DISABLE_INTERRUPTS #define DISABLE_INTERRUPTS HIGHEST_IRQ_LEVEL diff --git a/firmware/target/sh/system-sh.c b/firmware/target/sh/system-sh.c index 02af40282f..7779c975a7 100644 --- a/firmware/target/sh/system-sh.c +++ b/firmware/target/sh/system-sh.c @@ -27,6 +27,17 @@ #include "font.h" #include "led.h" +const unsigned bit_n_table[32] = { + 1LU<< 0, 1LU<< 1, 1LU<< 2, 1LU<< 3, + 1LU<< 4, 1LU<< 5, 1LU<< 6, 1LU<< 7, + 1LU<< 8, 1LU<< 9, 1LU<<10, 1LU<<11, + 1LU<<12, 1LU<<13, 1LU<<14, 1LU<<15, + 1LU<<16, 1LU<<17, 1LU<<18, 1LU<<19, + 1LU<<20, 1LU<<21, 1LU<<22, 1LU<<23, + 1LU<<24, 1LU<<25, 1LU<<26, 1LU<<27, + 1LU<<28, 1LU<<29, 1LU<<30, 1LU<<31 +}; + static const char* const irqname[] = { "", "", "", "", "IllInstr", "", "IllSltIn","","", "CPUAdrEr", "DMAAdrEr", "NMI", "UserBrk", diff --git a/firmware/target/sh/system-target.h b/firmware/target/sh/system-target.h index 3c225fbb69..2568911a1e 100644 --- a/firmware/target/sh/system-target.h +++ b/firmware/target/sh/system-target.h @@ -126,4 +126,11 @@ static inline uint32_t swap_odd_even32(uint32_t value) return value; } +extern const unsigned bit_n_table[32]; +#define BIT_N(n) ( \ + __builtin_constant_p(n) \ + ? (1LU << (n)) \ + : bit_n_table[n] \ +) + #endif /* SYSTEM_TARGET_H */ -- cgit v1.2.3