(Ceci est une version étendue du problème (https://github.com/WebAssembly/spec/issues/446))
L'arithmétique multi-précision nécessite une manipulation particulière. Ceci est disponible sous une forme ou une autre dans tous les ISA, mais n'est actuellement pas disponible dans webasm.
Il y a essentiellement trois façons de procéder (il me semble), dont aucune n'est particulièrement acceptable dans le contexte de la conception actuelle :
Option 1. Ajoutez un registre de drapeaux spécial, ainsi que des instructions qui font de l'arithmétique avec ce registre.
C'est l'approche traditionnelle du matériel grand public.
Vous obtenez des instructions comme
addc
qui ajoutera deux nombres et la valeur de l'indicateur de retenue, et définira l'indicateur de retenue sur le résultat.
Ce n'est pas agréable car cela rajoute un registre spécial.
Option 2.
Prend en charge une forme d'arithmétique 60 bits avec 4 bits pour les drapeaux.
Option 3.
Prise en charge de l'arithmétique multi-mots : l'addition prend 3 arguments et produit 2 sorties.
Cette approche causera le moins de dommages à l'architecture ISA et de registre existante. Cependant, il sera difficile de mapper efficacement sur le matériel existant (tous les ISA matériels ne prennent pas en charge le chargement direct du registre des drapeaux.
Quoi qu'il en soit, l'arithmétique multi-précision est assez importante et très difficile à émuler sans un support matériel simple.
Il me semble que pour l'option 3, il existe des optimisations plausibles qui rendraient cela pratique. Supposons que {i32,i64}.addc prend trois entrées, op2 en haut, op1 en dessous, report en bas et produit deux sorties, résultat en haut et report en dessous. Pour les besoins de l'argument, supposons que le report est toujours du même type que les autres opérandes. Définissez addc uniquement pour utiliser le bit bas du report et pour que le report restant après l'opération soit zéro ou un. Les choses sont maintenant raisonnablement configurées pour un ajout de plusieurs mots, par exemple. Dans une boucle correctement déroulée, un compilateur JIT/Wasm devrait vraiment être capable de voir que c'est le report qui est propagé et de générer du bon code. (Et si la boucle n'est pas déroulée, la surcharge de la boucle diluera de toute façon l'extraction/l'insertion de retenue.) Je pense que le pire des cas de code sans branche pour l'extraction de retenue devrait être mov rd, 0; adc rd, 0
; pour l'insertion, quelque chose comme and rc, 1; add rc, ~0
où rc est un registre qui contient une valeur à traiter comme un report.
Sur ARM, la consommation d'un report est distincte de la production d'un report : ADC consomme, ADC.S consomme et produit, ADD.S ne fait que produire. Voudrions-nous toutes ces variantes ? Et qu'en est-il du débordement ?
(Il pourrait y avoir une quatrième option, où nous ajoutons une opération d'opération et de branchement sur condition qui produit à la fois un résultat et se branche sur une étiquette ou non, par exemple, i32.addc op1 op2 carry L
se brancherait sur L sur l'ensemble de report et tomber sur le carry clear, et de toute façon laisser un résultat sur la pile, mais cela semble plus difficile à utiliser en général que les trois options que vous avez suggérées.)
Y a-t-il quelqu'un prêt à défendre cette proposition? Nous aurions besoin d'une sémantique proposée, d'un encodage binaire, et j'aimerais au moins au moins des cas d'utilisation et une implémentation avec des chiffres de performance pour ces cas d'utilisation (comparez le MVP WebAssembly actuel, avec cet ajout proposé, et le code natif).
En principe, je serais prêt à défendre cela.
Cependant, des changements personnels signifient que j'ai des ressources limitées pour au moins les prochains mois.
———
Franck McCabe
Architecte logiciel sénior
Téléphone : 650-740 6673 | Courriel : [email protected] [email protected]
Logique de démarrage | 450, avenue Lambert, Palo Alto, Californie 94306 | instartlogic.com http://instartlogic.com/
Le 11 mai 2017 à 10h14, JF Bastien [email protected] a écrit :
Y a-t-il quelqu'un prêt à défendre cette proposition? Nous aurions besoin d'une sémantique proposée, d'un encodage binaire, et j'aimerais au moins au moins des cas d'utilisation et une implémentation avec des chiffres de performance pour ces cas d'utilisation (comparez le MVP WebAssembly actuel, avec cet ajout proposé, et le code natif).
—
Vous recevez ceci parce que vous êtes l'auteur du fil.
Répondez directement à cet e-mail, consultez-le sur GitHub https://github.com/WebAssembly/design/issues/1021#issuecomment-300856161 , ou désactivez le fil https://github.com/notifications/unsubscribe-auth/ADfCzd9le4ufXm6DSsArpfXCYsGdV7UIks5r40H5gaJpZM4MrKma .
J'aurai probablement du temps à consacrer à cela, mais pas beaucoup avant juin environ, puis à l'automne. IMO, cette fonctionnalité est assez importante, et je pense que l'indicateur de débordement est aussi important que l'indicateur de report, bien qu'avec différents cas d'utilisation (transition fixnum -> bignum des langages dynamiques).
J'en ai discuté avec des gens de Mozilla aujourd'hui. En résumé:
Y a-t-il eu des progrès sur cette question? Le transport et l'emprunt sont nécessaires pour mettre en œuvre efficacement la cryptographie moderne (par exemple SIDH). L'addition de grands nombres sans ADDC est plusieurs fois plus lente qu'avec. Il en va de même pour la soustraction et la multiplication.
Je pense que nous attendons au moins que la multi-valeur soit terminée afin que nous puissions facilement exprimer une opération avec plus d'un résultat. La multi-valeur est "presque là".
Commentaire le plus utile
Y a-t-il eu des progrès sur cette question? Le transport et l'emprunt sont nécessaires pour mettre en œuvre efficacement la cryptographie moderne (par exemple SIDH). L'addition de grands nombres sans ADDC est plusieurs fois plus lente qu'avec. Il en va de même pour la soustraction et la multiplication.