Gast
#4897881
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