Bonjour,
J'écris une petite librairie d'arithmétique statique, contrairement à GMP qui est dynamique. Pour obtenir de bonne perf je dois écrire en assembleur.
Si je considere une addition de grand entier (>64 bits), j 'utilise un tableau de long int. Si je considère ma fonction addition je devrai tout d'abord loader mes datas (en assembleur x86-64, gas)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
  void vli256_add(boost::uint64_t * /*%%rdi*/, boost::uint64_t const * /*%%rsi*/) {
                                asm (
                                        "movq  (%%rdi), %%r8 " // load la 1 ere data
                                        "movq  0x08(%%rdi), %%r9"  // load la 2eme  data  successive
Cette structure marche très bien mais elle suppose que mes datas soit stockées sous le format AoS, pour divers raisons je souhaite utiliser le modèle SoA.

Je rappelle AoS : si on considère un grand entier A comme la suite de 2 long int (a0 et a1), en mémoire on a : a0a1 si je prend B C et D , j obtiendrai en mémoire a0a1 b0b1 c0c1 d0d1 le tout continue, en AoS, j obtiens
a0b0c0d0 a1b1c1d1. L'idée est d'ajouter un paramètre template pour permettre de passer d'une représentation à une autre. en pseudo code j'obtiendrai:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
template< int n>
  void vli256_add(boost::uint64_t * /*%%rdi*/, boost::uint64_t const * /*%%rsi*/) {
                                asm (
                                        "movq  (%%rdi), %%r8" //idem                                                                            
                                        "movq  0x08*n(%%rdi), %%r9 "// n donne l offset n=1 SoA, n=4 AoS  "
le pb et que n est dans une string donc il ne sera pas considéré un nombre.
Bref je ne sais pas trop comment mixer cette string d'assembleur et ce paramètre template ... (je suis un débutant en assembleur)