1#include <stdint.h>
2#include <stddef.h>
3#include <stdlib.h>
4
5#include "../../../include/libbase64.h"
6#include "../../tables/tables.h"
7#include "../../codecs.h"
8#include "config.h"
9#include "../../env.h"
10
11#if HAVE_SSSE3
12#include <tmmintrin.h>
13
14// Only enable inline assembly on supported compilers and on 64-bit CPUs.
15// 32-bit CPUs with SSSE3 support, such as low-end Atoms, only have eight XMM
16// registers, which is not enough to run the inline assembly.
17#ifndef BASE64_SSSE3_USE_ASM
18# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64
19#  define BASE64_SSSE3_USE_ASM 1
20# else
21#  define BASE64_SSSE3_USE_ASM 0
22# endif
23#endif
24
25#include "dec_reshuffle.c"
26#include "dec_loop.c"
27
28#if BASE64_SSSE3_USE_ASM
29# include "enc_loop_asm.c"
30#else
31# include "enc_reshuffle.c"
32# include "enc_translate.c"
33# include "enc_loop.c"
34#endif
35
36#endif	// HAVE_SSSE3
37
38BASE64_ENC_FUNCTION(ssse3)
39{
40#if HAVE_SSSE3
41	#include "../generic/enc_head.c"
42	enc_loop_ssse3(&s, &slen, &o, &olen);
43	#include "../generic/enc_tail.c"
44#else
45	BASE64_ENC_STUB
46#endif
47}
48
49BASE64_DEC_FUNCTION(ssse3)
50{
51#if HAVE_SSSE3
52	#include "../generic/dec_head.c"
53	dec_loop_ssse3(&s, &slen, &o, &olen);
54	#include "../generic/dec_tail.c"
55#else
56	BASE64_DEC_STUB
57#endif
58}
59