Hi, Ich wollte mittels der ymm register z.b. mit Hilfe vpmuludq 2 128 bit Zahlen multiplizieren. Es gibt bei den AVX2 Befelen immer das Problem des overflows an der 64 bit Grenze, der nicht berücksichtigt wird, keine Flags gesetzt. Ich suche einen Trick: Ich kann ja 4 32 Bit Zahlen in einer ymm unterbringen und es geschieht dword(0)*dword(0)->qword(0) dword(3)*dword(3)->qword(1) dword(5)*dword(5)->qword(2) dword(7)*dword(5)->qword(3) also DEST[63:0] ← SRC1[31:0] * SRC2[31:0] DEST[127:64] ← SRC1[95:64] * SRC2[95:64 DEST[191:128] ← SRC1[159:128] * SRC2[159:128] DEST[255:192] ← SRC1[223:192] * SRC2[223:192] siehe http://www.felixcloutier.com/x86/PMULUDQ.html also z.b. 0c0908af.234698ab.1b07ec09.209b3231 (4*32 =128Bit) mal 1d0918af.334699ab.7b08eDa0.219f3e56 verteilen auf 00000000.0c0908af.00000000.234698ab.00000000.1b07ec09.00000000.209b3231 mal 00000000.1d0918af.00000000.334699ab.00000000.7b08eDa0.00000000.219f3e56 (jeweils) werden die 4 relevanten dwords Produkte in die 4 64 bit qwords des Ergebnis-ymm Registers reingerechnet. Das gibt dann 4 qwords. Ich habs jetzt nich händisch ausgerechnet also eine 256 Bit Zahl im Ergebnisregister. Und dann, wenn das soweit richtig ist, habe ioch dort etwas was aber noch nicht das richtige ist, sondern man muss noch irgendwie horizontal addieren. Mit Vpaddq denk ich... Ich weiss es eben nicht. Hat das nicht jemmand mal programmiert? In x86 Pentium mit AVX2 extension, oder evtl AVX4.2. Mir würde auch Produkt 2er 64 Bit words reichen.. Es ist knifflich... Vielen Dank
und funktioniert nicht mul rax,rbx ->rdx:rax ? Auch in 64-bit modus mit dem prefix rex.w kann man noch mul verwenden :) (Volume 2B Intel 64 and IA-32 Programmers reference) :).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.