ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
cells.h File Reference

Go to the source code of this file.

Data Structures

struct  simd_cells_t
 The useful part of simd cells is in luminance: together they describe what is pending, who owns it, and how much data is valid. Keep the object with its parent operation and use the parent cleanup path. Row callbacks read/write exactly count elements. Glyph correlation reads 16 samples. Only short row tails use scalar code. More...

Macros

#define DECLARE_SIMD_CELLS(isa)

Functions

int glyph_shape_correlation_scalar (const int16_t samples[16], const int16_t mask[16])
int glyph_shape_correlation_sse2 (const int16_t samples[16], const int16_t mask[16])
int glyph_shape_correlation_avx2 (const int16_t samples[16], const int16_t mask[16])
int glyph_shape_correlation_neon (const int16_t samples[16], const int16_t mask[16])
int glyph_shape_correlation_sve (const int16_t samples[16], const int16_t mask[16])
const simd_cells_t * simd_cells_backend (void)
void simd_pack_scalar (const uint8_t *, uint32_t *, size_t)
void simd_lookup_scalar (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_scalar (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_scalar (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_scalar (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_pack_sse2 (const uint8_t *, uint32_t *, size_t)
void simd_lookup_sse2 (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_sse2 (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_sse2 (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_sse2 (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_pack_ssse3 (const uint8_t *, uint32_t *, size_t)
void simd_lookup_ssse3 (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_ssse3 (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_ssse3 (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_ssse3 (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_pack_avx2 (const uint8_t *, uint32_t *, size_t)
void simd_lookup_avx2 (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_avx2 (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_avx2 (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_avx2 (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_pack_neon (const uint8_t *, uint32_t *, size_t)
void simd_lookup_neon (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_neon (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_neon (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_neon (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_pack_sve (const uint8_t *, uint32_t *, size_t)
void simd_lookup_sve (const uint8_t *, const uint32_t[64], uint32_t *, size_t)
void simd_quantize_sve (const uint32_t *, uint32_t *, size_t, unsigned)
void simd_halfblock_sve (const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, const uint32_t[5])
size_t simd_run_sve (const uint32_t *, const uint32_t *, const uint32_t *, size_t)
void simd_emit_mono_neon (outbuf_t *out, const uint32_t *glyph, size_t count)

Variables

const simd_cells_t simd_cells_scalar
const simd_cells_t simd_cells_sse2
const simd_cells_t simd_cells_ssse3
const simd_cells_t simd_cells_avx2
const simd_cells_t simd_cells_neon
const simd_cells_t simd_cells_sve

Macro Definition Documentation

◆ DECLARE_SIMD_CELLS

#define DECLARE_SIMD_CELLS ( isa)
Value:
void simd_pack_##isa(const uint8_t *, uint32_t *, size_t); \
void simd_lookup_##isa(const uint8_t *, const uint32_t[64], uint32_t *, size_t); \
void simd_quantize_##isa(const uint32_t *, uint32_t *, size_t, unsigned); \
void simd_halfblock_##isa(const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, \
const uint32_t[5]); \
size_t simd_run_##isa(const uint32_t *, const uint32_t *, const uint32_t *, size_t)
unsigned int uint32_t
Definition common.h:62
unsigned char uint8_t
Definition common.h:60

Definition at line 30 of file cells.h.

30#define DECLARE_SIMD_CELLS(isa) \
31 void simd_pack_##isa(const uint8_t *, uint32_t *, size_t); \
32 void simd_lookup_##isa(const uint8_t *, const uint32_t[64], uint32_t *, size_t); \
33 void simd_quantize_##isa(const uint32_t *, uint32_t *, size_t, unsigned); \
34 void simd_halfblock_##isa(const uint32_t *, const uint32_t *, uint32_t *, uint32_t *, uint32_t *, size_t, unsigned, \
35 const uint32_t[5]); \
36 size_t simd_run_##isa(const uint32_t *, const uint32_t *, const uint32_t *, size_t)

Function Documentation

◆ glyph_shape_correlation_avx2()

int glyph_shape_correlation_avx2 ( const int16_t samples[16],
const int16_t mask[16] )

Definition at line 8 of file avx2/luminance.c.

8 {
9 __m256i a = _mm256_loadu_si256((const __m256i *)(const void *)samples);
10 __m256i b = _mm256_loadu_si256((const __m256i *)(const void *)mask);
11 __m256i products = _mm256_madd_epi16(a, b);
12 __m128i sums = _mm_add_epi32(_mm256_castsi256_si128(products), _mm256_extracti128_si256(products, 1));
13 int32_t lanes[4];
14 _mm_storeu_si128((__m128i *)(void *)lanes, sums);
15 return lanes[0] + lanes[1] + lanes[2] + lanes[3];
16}

◆ glyph_shape_correlation_neon()

int glyph_shape_correlation_neon ( const int16_t samples[16],
const int16_t mask[16] )

Definition at line 33 of file neon/luminance.c.

33 {
34 int16x8_t a0 = vld1q_s16(samples), a1 = vld1q_s16(samples + 8);
35 int16x8_t b0 = vld1q_s16(mask), b1 = vld1q_s16(mask + 8);
36 int32x4_t sums = vmull_s16(vget_low_s16(a0), vget_low_s16(b0));
37 sums = vmlal_s16(sums, vget_high_s16(a0), vget_high_s16(b0));
38 sums = vmlal_s16(sums, vget_low_s16(a1), vget_low_s16(b1));
39 sums = vmlal_s16(sums, vget_high_s16(a1), vget_high_s16(b1));
40 int32_t lanes[4];
41 vst1q_s32(lanes, sums);
42 return lanes[0] + lanes[1] + lanes[2] + lanes[3];
43}

◆ glyph_shape_correlation_scalar()

int glyph_shape_correlation_scalar ( const int16_t samples[16],
const int16_t mask[16] )

Definition at line 4 of file cells.c.

4 {
5 int dot = 0;
6 for (int i = 0; i < 16; ++i)
7 dot += samples[i] * mask[i];
8 return dot;
9}

Referenced by ascii_render_glyph_match_mode().

◆ glyph_shape_correlation_sse2()

int glyph_shape_correlation_sse2 ( const int16_t samples[16],
const int16_t mask[16] )

Definition at line 7 of file sse2/luminance.c.

7 {
8 __m128i a0 = _mm_loadu_si128((const __m128i *)(const void *)samples);
9 __m128i a1 = _mm_loadu_si128((const __m128i *)(const void *)(samples + 8));
10 __m128i b0 = _mm_loadu_si128((const __m128i *)(const void *)mask);
11 __m128i b1 = _mm_loadu_si128((const __m128i *)(const void *)(mask + 8));
12 __m128i sums = _mm_add_epi32(_mm_madd_epi16(a0, b0), _mm_madd_epi16(a1, b1));
13 int32_t lanes[4];
14 _mm_storeu_si128((__m128i *)(void *)lanes, sums);
15 return lanes[0] + lanes[1] + lanes[2] + lanes[3];
16}

◆ glyph_shape_correlation_sve()

int glyph_shape_correlation_sve ( const int16_t samples[16],
const int16_t mask[16] )

Definition at line 7 of file sve/luminance.c.

7 {
8 int sum = 0;
9 for (uint64_t i = 0; i < 16; i += svcntw()) {
10 svbool_t active = svwhilelt_b32(i, (uint64_t)16);
11 svint32_t a = svld1sh_s32(active, samples + i);
12 svint32_t b = svld1sh_s32(active, mask + i);
13 sum += (int)svaddv_s32(active, svmul_s32_x(active, a, b));
14 }
15 return sum;
16}
unsigned long long uint64_t
Definition common.h:63

◆ simd_cells_backend()

const simd_cells_t * simd_cells_backend ( void )

Definition at line 70 of file cells.c.

70 {
72 (void)features;
73#if SIMD_SUPPORT_SSE2
74 if (features == CPU_FEATURE_SSE2)
75 return &simd_cells_sse2;
76#endif
77#if SIMD_SUPPORT_SSSE3
78 if (features == CPU_FEATURE_SSSE3)
79 return &simd_cells_ssse3;
80#endif
81#if SIMD_SUPPORT_AVX2
82 if (features == CPU_FEATURE_AVX2)
83 return &simd_cells_avx2;
84#endif
85#if SIMD_SUPPORT_NEON
86 if (features == CPU_FEATURE_NEON)
87 return &simd_cells_neon;
88#endif
89#if SIMD_SUPPORT_SVE
90 if (features == CPU_FEATURE_SVE)
91 return &simd_cells_sve;
92#endif
93 return &simd_cells_scalar;
94}
const simd_cells_t simd_cells_scalar
Definition cells.c:69
const simd_cells_t simd_cells_sve
const simd_cells_t simd_cells_sse2
const simd_cells_t simd_cells_avx2
const simd_cells_t simd_cells_ssse3
const simd_cells_t simd_cells_neon
const simd_backend_t * simd_backend(void)
Definition dispatch.c:36
uint32_t required_features
Definition dispatch.h:14

References simd_backend_t::required_features, simd_backend(), simd_cells_avx2, simd_cells_neon, simd_cells_scalar, simd_cells_sse2, simd_cells_ssse3, and simd_cells_sve.

Referenced by ascii_convert(), ascii_convert_with_buffers_stabilized(), image_print(), image_print_16color(), image_print_16color_dithered(), image_print_16color_dithered_with_background(), image_print_256color(), image_print_color(), image_print_color_background(), image_print_color_simd(), image_print_color_utf8(), and image_print_with_capabilities().

◆ simd_emit_mono_neon()

void simd_emit_mono_neon ( outbuf_t * out,
const uint32_t * glyph,
size_t count )

References out.

◆ simd_halfblock_avx2()

void simd_halfblock_avx2 ( const uint32_t * ,
const uint32_t * ,
uint32_t * ,
uint32_t * ,
uint32_t * ,
size_t ,
unsigned ,
const uint32_t [5] )

◆ simd_halfblock_neon()

void simd_halfblock_neon ( const uint32_t * ,
const uint32_t * ,
uint32_t * ,
uint32_t * ,
uint32_t * ,
size_t ,
unsigned ,
const uint32_t [5] )

◆ simd_halfblock_scalar()

void simd_halfblock_scalar ( const uint32_t * top,
const uint32_t * bottom,
uint32_t * glyph,
uint32_t * fg,
uint32_t * bg,
size_t count,
unsigned mode,
const uint32_t keys[5] )

Definition at line 30 of file cells.c.

31 {
32 for (size_t i = 0; i < count; ++i) {
33 uint32_t t = top[i], b = bottom[i];
34 unsigned yt = (76 * (t >> 16) + 150 * ((t >> 8) & 255) + 29 * (t & 255)) >> 8;
35 unsigned yb = (76 * (b >> 16) + 150 * ((b >> 8) & 255) + 29 * (b & 255)) >> 8;
36 bool transparent = mode == 0 ? yt < 16 && yb < 16 : t == 0 && b == 0;
37 glyph[i] = transparent ? (uint32_t)' ' : mode == 0 ? keys[yt >> 6] : keys[4];
38 if (mode == 0 || transparent)
39 fg[i] = bg[i] = UINT32_MAX;
40 }
41}

Referenced by simd_halfblock_SIMD_CELL_ISA().

◆ simd_halfblock_sse2()

void simd_halfblock_sse2 ( const uint32_t * ,
const uint32_t * ,
uint32_t * ,
uint32_t * ,
uint32_t * ,
size_t ,
unsigned ,
const uint32_t [5] )

◆ simd_halfblock_ssse3()

void simd_halfblock_ssse3 ( const uint32_t * ,
const uint32_t * ,
uint32_t * ,
uint32_t * ,
uint32_t * ,
size_t ,
unsigned ,
const uint32_t [5] )

◆ simd_halfblock_sve()

void simd_halfblock_sve ( const uint32_t * ,
const uint32_t * ,
uint32_t * ,
uint32_t * ,
uint32_t * ,
size_t ,
unsigned ,
const uint32_t [5] )

◆ simd_lookup_avx2()

void simd_lookup_avx2 ( const uint8_t * ,
const uint32_t [64],
uint32_t * ,
size_t  )

◆ simd_lookup_neon()

void simd_lookup_neon ( const uint8_t * ,
const uint32_t [64],
uint32_t * ,
size_t  )

◆ simd_lookup_scalar()

void simd_lookup_scalar ( const uint8_t * luma,
const uint32_t table[64],
uint32_t * out,
size_t count )

Definition at line 14 of file cells.c.

14 {
15 for (size_t i = 0; i < count; ++i)
16 out[i] = table[luma[i] >> 2];
17}
static bool size_t gotel_query_t * out
Definition queries.h:8

References out.

Referenced by simd_lookup_SIMD_CELL_ISA().

◆ simd_lookup_sse2()

void simd_lookup_sse2 ( const uint8_t * ,
const uint32_t [64],
uint32_t * ,
size_t  )

◆ simd_lookup_ssse3()

void simd_lookup_ssse3 ( const uint8_t * ,
const uint32_t [64],
uint32_t * ,
size_t  )

◆ simd_lookup_sve()

void simd_lookup_sve ( const uint8_t * ,
const uint32_t [64],
uint32_t * ,
size_t  )

◆ simd_pack_avx2()

void simd_pack_avx2 ( const uint8_t * ,
uint32_t * ,
size_t  )

◆ simd_pack_neon()

void simd_pack_neon ( const uint8_t * ,
uint32_t * ,
size_t  )

◆ simd_pack_scalar()

void simd_pack_scalar ( const uint8_t * rgb,
uint32_t * out,
size_t count )

Definition at line 10 of file cells.c.

10 {
11 for (size_t i = 0; i < count; ++i)
12 out[i] = ((uint32_t)rgb[3 * i] << 16) | ((uint32_t)rgb[3 * i + 1] << 8) | rgb[3 * i + 2];
13}

References out.

Referenced by simd_pack_SIMD_CELL_ISA().

◆ simd_pack_sse2()

void simd_pack_sse2 ( const uint8_t * ,
uint32_t * ,
size_t  )

◆ simd_pack_ssse3()

void simd_pack_ssse3 ( const uint8_t * ,
uint32_t * ,
size_t  )

◆ simd_pack_sve()

void simd_pack_sve ( const uint8_t * ,
uint32_t * ,
size_t  )

◆ simd_quantize_avx2()

void simd_quantize_avx2 ( const uint32_t * ,
uint32_t * ,
size_t ,
unsigned  )

◆ simd_quantize_neon()

void simd_quantize_neon ( const uint32_t * ,
uint32_t * ,
size_t ,
unsigned  )

◆ simd_quantize_scalar()

void simd_quantize_scalar ( const uint32_t * rgb,
uint32_t * out,
size_t count,
unsigned colors )

Definition at line 18 of file cells.c.

18 {
19 for (size_t i = 0; i < count; ++i) {
20 uint8_t r = (uint8_t)(rgb[i] >> 16), g = (uint8_t)(rgb[i] >> 8), b = (uint8_t)rgb[i];
21 out[i] = colors == 16 ? rgb_to_16color(r, g, b) : rgb_to_256color(r, g, b);
22 }
23}
unsigned char colors[(512 *256 *2) *3]
Definition fft.c:22
uint8_t rgb_to_16color(uint8_t r, uint8_t g, uint8_t b)
Definition ansi.c:354
uint8_t rgb_to_256color(uint8_t r, uint8_t g, uint8_t b)
Definition ansi.c:251

References colors, out, rgb_to_16color(), and rgb_to_256color().

Referenced by simd_quantize_SIMD_CELL_ISA().

◆ simd_quantize_sse2()

void simd_quantize_sse2 ( const uint32_t * ,
uint32_t * ,
size_t ,
unsigned  )

◆ simd_quantize_ssse3()

void simd_quantize_ssse3 ( const uint32_t * ,
uint32_t * ,
size_t ,
unsigned  )

◆ simd_quantize_sve()

void simd_quantize_sve ( const uint32_t * ,
uint32_t * ,
size_t ,
unsigned  )

◆ simd_run_avx2()

size_t simd_run_avx2 ( const uint32_t * ,
const uint32_t * ,
const uint32_t * ,
size_t  )

◆ simd_run_neon()

size_t simd_run_neon ( const uint32_t * ,
const uint32_t * ,
const uint32_t * ,
size_t  )

◆ simd_run_scalar()

size_t simd_run_scalar ( const uint32_t * glyph,
const uint32_t * fg,
const uint32_t * bg,
size_t count )

Definition at line 24 of file cells.c.

24 {
25 size_t i = 1;
26 for (; i < count && glyph[i] == glyph[0] && fg[i] == fg[0] && bg[i] == bg[0]; ++i) {
27 }
28 return count ? i : 0;
29}

◆ simd_run_sse2()

size_t simd_run_sse2 ( const uint32_t * ,
const uint32_t * ,
const uint32_t * ,
size_t  )

◆ simd_run_ssse3()

size_t simd_run_ssse3 ( const uint32_t * ,
const uint32_t * ,
const uint32_t * ,
size_t  )

◆ simd_run_sve()

size_t simd_run_sve ( const uint32_t * ,
const uint32_t * ,
const uint32_t * ,
size_t  )

Variable Documentation

◆ simd_cells_avx2

◆ simd_cells_neon

◆ simd_cells_scalar

◆ simd_cells_sse2

◆ simd_cells_ssse3

◆ simd_cells_sve