Ich lese Computer Systems: A Programmer's Perspective und die Hausaufgaben sollten beschreiben, wie dieser Algorithmus funktioniert.Wie funktioniert diese 128-Bit-Integer-Multiplikation in Assembly (x86-64)?
C Funktion:
void store_prod(__int128 *dest, int64_t x, int64_t y) {
*dest = x * (__int128)y;
}
Montage:
movq %rdx, %rax
cqto
movq %rsi, %rcx
sarq $63, %rcx
imulq %rax, %rcx
imulq %rsi, %rdx
addq %rdx, %rcx
mulq %rsi
addq %rcx, %rdx
movq %rax, (%rdi)
movq %rdx, 8(%rdi)
ret
Ich weiß nicht, warum es führt: xh * yl + yh * xl = value which we add after unsigned multiplication
nur eine Vermutung: Verschiebung macht es 128 Bits, seit Sie 64 Bits am Anfang bekommen. 1 und -1 werden mit dem Wert pos/neg der Zahl –
verglichen. Beide Operanden der Multiplikation müssen vom selben Typ sein. Zu diesem Zweck wird "x" zum Typ "__int128" hochgestuft, weil "y" nach der Umwandlung von diesem Typ ist und der Integer-Promotion-Rang von "__int128" höher ist als der von "int64_t". Eine der Konvertierungen wird mit 'cqto' gemacht, aber das funktioniert nur mit' rax', also wird die andere mit 'sarq' konvertiert. – EOF
@EOF aber warum multiplizieren wir die niederwertigen Bits von y mit 1 oder -1? imulq% rax,% rcx - diese Anweisung, nach der Rechtsverschiebung, tut genau das. Da die Bits niedriger Ordnung keine Vorzeicheninformationen enthalten, warum tun wir das? – denis631