mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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
This commit is contained in:
parent
fe72c890a7
commit
de7c5711c5
5 changed files with 29 additions and 31 deletions
|
@ -108,29 +108,10 @@ static long tempbuf_left; /* Buffer space left. */
|
||||||
static long tempbuf_pos;
|
static long tempbuf_pos;
|
||||||
|
|
||||||
#define SORTED_TAGS_COUNT 8
|
#define SORTED_TAGS_COUNT 8
|
||||||
#ifdef CPU_SH /* SH lacks a variable shift instruction */
|
#define TAGCACHE_IS_UNIQUE(tag) (BIT_N(tag) & TAGCACHE_UNIQUE_TAGS)
|
||||||
/* Numeric tags (we can use these tags with conditional clauses). */
|
#define TAGCACHE_IS_SORTED(tag) (BIT_N(tag) & TAGCACHE_SORTED_TAGS)
|
||||||
const char tagcache_numeric_tags[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
|
#define TAGCACHE_IS_NUMERIC_OR_NONUNIQUE(tag) \
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
|
(BIT_N(tag) & (TAGCACHE_NUMERIC_TAGS | ~TAGCACHE_UNIQUE_TAGS))
|
||||||
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)
|
|
||||||
|
|
||||||
/* Tags we want to get sorted (loaded to the tempbuf). */
|
/* Tags we want to get sorted (loaded to the tempbuf). */
|
||||||
#define TAGCACHE_SORTED_TAGS ((1LU << tag_artist) | (1LU << tag_album) | \
|
#define TAGCACHE_SORTED_TAGS ((1LU << tag_artist) | (1LU << tag_album) | \
|
||||||
(1LU << tag_genre) | (1LU << tag_composer) | (1LU << tag_comment) | \
|
(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) | \
|
#define TAGCACHE_UNIQUE_TAGS ((1LU << tag_artist) | (1LU << tag_album) | \
|
||||||
(1LU << tag_genre) | (1LU << tag_composer) | (1LU << tag_comment) | \
|
(1LU << tag_genre) | (1LU << tag_composer) | (1LU << tag_comment) | \
|
||||||
(1LU << tag_albumartist) | (1LU << tag_grouping))
|
(1LU << tag_albumartist) | (1LU << tag_grouping))
|
||||||
#endif
|
|
||||||
|
|
||||||
/* String presentation of the tags defined in tagcache.h. Must be in correct order! */
|
/* String presentation of the tags defined in tagcache.h. Must be in correct order! */
|
||||||
static const char *tags_str[] = { "artist", "album", "genre", "title",
|
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)
|
if (tcs->filter_count == TAGCACHE_MAX_FILTERS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!TAGCACHE_IS_UNIQUE(tag) || TAGCACHE_IS_NUMERIC(tag))
|
if (TAGCACHE_IS_NUMERIC_OR_NONUNIQUE(tag))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
tcs->filter_tag[tcs->filter_count] = tag;
|
tcs->filter_tag[tcs->filter_count] = tag;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#ifndef _TAGCACHE_H
|
#ifndef _TAGCACHE_H
|
||||||
#define _TAGCACHE_H
|
#define _TAGCACHE_H
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
#include "metadata.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_playtime_min) | (1LU << tag_virt_playtime_sec) | \
|
||||||
(1LU << tag_virt_entryage) | (1LU << tag_virt_autoscore))
|
(1LU << tag_virt_entryage) | (1LU << tag_virt_autoscore))
|
||||||
|
|
||||||
#ifdef CPU_SH
|
#define TAGCACHE_IS_NUMERIC(tag) (BIT_N(tag) & TAGCACHE_NUMERIC_TAGS)
|
||||||
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
|
|
||||||
|
|
||||||
/* Flags */
|
/* Flags */
|
||||||
#define FLAG_DELETED 0x0001 /* Entry has been removed from db */
|
#define FLAG_DELETED 0x0001 /* Entry has been removed from db */
|
||||||
|
|
|
@ -266,6 +266,10 @@ static inline uint32_t swap_odd_even32(uint32_t value)
|
||||||
|
|
||||||
#endif /* !SIMULATOR */
|
#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 */
|
/* Declare this as HIGHEST_IRQ_LEVEL if they don't differ */
|
||||||
#ifndef DISABLE_INTERRUPTS
|
#ifndef DISABLE_INTERRUPTS
|
||||||
#define DISABLE_INTERRUPTS HIGHEST_IRQ_LEVEL
|
#define DISABLE_INTERRUPTS HIGHEST_IRQ_LEVEL
|
||||||
|
|
|
@ -27,6 +27,17 @@
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "led.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[] = {
|
static const char* const irqname[] = {
|
||||||
"", "", "", "", "IllInstr", "", "IllSltIn","","",
|
"", "", "", "", "IllInstr", "", "IllSltIn","","",
|
||||||
"CPUAdrEr", "DMAAdrEr", "NMI", "UserBrk",
|
"CPUAdrEr", "DMAAdrEr", "NMI", "UserBrk",
|
||||||
|
|
|
@ -126,4 +126,11 @@ static inline uint32_t swap_odd_even32(uint32_t value)
|
||||||
return 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 */
|
#endif /* SYSTEM_TARGET_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue