avr: Introduce optimized timer_is_before()

Provide hand-coded assembler for timer_is_before() on AVR as that code
is used frequently in the time-critical timer dispatch loop and gcc
doesn't do a good job at compiling that comparison code.  Remove the
no longer needed waketime+1 hack from reschedule_timer().

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2017-03-24 23:17:23 -04:00
parent 60e488eb17
commit 4dfa6c6ee4
2 changed files with 22 additions and 9 deletions

View file

@ -127,9 +127,9 @@ sched_del_timer(struct timer *del)
static struct timer *
reschedule_timer(struct timer *t)
{
uint32_t waketime = t->waketime;
struct timer *pos = t->next;
uint32_t minwaketime = t->waketime + 1;
if (!timer_is_before(pos->waketime, minwaketime))
if (timer_is_before(waketime, pos->waketime))
// Timer is still the first - no insertion needed
return t;
@ -142,7 +142,7 @@ reschedule_timer(struct timer *t)
// micro optimization for AVR - reduces register pressure
asm("" : "+r"(prev) : : "memory");
pos = pos->next;
if (!timer_is_before(pos->waketime, minwaketime))
if (timer_is_before(waketime, pos->waketime))
break;
}
t->next = pos;