Virtual machine compilation
#include "" #include <> #include <> #include <> #include <> int main(void) { // Initialize the hasher. blake3_hasher hasher; blake3_hasher_init(&hasher); // Read input bytes from stdin. unsigned char buf[65536]; while (1) { ssize_t n = read(STDIN_FILENO, buf, sizeof(buf)); if (n > 0) { blake3_hasher_update(&hasher, buf, n); } else if (n == 0) { break; // end of file } else { fprintf(stderr, "read failed: %s\n", strerror(errno)); return 1; } } // Finalize the hash. BLAKE3_OUT_LEN is the default output length, 32 bytes. uint8_t output[BLAKE3_OUT_LEN]; blake3_hasher_finalize(&hasher, output, BLAKE3_OUT_LEN); // Print the hash as hexadecimal. for (size_t i = 0; i < BLAKE3_OUT_LEN; i++) { printf("%02x", output[i]); } printf("\n"); return 0; } gcc -O3 -o example blake3_dispatch.c blake3_portable.c \ blake3_sse2_x86-64_unix.S blake3_sse41_x86-64_unix.S blake3_avx2_x86-64_unix.S \ blake3_avx512_x86-64_unix.S
Virtual machine running computing
wzh@wzh:~/work/BLAKE3/c$ ls -l total 1332 -rw-rw-r-- 1 wzh wzh 12452 3moon 21 16:59 blake3_avx2.c -rw-rw-r-- 1 wzh wzh 66050 3moon 21 16:59 blake3_avx2_x86-64_unix.S -rw-rw-r-- 1 wzh wzh 66735 3moon 21 16:59 blake3_avx2_x86-64_windows_gnu.S -rw-rw-r-- 1 wzh wzh 65948 3moon 21 16:59 blake3_avx2_x86-64_windows_msvc.asm -rw-rw-r-- 1 wzh wzh 54592 3moon 21 16:59 blake3_avx512.c -rw-rw-r-- 1 wzh wzh 161672 3moon 21 16:59 blake3_avx512_x86-64_unix.S -rw-rw-r-- 1 wzh wzh 91003 3moon 21 16:59 blake3_avx512_x86-64_windows_gnu.S -rw-rw-r-- 1 wzh wzh 91605 3moon 21 16:59 blake3_avx512_x86-64_windows_msvc.asm -rw-rw-r-- 1 wzh wzh 28903 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 108 3moon 21 16:59 drwxrwxr-x 4 wzh wzh 4096 3moon 21 16:59 blake3_c_rust_bindings -rw-rw-r-- 1 wzh wzh 9165 3moon 21 16:59 blake3_dispatch.c -rw-rw-r-- 1 wzh wzh 2901 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 12030 3moon 21 16:59 blake3_impl.h -rw-rw-r-- 1 wzh wzh 13833 3moon 21 16:59 blake3_neon.c -rw-rw-r-- 1 wzh wzh 5889 3moon 21 16:59 blake3_portable.c -rw-rw-r-- 1 wzh wzh 21005 3moon 21 16:59 blake3_sse2.c -rw-rw-r-- 1 wzh wzh 68858 3moon 21 16:59 blake3_sse2_x86-64_unix.S -rw-rw-r-- 1 wzh wzh 71202 3moon 21 16:59 blake3_sse2_x86-64_windows_gnu.S -rw-rw-r-- 1 wzh wzh 70982 3moon 21 16:59 blake3_sse2_x86-64_windows_msvc.asm -rw-rw-r-- 1 wzh wzh 20813 3moon 21 16:59 blake3_sse41.c -rw-rw-r-- 1 wzh wzh 61143 3moon 21 16:59 blake3_sse41_x86-64_unix.S -rw-rw-r-- 1 wzh wzh 63459 3moon 21 16:59 blake3_sse41_x86-64_windows_gnu.S -rw-rw-r-- 1 wzh wzh 63194 3moon 21 16:59 blake3_sse41_x86-64_windows_msvc.asm -rw-rw-r-- 1 wzh wzh 1301 3moon 21 16:59 blake3_tbb.cpp drwxrwxr-x 3 wzh wzh 4096 3moon 21 16:59 cmake -rw-rw-r-- 1 wzh wzh 13364 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 1848 3moon 21 16:59 drwxrwxr-x 3 wzh wzh 4096 3moon 21 16:59 dependencies -rwxrwxr-x 1 wzh wzh 101888 3moon 21 16:59 example -rw-rw-r-- 1 wzh wzh 868 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 1625 3moon 21 16:59 example_tbb.c -rw-rw-r-- 1 wzh wzh 314 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 4043 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 2057 3moon 21 16:59 -rw-rw-r-- 1 wzh wzh 13644 3moon 21 16:59 -rwxrwxr-x 1 wzh wzh 3654 3moon 21 16:59 wzh@wzh:~/work/BLAKE3/c$ echo "Hello, World!" | ./example 6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2 wzh@wzh:~/work/BLAKE3/c$ echo "Hello, World!" | ./example 6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2 wzh@wzh:~/work/BLAKE3/c$
3. Cross-compilation
mips-linux-uclibc-gnu-gcc -O3 -o example blake3_dispatch.c blake3_portable.c -std=c99
4. Run after cross-compile
[root@mvt:kangshifu]# echo "Hello, World!" | ./example
6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2
5. Conclusion
1. The space occupied by the compilation of C language in the virtual machine is very small, and assembly instruction set optimization is used. The example occupies 101888 bytes, which can complete the calculation of BLAKE3.
2. The space occupied by the C language in embedded form is smaller after compilation, and the example occupies 35137 bytes, which can complete the calculation of BLAKE3.