Writing string.h functions using string instructions in asm x86-64 (2025)
L'article examine en détail l'implémentation des fonctions de string.h de la glibc pour x86 et la compare avec des versions assembleur exploitant les instructions string et les extensions SIMD. Les instructions string (movs, cmps, scas, lods, stos) opèrent via RSI/RDI et RCX et peuvent être préfixées par REP/REPE/REPNE pour répéter l'opération, la Direction Flag contrôlant l'incrémentation ou la décrémentation des pointeurs et devant être préservée selon l'ABI. GCC et la glibc sélectionnent dynamiquement entre rep movs/stos, implémentations vectorielles (SSE/AVX/AVX2/AVX‑512) et boucles optimisées via un IFUNC selector et des seuils (ERMS, __x86_rep_movsb_threshold et paramètres non‑temporaux) en fonction de l'architecture, de l'alignement, de la taille et de la configuration cache. Les benchmarks montrent que rep stosq et rep movsq sont très efficaces pour l'initialisation et la copie de gros blocs alignés, mais que la plupart du temps les copies utilisant les plus grands registres ou SIMD et les stores non‑temporaires donnent de meilleures performances, tandis que les instructions string sans préfixe REP sont généralement plus lentes. En pratique, il est recommandé d'utiliser rep stosq pour memset et rep movsq uniquement lorsque conditions et alignement le permettent, de privilégier SIMD, boucles déroulées et non‑temporal stores pour les très gros transferts, et d'éviter scas/cmps/lods et les string instructions non répétées sauf pour optimiser la taille du code.