Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FastLED/FastLED.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkriegsman@gmail.com <kriegsman@gmail.com@4ad4ec5c-605d-bd5c-5796-512c9b60011b>2013-05-10 06:11:30 +0400
committerkriegsman@gmail.com <kriegsman@gmail.com@4ad4ec5c-605d-bd5c-5796-512c9b60011b>2013-05-10 06:11:30 +0400
commit2bfc63e5ad10459d5faf70fda49e52177fcbbd41 (patch)
treeba695ea754f9dd592dd031fb102e58f162b06c55 /lib8tion.cpp
parent04e31d2959649a4ec7c8f5b8d6e62fd47972847e (diff)
MEK: linear interpolations (lerps), scaling, and an easing function.In this episode, we learn that avr-gcc will generate a fast inline bit-shift for uint32_t / 256, but a call to an external long division routine for signed int32_t / 256. I believe the term of art for this is 'missed optimization'.
Diffstat (limited to 'lib8tion.cpp')
-rw-r--r--lib8tion.cpp122
1 files changed, 61 insertions, 61 deletions
diff --git a/lib8tion.cpp b/lib8tion.cpp
index ffe4bd0b..224d44f2 100644
--- a/lib8tion.cpp
+++ b/lib8tion.cpp
@@ -25,27 +25,27 @@ uint16_t rand16seed = RAND16_SEED;
#if defined(__AVR__)
extern "C" {
//__attribute__ ((noinline))
-void * memset8 ( void * ptr, int val, uint16_t num )
+void * memset8 ( void * ptr, uint8_t val, uint16_t num )
{
asm volatile(
- " movw r26, %[ptr] \n\t"
- " sbrs %A[num], 0 \n\t"
- " rjmp Lseteven_%= \n\t"
- " rjmp Lsetodd_%= \n\t"
- "Lsetloop_%=: \n\t"
- " st X+, %A[val] \n\t"
- "Lsetodd_%=: \n\t"
- " st X+, %A[val] \n\t"
- "Lseteven_%=: \n\t"
- " subi %A[num], 2 \n\t"
- " brcc Lsetloop_%= \n\t"
- " sbci %B[num], 0 \n\t"
- " brcc Lsetloop_%= \n\t"
- : [num] "+r" (num)
- : [ptr] "r" (ptr),
- [val] "r" (val)
- : "memory"
- );
+ " movw r26, %[ptr] \n\t"
+ " sbrs %A[num], 0 \n\t"
+ " rjmp Lseteven_%= \n\t"
+ " rjmp Lsetodd_%= \n\t"
+ "Lsetloop_%=: \n\t"
+ " st X+, %[val] \n\t"
+ "Lsetodd_%=: \n\t"
+ " st X+, %[val] \n\t"
+ "Lseteven_%=: \n\t"
+ " subi %A[num], 2 \n\t"
+ " brcc Lsetloop_%= \n\t"
+ " sbci %B[num], 0 \n\t"
+ " brcc Lsetloop_%= \n\t"
+ : [num] "+r" (num)
+ : [ptr] "r" (ptr),
+ [val] "r" (val)
+ : "memory"
+ );
return ptr;
}
@@ -55,27 +55,27 @@ void * memset8 ( void * ptr, int val, uint16_t num )
void * memcpy8 ( void * dst, void* src, uint16_t num )
{
asm volatile(
- " movw r30, %[src] \n\t"
- " movw r26, %[dst] \n\t"
- " sbrs %A[num], 0 \n\t"
- " rjmp Lcpyeven_%= \n\t"
- " rjmp Lcpyodd_%= \n\t"
- "Lcpyloop_%=: \n\t"
- " ld __tmp_reg__, Z+ \n\t"
- " st X+, __tmp_reg__ \n\t"
- "Lcpyodd_%=: \n\t"
- " ld __tmp_reg__, Z+ \n\t"
- " st X+, __tmp_reg__ \n\t"
- "Lcpyeven_%=: \n\t"
- " subi %A[num], 2 \n\t"
- " brcc Lcpyloop_%= \n\t"
- " sbci %B[num], 0 \n\t"
- " brcc Lcpyloop_%= \n\t"
- : [num] "+r" (num)
- : [src] "r" (src),
- [dst] "r" (dst)
- : "memory"
- );
+ " movw r30, %[src] \n\t"
+ " movw r26, %[dst] \n\t"
+ " sbrs %A[num], 0 \n\t"
+ " rjmp Lcpyeven_%= \n\t"
+ " rjmp Lcpyodd_%= \n\t"
+ "Lcpyloop_%=: \n\t"
+ " ld __tmp_reg__, Z+ \n\t"
+ " st X+, __tmp_reg__ \n\t"
+ "Lcpyodd_%=: \n\t"
+ " ld __tmp_reg__, Z+ \n\t"
+ " st X+, __tmp_reg__ \n\t"
+ "Lcpyeven_%=: \n\t"
+ " subi %A[num], 2 \n\t"
+ " brcc Lcpyloop_%= \n\t"
+ " sbci %B[num], 0 \n\t"
+ " brcc Lcpyloop_%= \n\t"
+ : [num] "+r" (num)
+ : [src] "r" (src),
+ [dst] "r" (dst)
+ : "memory"
+ );
return dst;
}
@@ -90,27 +90,27 @@ void * memmove8 ( void * dst, void* src, uint16_t num )
dst = (char*)dst + num;
src = (char*)src + num;
asm volatile(
- " movw r30, %[src] \n\t"
- " movw r26, %[dst] \n\t"
- " sbrs %A[num], 0 \n\t"
- " rjmp Lmoveven_%= \n\t"
- " rjmp Lmovodd_%= \n\t"
- "Lmovloop_%=: \n\t"
- " ld __tmp_reg__, -Z \n\t"
- " st -X, __tmp_reg__ \n\t"
- "Lmovodd_%=: \n\t"
- " ld __tmp_reg__, -Z \n\t"
- " st -X, __tmp_reg__ \n\t"
- "Lmoveven_%=: \n\t"
- " subi %A[num], 2 \n\t"
- " brcc Lmovloop_%= \n\t"
- " sbci %B[num], 0 \n\t"
- " brcc Lmovloop_%= \n\t"
- : [num] "+r" (num)
- : [src] "r" (src),
- [dst] "r" (dst)
- : "memory"
- );
+ " movw r30, %[src] \n\t"
+ " movw r26, %[dst] \n\t"
+ " sbrs %A[num], 0 \n\t"
+ " rjmp Lmoveven_%= \n\t"
+ " rjmp Lmovodd_%= \n\t"
+ "Lmovloop_%=: \n\t"
+ " ld __tmp_reg__, -Z \n\t"
+ " st -X, __tmp_reg__ \n\t"
+ "Lmovodd_%=: \n\t"
+ " ld __tmp_reg__, -Z \n\t"
+ " st -X, __tmp_reg__ \n\t"
+ "Lmoveven_%=: \n\t"
+ " subi %A[num], 2 \n\t"
+ " brcc Lmovloop_%= \n\t"
+ " sbci %B[num], 0 \n\t"
+ " brcc Lmovloop_%= \n\t"
+ : [num] "+r" (num)
+ : [src] "r" (src),
+ [dst] "r" (dst)
+ : "memory"
+ );
return dst;
}
}