je me demandais pourquoi l'on enrichissait les jeux d'instructions des nouveaux processeurs
Il y a plusieurs raisons à cela.
Globalement les processeurs ont de plus en plus de transistors. Car la surface d'une génération à l'autre est souvent constante quand la finesse de gravure augmente. Ces transistors, il faut bien s'en servir. Ces instructions supplémentaires en font partis.
Ajouter des instructions permet plusieurs choses. Déjà les processeurs compatibles x86 et x86_64 ont eu avec le temps des fonctionnalités totalement nouvelles. Pour les exploiter, il fallait l'ajout de nouvelles instructions. Par exemple il y a tout ce qui concerne les calculs sur des vecteurs, la cryptographie gérée par le processeur (comme calculer un SHA-256 de manière matérielle), etc.
L'autre peut être une raison d'optimisation, c'est-à-dire faire en sorte que certaines instructions « courantes » se résument une une instruction. Le code est plus court et le matériel génèrerait ces cas plus rapidement.
feront fonctionner des programmes qui se doivent de rester compatibles avec le jeu d'instructions pour lequel ils sont faits (par exemple le x86-64), et qui donc n'utilisent pas ces nouvelles instructions.
De nombreux programmes n'exploitent pas ces instructions, par manque d'usage mais aussi pour la raison de compatibilité. Ce n'est cependant pas du tout le cas pour tous. Certains programmes exploitent des instructions modernes. Globalement tous les programmes nécessitant de la 3D poussée (les jeux vidéo ou Blender par exemple) vont utiliser des extensions du jeu d'instruction x86 : le SSE (dont il y a plusieurs versions). Le SSE apporte en effet beaucoup d'intérêts pour les calculs lourds que nécessitent la 3D et certains programmes jugent suffisamment utile pour ne plus être compatibles avec ceux qui ne le supportent pas.
Ceux qui font des programmes maisons, comme de nombreux laboratoires, peuvent aussi se permettre de réduire la compatibilité pour des raisons de performances. Bref, c'est au choix de chaque programme de déterminer ce qu'il faut faire. Après tout la compatibilité du tout premier x86 n'est plus forcément très pertinent…
Tout cela est géré par le compilateur, GCC te permettant de décider si tu veux telle ou telle extension ou non.
Et je me demandais aussi comment cela se traduisait en assembleur. De nouveaux mots mnémoniques ?
Oui. Après l'assembleur peut transformer ces mnémoniques en d'autres plus élémentaires comme une sorte de Macro. Cela dépend de l'assembleur et de l'instruction considérée.
Pour le peu de code que j'ai vu en assembleur, je n'ai pas vu une grande variété d'instructions, pourtant, j'ai appris qu'il en existait une centaine pour les processeurs courants.
Car beaucoup de ces instructions sont utiles dans des cas assez restreints. D'autres sont en général dans des programmes assez compliqués pour que la lecture du code assembleur résultant ne soit pas vraiment pertinent. En général ces extensions sont exploitées par le compilateur et non le programmeur assembleur lui même. D'où le fait que tu les vois rarement quand on t'enseigne cela, ou pour les programmes habituellement conçus par ceux qui exploitent l'assembleur à la main.
Et c'est comme pour toute nouveauté, il faut du temps pour qu'un nouveau mnémonique se répande. Pour des raisons de compatibilité d'une part, mais de disponibilité des outils pour l'exploiter d'autre part.