rotacion por operadores multiplicacion medio manejo fracciones enteros ejemplos desplazamiento derecha corrimiento con x86 sse simd multiplication sse2

x86 - por - Multiplicación SSE de 2 enteros de 64 bits



operadores de bits java (2)

¿Cómo se multiplican dos enteros de 64 bits por otros 2 enteros de 64 bits? No encontré ninguna instrucción que pueda hacerlo.


Debería implementar su propia rutina de multiplicación de 64 bits utilizando operaciones de multiplicación de 32 bits. Sin embargo, probablemente no sea más eficiente que hacer esto con código escalar, particularmente porque habrá muchos movimientos de los vectores para obtener todas las operaciones requeridas.


Sé que esta es una vieja pregunta, pero en realidad estaba buscando exactamente esto. Como todavía no hay instrucciones para ello, implementé la multiplicación de 64 bits con pmuldq como mencionó Paul R. Esto es lo que se me ocurrió

__m128i Multiply64Bit(__m128i a, __m128i b) { auto ax0_ax1_ay0_ay1 = a; auto bx0_bx1_by0_by1 = b; // i means ignored auto ax1_i_ay1_i = _mm_shuffle_epi32(ax0_ax1_ay0_ay1, _MM_SHUFFLE(3, 3, 1, 1)); auto bx1_i_by1_i = _mm_shuffle_epi32(bx0_bx1_by0_by1, _MM_SHUFFLE(3, 3, 1, 1)); auto ax0bx0_ay0by0 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx0_bx1_by0_by1); auto ax0bx1_ay0by1 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx1_i_by1_i); auto ax1bx0_ay1by0 = _mm_mul_epi32(ax1_i_ay1_i, bx0_bx1_by0_by1); auto ax0bx1_ay0by1_32 = _mm_slli_epi64(ax0bx1_ay0by1, 32); auto ax1bx0_ay1by0_32 = _mm_slli_epi64(ax1bx0_ay1by0, 32); return _mm_add_epi64(ax0bx0_ay0by0, _mm_add_epi64(ax0bx1_ay0by1_32, ax1bx0_ay1by0_32)); }