1 add_subdirectory(memory_utils)
8 .memory_utils.inline_bzero
9 .memory_utils.inline_memcpy
11 libc.src.__support.common
12 libc.src.__support.CPP.bitset
16 allocating_string_utils
18 allocating_string_utils.h
20 .memory_utils.inline_memcpy
22 libc.src.__support.CPP.optional
23 libc.src.__support.macros.config
26 add_entrypoint_object(
34 add_entrypoint_object(
44 add_entrypoint_object(
52 add_entrypoint_object(
59 .memory_utils.inline_memcpy
62 add_entrypoint_object(
69 .memory_utils.inline_memmem
72 add_entrypoint_object(
82 add_entrypoint_object(
90 add_entrypoint_object(
100 add_entrypoint_object(
111 add_entrypoint_object(
118 .memory_utils.inline_bzero
121 add_entrypoint_object(
132 add_entrypoint_object(
142 add_entrypoint_object(
152 add_entrypoint_object(
159 .memory_utils.inline_strcmp
162 add_entrypoint_object(
169 .memory_utils.inline_strcmp
170 libc.src.__support.ctype_utils
173 add_entrypoint_object(
180 .memory_utils.inline_strstr
181 libc.src.__support.ctype_utils
184 add_entrypoint_object(
192 add_entrypoint_object(
199 .memory_utils.inline_memcpy
203 add_entrypoint_object(
213 add_entrypoint_object(
220 .memory_utils.inline_memcpy
226 add_entrypoint_object(
233 libc.src.__support.StringUtil.error_to_string
236 add_entrypoint_object(
243 libc.src.__support.StringUtil.error_to_string
246 add_entrypoint_object(
257 add_entrypoint_object(
268 add_entrypoint_object(
279 add_entrypoint_object(
290 add_entrypoint_object(
297 .memory_utils.inline_strcmp
300 add_entrypoint_object(
307 .memory_utils.inline_strcmp
308 libc.src.__support.ctype_utils
311 add_entrypoint_object(
319 add_entrypoint_object(
326 .memory_utils.inline_memcpy
329 libc.src.__support.CPP.new
332 add_entrypoint_object(
342 add_entrypoint_object(
352 add_entrypoint_object(
362 add_entrypoint_object(
372 add_entrypoint_object(
379 libc.src.__support.StringUtil.signal_to_string
382 add_entrypoint_object(
389 libc.src.__support.CPP.bitset
392 add_entrypoint_object(
399 .memory_utils.inline_strstr
402 add_entrypoint_object(
412 add_entrypoint_object(
422 add_entrypoint_object(
430 .memory_utils.inline_memcpy
433 # Helper to define a function with multiple implementations
434 # - Computes flags to satisfy required/rejected features and arch,
435 # - Declares an entry point,
436 # - Attach the REQUIRE_CPU_FEATURES property to the target,
437 # - Add the fully qualified target to `${name}_implementations` global property for tests.
438 function(add_implementation name impl_name)
439 cmake_parse_arguments(
441 "" # Optional arguments
442 "" # Single value arguments
443 "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
446 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
447 # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
448 foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
449 list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
453 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
454 # Prevent warning when passing x86 SIMD types as template arguments.
455 # e.g. "warning: ignoring attributes on template argument ā__m128iā [-Wignored-attributes]"
456 list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
459 add_entrypoint_object(${impl_name}
461 SRCS ${ADD_IMPL_SRCS}
462 HDRS ${ADD_IMPL_HDRS}
463 DEPENDS ${ADD_IMPL_DEPENDS}
464 COMPILE_OPTIONS -O3 ${ADD_IMPL_COMPILE_OPTIONS}
466 get_fq_target_name(${impl_name} fq_target_name)
467 set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
468 set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
471 # ------------------------------------------------------------------------------
473 # ------------------------------------------------------------------------------
475 function(add_bcmp bcmp_name)
476 add_implementation(bcmp ${bcmp_name}
477 SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
478 HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
480 .memory_utils.memory_utils
486 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
487 add_bcmp(bcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
488 add_bcmp(bcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
489 add_bcmp(bcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
490 add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
491 add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
494 add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
498 # ------------------------------------------------------------------------------
500 # ------------------------------------------------------------------------------
502 function(add_bzero bzero_name)
503 add_implementation(bzero ${bzero_name}
504 SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
505 HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
507 .memory_utils.inline_memset
513 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
514 add_bzero(bzero_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
515 add_bzero(bzero_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
516 add_bzero(bzero_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
517 add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
518 add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
521 add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
525 # ------------------------------------------------------------------------------
527 # ------------------------------------------------------------------------------
529 function(add_memcmp memcmp_name)
530 add_implementation(memcmp ${memcmp_name}
531 SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp
532 HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h
534 .memory_utils.inline_memcmp
540 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
541 add_memcmp(memcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
542 add_memcmp(memcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
543 add_memcmp(memcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
544 add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
545 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
547 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
548 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
551 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
555 # ------------------------------------------------------------------------------
557 # ------------------------------------------------------------------------------
559 function(add_memcpy memcpy_name)
560 add_implementation(memcpy ${memcpy_name}
561 SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp
562 HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
564 .memory_utils.inline_memcpy
570 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
571 add_memcpy(memcpy_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
572 add_memcpy(memcpy_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
573 add_memcpy(memcpy_x86_64_opt_avx COMPILE_OPTIONS -march=sandybridge REQUIRE AVX)
574 add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
575 add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4 COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem REQUIRE SSE4_2)
576 add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge REQUIRE AVX)
577 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
579 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
580 # Disable tail merging as it leads to lower performance.
581 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
582 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
583 add_memcpy(memcpy MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
585 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
589 # ------------------------------------------------------------------------------
591 # ------------------------------------------------------------------------------
593 function(add_memmove memmove_name)
594 add_implementation(memmove ${memmove_name}
595 SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp
596 HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h
598 .memory_utils.inline_memcpy
604 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
605 add_memmove(memmove_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
606 add_memmove(memmove_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
607 add_memmove(memmove_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
608 add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
609 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
611 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
612 # Disable tail merging as it leads to lower performance.
613 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
614 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
615 add_memmove(memmove MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
617 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
621 # ------------------------------------------------------------------------------
623 # ------------------------------------------------------------------------------
625 function(add_memset memset_name)
626 add_implementation(memset ${memset_name}
627 SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
628 HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
630 .memory_utils.inline_memset
636 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
637 add_memset(memset_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
638 add_memset(memset_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
639 add_memset(memset_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
640 add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
641 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
643 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
644 # Disable tail merging as it leads to lower performance.
645 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
646 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
647 add_memset(memset MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
649 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})