Superstrings mit schwarzen Löchern

Neues zu alten Stringbefehlen und die Intrinsics __movsb() und __stosb()

Wissen | Know-how

Sie gehören zu den Urbefehlen der x86-Architektur, die sogenannten Stringbefehle. Das Besondere an ihnen ist, dass sie ein REP-Prefix für die wiederholte Ausführung kennen – und dass sie mit ihren Fehlern und füllen könnten. Mit dem Ivy-Brigde-Prozessor hat Intel diesen holpernden Problembefehlen kräftig auf die Sprünge geholfen.

MOVS, STOS, LODS, SCAS und CMPS, so die Namen der Stringoperationen (ohne I/O), die dem blockweisen Kopieren, Schreiben, Lesen, Scannen und Vergleichen dienen. Einen Block Byte für Byte in das gleiche Prozessorregister zu lesen, wie es bei REP LODSB der Fall ist, dürfte allerdings normalerweise recht unsinnig sein, das kann allenfalls Benchmarks dienen. Vorrangig stehen MOVS und STOS im Vordergrund, die als memcpy() und memset() in den C-Bibliotheken zu finden sind. Die anderen werden besser durch geeignete SIMD-Befehle ersetzt.

Doch der Bug-Teufel meinte es nicht gut mit den beiden Stringbefehlen. Es gab Turbulenzen quer durch alle Prozessorgenerationen bis hin zum Haswell – dagegen war der berüchtigte FDIV-Bug des Pentium nur ein laues Lüftchen. Mal wurden zu wenige, mal zu viele Bytes kopiert, mal gab es Probleme mit Interrupts oder mit Init- oder Stpclk-Signalen und so weiter, eine grandiose Serie von Pleiten, Pech und Pannen. Wahrscheinlich hatten schon die früheren Prozessoren der 80er-Jahre ihre Problemchen damit, aber erst nach dem FDIV-Bug des Pentium raffte sich Intel auf, öffentliche Fehlerlisten („Specification Updates“) zu führen. Und schon der Pentium hatte mehrere Problemzonen rund um die Stringbefehle, etwa einen 100-MHz-Speedpath bei REP MOVS, der je nach Temperatur und Erdstrahlen mitunter für falsche Daten sorgte. ...

Sie möchten wissen, wie es weitergeht?

Als c't-Plus-Abonnent gratis lesen

Anmelden als c't-Plus-Abonnent

Anzeige
Anzeige