31 lines
856 B
C
31 lines
856 B
C
#ifndef COSMOPOLITAN_DSP_CORE_C1331_H_
|
||
#define COSMOPOLITAN_DSP_CORE_C1331_H_
|
||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||
|
||
/**
|
||
* Byte sized kernel for resampling memory in half.
|
||
*
|
||
* @define (1*𝑎 + 3*𝑏 + 3*𝑐 + 1*𝑑) / (1 + 3 + 3 + 1)
|
||
* @see C161() afterward for superior sin(𝑥)/𝑥
|
||
* @limit [0,255] → [0..2,044] → [0..255]
|
||
*/
|
||
forceinline pureconst artificial unsigned char C1331(unsigned char al,
|
||
unsigned char bl,
|
||
unsigned char cl,
|
||
unsigned char dl) {
|
||
short ax, bx;
|
||
bx = bl;
|
||
bx += cl;
|
||
bx *= 3;
|
||
ax = al;
|
||
ax += dl;
|
||
ax += bx;
|
||
ax += 4;
|
||
ax >>= 3;
|
||
al = ax;
|
||
return al;
|
||
}
|
||
|
||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||
#endif /* COSMOPOLITAN_DSP_CORE_C1331_H_ */
|