From 986b131574375f2d8edecb5866fd465f24d8177b Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Mon, 28 Oct 2024 16:47:59 +0900 Subject: [PATCH] slight speedup of vmul --- src/asm/bint-x64-amd64.S | 178 +++++++++++++++++++++++--- src/asm/bint-x64-mingw.S | 262 +++++++++++++++++++++++++++------------ src/asm/bint-x64-win.asm | 262 +++++++++++++++++++++++++++------------ src/gen_bint_x64.py | 71 ++++++++--- src/msm_avx.cpp | 2 +- 5 files changed, 580 insertions(+), 195 deletions(-) diff --git a/src/asm/bint-x64-amd64.S b/src/asm/bint-x64-amd64.S index fe409870..31f80f6c 100644 --- a/src/asm/bint-x64-amd64.S +++ b/src/asm/bint-x64-amd64.S @@ -529,6 +529,15 @@ SIZE(mcl_c5_vsub) .global PRE(mcl_c5_vmul) PRE(mcl_c5_vmul): TYPE(mcl_c5_vmul) +lea PRE(ap)(%rip), %rax +vmovdqa64 (%rax), %zmm20 +vmovdqa64 64(%rax), %zmm21 +vmovdqa64 128(%rax), %zmm22 +vmovdqa64 192(%rax), %zmm23 +vmovdqa64 256(%rax), %zmm24 +vmovdqa64 320(%rax), %zmm25 +vmovdqa64 384(%rax), %zmm26 +vmovdqa64 448(%rax), %zmm27 mov $4503599627370495, %rax vpbroadcastq %rax, %zmm9 lea PRE(rp)(%rip), %r10 @@ -568,8 +577,22 @@ vpxorq %zmm8, %zmm8, %zmm8 vpmadd52huq 448(%rsi), %zmm11, %zmm8 vpxorq %zmm11, %zmm11, %zmm11 vpmadd52luq (%r10){1to8}, %zmm0, %zmm11 -lea PRE(ap)(%rip), %rax -call .L2 +vpmadd52luq %zmm20, %zmm11, %zmm0 +vpmadd52huq %zmm20, %zmm11, %zmm1 +vpmadd52luq %zmm21, %zmm11, %zmm1 +vpmadd52huq %zmm21, %zmm11, %zmm2 +vpmadd52luq %zmm22, %zmm11, %zmm2 +vpmadd52huq %zmm22, %zmm11, %zmm3 +vpmadd52luq %zmm23, %zmm11, %zmm3 +vpmadd52huq %zmm23, %zmm11, %zmm4 +vpmadd52luq %zmm24, %zmm11, %zmm4 +vpmadd52huq %zmm24, %zmm11, %zmm5 +vpmadd52luq %zmm25, %zmm11, %zmm5 +vpmadd52huq %zmm25, %zmm11, %zmm6 +vpmadd52luq %zmm26, %zmm11, %zmm6 +vpmadd52huq %zmm26, %zmm11, %zmm7 +vpmadd52luq %zmm27, %zmm11, %zmm7 +vpmadd52huq %zmm27, %zmm11, %zmm8 mov $7, %ecx .balign 32 .L1: @@ -586,13 +609,42 @@ vmovdqa64 %zmm6, %zmm5 vmovdqa64 %zmm7, %zmm6 vmovdqa64 %zmm8, %zmm7 vpxorq %zmm8, %zmm8, %zmm8 -call .L2 +vpmadd52luq (%rax), %zmm11, %zmm0 +vpmadd52huq (%rax), %zmm11, %zmm1 +vpmadd52luq 64(%rax), %zmm11, %zmm1 +vpmadd52huq 64(%rax), %zmm11, %zmm2 +vpmadd52luq 128(%rax), %zmm11, %zmm2 +vpmadd52huq 128(%rax), %zmm11, %zmm3 +vpmadd52luq 192(%rax), %zmm11, %zmm3 +vpmadd52huq 192(%rax), %zmm11, %zmm4 +vpmadd52luq 256(%rax), %zmm11, %zmm4 +vpmadd52huq 256(%rax), %zmm11, %zmm5 +vpmadd52luq 320(%rax), %zmm11, %zmm5 +vpmadd52huq 320(%rax), %zmm11, %zmm6 +vpmadd52luq 384(%rax), %zmm11, %zmm6 +vpmadd52huq 384(%rax), %zmm11, %zmm7 +vpmadd52luq 448(%rax), %zmm11, %zmm7 +vpmadd52huq 448(%rax), %zmm11, %zmm8 vpsrlq $52, %zmm12, %zmm11 vpaddq %zmm11, %zmm0, %zmm0 vpxorq %zmm11, %zmm11, %zmm11 vpmadd52luq (%r10){1to8}, %zmm0, %zmm11 -lea PRE(ap)(%rip), %rax -call .L2 +vpmadd52luq %zmm20, %zmm11, %zmm0 +vpmadd52huq %zmm20, %zmm11, %zmm1 +vpmadd52luq %zmm21, %zmm11, %zmm1 +vpmadd52huq %zmm21, %zmm11, %zmm2 +vpmadd52luq %zmm22, %zmm11, %zmm2 +vpmadd52huq %zmm22, %zmm11, %zmm3 +vpmadd52luq %zmm23, %zmm11, %zmm3 +vpmadd52huq %zmm23, %zmm11, %zmm4 +vpmadd52luq %zmm24, %zmm11, %zmm4 +vpmadd52huq %zmm24, %zmm11, %zmm5 +vpmadd52luq %zmm25, %zmm11, %zmm5 +vpmadd52huq %zmm25, %zmm11, %zmm6 +vpmadd52luq %zmm26, %zmm11, %zmm6 +vpmadd52huq %zmm26, %zmm11, %zmm7 +vpmadd52luq %zmm27, %zmm11, %zmm7 +vpmadd52huq %zmm27, %zmm11, %zmm8 dec %ecx jnz .L1 vpsrlq $52, %zmm0, %zmm11 @@ -619,29 +671,28 @@ vpandq %zmm9, %zmm6, %zmm6 vpsrlq $52, %zmm7, %zmm11 vpaddq %zmm11, %zmm8, %zmm8 vpandq %zmm9, %zmm7, %zmm7 -lea PRE(p)(%rip), %rax vpxorq %zmm10, %zmm10, %zmm10 -vpsubq (%rax){1to8}, %zmm1, %zmm12 +vpsubq %zmm20, %zmm1, %zmm12 vpsrlq $63, %zmm12, %zmm11 -vpsubq 8(%rax){1to8}, %zmm2, %zmm13 +vpsubq %zmm21, %zmm2, %zmm13 vpsubq %zmm11, %zmm13, %zmm13 vpsrlq $63, %zmm13, %zmm11 -vpsubq 16(%rax){1to8}, %zmm3, %zmm14 +vpsubq %zmm22, %zmm3, %zmm14 vpsubq %zmm11, %zmm14, %zmm14 vpsrlq $63, %zmm14, %zmm11 -vpsubq 24(%rax){1to8}, %zmm4, %zmm15 +vpsubq %zmm23, %zmm4, %zmm15 vpsubq %zmm11, %zmm15, %zmm15 vpsrlq $63, %zmm15, %zmm11 -vpsubq 32(%rax){1to8}, %zmm5, %zmm16 +vpsubq %zmm24, %zmm5, %zmm16 vpsubq %zmm11, %zmm16, %zmm16 vpsrlq $63, %zmm16, %zmm11 -vpsubq 40(%rax){1to8}, %zmm6, %zmm17 +vpsubq %zmm25, %zmm6, %zmm17 vpsubq %zmm11, %zmm17, %zmm17 vpsrlq $63, %zmm17, %zmm11 -vpsubq 48(%rax){1to8}, %zmm7, %zmm18 +vpsubq %zmm26, %zmm7, %zmm18 vpsubq %zmm11, %zmm18, %zmm18 vpsrlq $63, %zmm18, %zmm11 -vpsubq 56(%rax){1to8}, %zmm8, %zmm19 +vpsubq %zmm27, %zmm8, %zmm19 vpsubq %zmm11, %zmm19, %zmm19 vpsrlq $63, %zmm19, %zmm11 vpcmpeqq %zmm10, %zmm11, %k1 @@ -1021,7 +1072,38 @@ vpxorq %zmm22, %zmm22, %zmm22 vpmadd52luq (%rcx){1to8}, %zmm0, %zmm21 vpmadd52luq (%rcx){1to8}, %zmm1, %zmm22 lea PRE(apA)(%rip), %rax -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 mov $7, %r8 .balign 32 .L4: @@ -1049,7 +1131,38 @@ vmovdqa64 %zmm16, %zmm14 vmovdqa64 %zmm17, %zmm15 vpxorq %zmm16, %zmm16, %zmm16 vpxorq %zmm17, %zmm17, %zmm17 -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 vpsrlq $52, %zmm23, %zmm21 vpsrlq $52, %zmm24, %zmm22 vpaddq %zmm21, %zmm0, %zmm0 @@ -1059,7 +1172,38 @@ vpxorq %zmm22, %zmm22, %zmm22 vpmadd52luq (%rcx){1to8}, %zmm0, %zmm21 vpmadd52luq (%rcx){1to8}, %zmm1, %zmm22 lea PRE(apA)(%rip), %rax -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 dec %r8 jnz .L4 vpsrlq $52, %zmm0, %zmm21 diff --git a/src/asm/bint-x64-mingw.S b/src/asm/bint-x64-mingw.S index 49cdfc1d..8e3cd1e8 100644 --- a/src/asm/bint-x64-mingw.S +++ b/src/asm/bint-x64-mingw.S @@ -591,6 +591,15 @@ vmovups %xmm13, 128(%rsp) vmovups %xmm14, 144(%rsp) vmovups %xmm15, 160(%rsp) mov %rcx, %r10 +lea PRE(ap)(%rip), %rax +vmovdqa64 (%rax), %zmm20 +vmovdqa64 64(%rax), %zmm21 +vmovdqa64 128(%rax), %zmm22 +vmovdqa64 192(%rax), %zmm23 +vmovdqa64 256(%rax), %zmm24 +vmovdqa64 320(%rax), %zmm25 +vmovdqa64 384(%rax), %zmm26 +vmovdqa64 448(%rax), %zmm27 mov $4503599627370495, %rax vpbroadcastq %rax, %zmm9 lea PRE(rp)(%rip), %r9 @@ -630,8 +639,22 @@ vpxorq %zmm8, %zmm8, %zmm8 vpmadd52huq 448(%rdx), %zmm11, %zmm8 vpxorq %zmm11, %zmm11, %zmm11 vpmadd52luq (%r9){1to8}, %zmm0, %zmm11 -lea PRE(ap)(%rip), %rax -call .L2 +vpmadd52luq %zmm20, %zmm11, %zmm0 +vpmadd52huq %zmm20, %zmm11, %zmm1 +vpmadd52luq %zmm21, %zmm11, %zmm1 +vpmadd52huq %zmm21, %zmm11, %zmm2 +vpmadd52luq %zmm22, %zmm11, %zmm2 +vpmadd52huq %zmm22, %zmm11, %zmm3 +vpmadd52luq %zmm23, %zmm11, %zmm3 +vpmadd52huq %zmm23, %zmm11, %zmm4 +vpmadd52luq %zmm24, %zmm11, %zmm4 +vpmadd52huq %zmm24, %zmm11, %zmm5 +vpmadd52luq %zmm25, %zmm11, %zmm5 +vpmadd52huq %zmm25, %zmm11, %zmm6 +vpmadd52luq %zmm26, %zmm11, %zmm6 +vpmadd52huq %zmm26, %zmm11, %zmm7 +vpmadd52luq %zmm27, %zmm11, %zmm7 +vpmadd52huq %zmm27, %zmm11, %zmm8 mov $7, %ecx .balign 32 .L1: @@ -648,13 +671,42 @@ vmovdqa64 %zmm6, %zmm5 vmovdqa64 %zmm7, %zmm6 vmovdqa64 %zmm8, %zmm7 vpxorq %zmm8, %zmm8, %zmm8 -call .L2 +vpmadd52luq (%rax), %zmm11, %zmm0 +vpmadd52huq (%rax), %zmm11, %zmm1 +vpmadd52luq 64(%rax), %zmm11, %zmm1 +vpmadd52huq 64(%rax), %zmm11, %zmm2 +vpmadd52luq 128(%rax), %zmm11, %zmm2 +vpmadd52huq 128(%rax), %zmm11, %zmm3 +vpmadd52luq 192(%rax), %zmm11, %zmm3 +vpmadd52huq 192(%rax), %zmm11, %zmm4 +vpmadd52luq 256(%rax), %zmm11, %zmm4 +vpmadd52huq 256(%rax), %zmm11, %zmm5 +vpmadd52luq 320(%rax), %zmm11, %zmm5 +vpmadd52huq 320(%rax), %zmm11, %zmm6 +vpmadd52luq 384(%rax), %zmm11, %zmm6 +vpmadd52huq 384(%rax), %zmm11, %zmm7 +vpmadd52luq 448(%rax), %zmm11, %zmm7 +vpmadd52huq 448(%rax), %zmm11, %zmm8 vpsrlq $52, %zmm12, %zmm11 vpaddq %zmm11, %zmm0, %zmm0 vpxorq %zmm11, %zmm11, %zmm11 vpmadd52luq (%r9){1to8}, %zmm0, %zmm11 -lea PRE(ap)(%rip), %rax -call .L2 +vpmadd52luq %zmm20, %zmm11, %zmm0 +vpmadd52huq %zmm20, %zmm11, %zmm1 +vpmadd52luq %zmm21, %zmm11, %zmm1 +vpmadd52huq %zmm21, %zmm11, %zmm2 +vpmadd52luq %zmm22, %zmm11, %zmm2 +vpmadd52huq %zmm22, %zmm11, %zmm3 +vpmadd52luq %zmm23, %zmm11, %zmm3 +vpmadd52huq %zmm23, %zmm11, %zmm4 +vpmadd52luq %zmm24, %zmm11, %zmm4 +vpmadd52huq %zmm24, %zmm11, %zmm5 +vpmadd52luq %zmm25, %zmm11, %zmm5 +vpmadd52huq %zmm25, %zmm11, %zmm6 +vpmadd52luq %zmm26, %zmm11, %zmm6 +vpmadd52huq %zmm26, %zmm11, %zmm7 +vpmadd52luq %zmm27, %zmm11, %zmm7 +vpmadd52huq %zmm27, %zmm11, %zmm8 dec %ecx jnz .L1 vpsrlq $52, %zmm0, %zmm11 @@ -681,29 +733,28 @@ vpandq %zmm9, %zmm6, %zmm6 vpsrlq $52, %zmm7, %zmm11 vpaddq %zmm11, %zmm8, %zmm8 vpandq %zmm9, %zmm7, %zmm7 -lea PRE(p)(%rip), %rax vpxorq %zmm10, %zmm10, %zmm10 -vpsubq (%rax){1to8}, %zmm1, %zmm12 +vpsubq %zmm20, %zmm1, %zmm12 vpsrlq $63, %zmm12, %zmm11 -vpsubq 8(%rax){1to8}, %zmm2, %zmm13 +vpsubq %zmm21, %zmm2, %zmm13 vpsubq %zmm11, %zmm13, %zmm13 vpsrlq $63, %zmm13, %zmm11 -vpsubq 16(%rax){1to8}, %zmm3, %zmm14 +vpsubq %zmm22, %zmm3, %zmm14 vpsubq %zmm11, %zmm14, %zmm14 vpsrlq $63, %zmm14, %zmm11 -vpsubq 24(%rax){1to8}, %zmm4, %zmm15 +vpsubq %zmm23, %zmm4, %zmm15 vpsubq %zmm11, %zmm15, %zmm15 vpsrlq $63, %zmm15, %zmm11 -vpsubq 32(%rax){1to8}, %zmm5, %zmm16 +vpsubq %zmm24, %zmm5, %zmm16 vpsubq %zmm11, %zmm16, %zmm16 vpsrlq $63, %zmm16, %zmm11 -vpsubq 40(%rax){1to8}, %zmm6, %zmm17 +vpsubq %zmm25, %zmm6, %zmm17 vpsubq %zmm11, %zmm17, %zmm17 vpsrlq $63, %zmm17, %zmm11 -vpsubq 48(%rax){1to8}, %zmm7, %zmm18 +vpsubq %zmm26, %zmm7, %zmm18 vpsubq %zmm11, %zmm18, %zmm18 vpsrlq $63, %zmm18, %zmm11 -vpsubq 56(%rax){1to8}, %zmm8, %zmm19 +vpsubq %zmm27, %zmm8, %zmm19 vpsubq %zmm11, %zmm19, %zmm19 vpsrlq $63, %zmm19, %zmm11 vpcmpeqq %zmm10, %zmm11, %k1 @@ -740,34 +791,20 @@ ret .balign 32 .L2: vpmadd52luq (%rax), %zmm11, %zmm0 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq (%rax), %zmm11, %zmm10 +vpmadd52huq (%rax), %zmm11, %zmm1 vpmadd52luq 64(%rax), %zmm11, %zmm1 -vpaddq %zmm10, %zmm1, %zmm1 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 64(%rax), %zmm11, %zmm10 +vpmadd52huq 64(%rax), %zmm11, %zmm2 vpmadd52luq 128(%rax), %zmm11, %zmm2 -vpaddq %zmm10, %zmm2, %zmm2 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 128(%rax), %zmm11, %zmm10 +vpmadd52huq 128(%rax), %zmm11, %zmm3 vpmadd52luq 192(%rax), %zmm11, %zmm3 -vpaddq %zmm10, %zmm3, %zmm3 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 192(%rax), %zmm11, %zmm10 +vpmadd52huq 192(%rax), %zmm11, %zmm4 vpmadd52luq 256(%rax), %zmm11, %zmm4 -vpaddq %zmm10, %zmm4, %zmm4 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 256(%rax), %zmm11, %zmm10 +vpmadd52huq 256(%rax), %zmm11, %zmm5 vpmadd52luq 320(%rax), %zmm11, %zmm5 -vpaddq %zmm10, %zmm5, %zmm5 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 320(%rax), %zmm11, %zmm10 +vpmadd52huq 320(%rax), %zmm11, %zmm6 vpmadd52luq 384(%rax), %zmm11, %zmm6 -vpaddq %zmm10, %zmm6, %zmm6 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 384(%rax), %zmm11, %zmm10 +vpmadd52huq 384(%rax), %zmm11, %zmm7 vpmadd52luq 448(%rax), %zmm11, %zmm7 -vpaddq %zmm10, %zmm7, %zmm7 vpmadd52huq 448(%rax), %zmm11, %zmm8 ret SIZE(mcl_c5_vmul) @@ -1170,7 +1207,38 @@ vpxorq %zmm22, %zmm22, %zmm22 vpmadd52luq (%r9){1to8}, %zmm0, %zmm21 vpmadd52luq (%r9){1to8}, %zmm1, %zmm22 lea PRE(apA)(%rip), %rax -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 mov $7, %r10 .balign 32 .L4: @@ -1198,7 +1266,38 @@ vmovdqa64 %zmm16, %zmm14 vmovdqa64 %zmm17, %zmm15 vpxorq %zmm16, %zmm16, %zmm16 vpxorq %zmm17, %zmm17, %zmm17 -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 vpsrlq $52, %zmm23, %zmm21 vpsrlq $52, %zmm24, %zmm22 vpaddq %zmm21, %zmm0, %zmm0 @@ -1208,7 +1307,38 @@ vpxorq %zmm22, %zmm22, %zmm22 vpmadd52luq (%r9){1to8}, %zmm0, %zmm21 vpmadd52luq (%r9){1to8}, %zmm1, %zmm22 lea PRE(apA)(%rip), %rax -call .L5 +vpmadd52luq (%rax), %zmm21, %zmm0 +vpmadd52luq 64(%rax), %zmm22, %zmm1 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 +vpmadd52luq 128(%rax), %zmm21, %zmm2 +vpmadd52luq 192(%rax), %zmm22, %zmm3 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 +vpmadd52luq 256(%rax), %zmm21, %zmm4 +vpmadd52luq 320(%rax), %zmm22, %zmm5 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 +vpmadd52luq 384(%rax), %zmm21, %zmm6 +vpmadd52luq 448(%rax), %zmm22, %zmm7 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 +vpmadd52luq 512(%rax), %zmm21, %zmm8 +vpmadd52luq 576(%rax), %zmm22, %zmm9 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 +vpmadd52luq 640(%rax), %zmm21, %zmm10 +vpmadd52luq 704(%rax), %zmm22, %zmm11 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 +vpmadd52luq 768(%rax), %zmm21, %zmm12 +vpmadd52luq 832(%rax), %zmm22, %zmm13 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 +vpmadd52luq 896(%rax), %zmm21, %zmm14 +vpmadd52luq 960(%rax), %zmm22, %zmm15 +vpmadd52huq 896(%rax), %zmm21, %zmm16 +vpmadd52huq 960(%rax), %zmm22, %zmm17 dec %r10 jnz .L4 vpsrlq $52, %zmm0, %zmm21 @@ -1367,62 +1497,34 @@ ret .L5: vpmadd52luq (%rax), %zmm21, %zmm0 vpmadd52luq 64(%rax), %zmm22, %zmm1 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq (%rax), %zmm21, %zmm19 -vpmadd52huq 64(%rax), %zmm22, %zmm20 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 vpmadd52luq 128(%rax), %zmm21, %zmm2 vpmadd52luq 192(%rax), %zmm22, %zmm3 -vpaddq %zmm19, %zmm2, %zmm2 -vpaddq %zmm20, %zmm3, %zmm3 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 128(%rax), %zmm21, %zmm19 -vpmadd52huq 192(%rax), %zmm22, %zmm20 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 vpmadd52luq 256(%rax), %zmm21, %zmm4 vpmadd52luq 320(%rax), %zmm22, %zmm5 -vpaddq %zmm19, %zmm4, %zmm4 -vpaddq %zmm20, %zmm5, %zmm5 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 256(%rax), %zmm21, %zmm19 -vpmadd52huq 320(%rax), %zmm22, %zmm20 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 vpmadd52luq 384(%rax), %zmm21, %zmm6 vpmadd52luq 448(%rax), %zmm22, %zmm7 -vpaddq %zmm19, %zmm6, %zmm6 -vpaddq %zmm20, %zmm7, %zmm7 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 384(%rax), %zmm21, %zmm19 -vpmadd52huq 448(%rax), %zmm22, %zmm20 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 vpmadd52luq 512(%rax), %zmm21, %zmm8 vpmadd52luq 576(%rax), %zmm22, %zmm9 -vpaddq %zmm19, %zmm8, %zmm8 -vpaddq %zmm20, %zmm9, %zmm9 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 512(%rax), %zmm21, %zmm19 -vpmadd52huq 576(%rax), %zmm22, %zmm20 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 vpmadd52luq 640(%rax), %zmm21, %zmm10 vpmadd52luq 704(%rax), %zmm22, %zmm11 -vpaddq %zmm19, %zmm10, %zmm10 -vpaddq %zmm20, %zmm11, %zmm11 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 640(%rax), %zmm21, %zmm19 -vpmadd52huq 704(%rax), %zmm22, %zmm20 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 vpmadd52luq 768(%rax), %zmm21, %zmm12 vpmadd52luq 832(%rax), %zmm22, %zmm13 -vpaddq %zmm19, %zmm12, %zmm12 -vpaddq %zmm20, %zmm13, %zmm13 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 768(%rax), %zmm21, %zmm19 -vpmadd52huq 832(%rax), %zmm22, %zmm20 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 vpmadd52luq 896(%rax), %zmm21, %zmm14 vpmadd52luq 960(%rax), %zmm22, %zmm15 -vpaddq %zmm19, %zmm14, %zmm14 -vpaddq %zmm20, %zmm15, %zmm15 vpmadd52huq 896(%rax), %zmm21, %zmm16 vpmadd52huq 960(%rax), %zmm22, %zmm17 ret diff --git a/src/asm/bint-x64-win.asm b/src/asm/bint-x64-win.asm index a977db13..e735dafc 100644 --- a/src/asm/bint-x64-win.asm +++ b/src/asm/bint-x64-win.asm @@ -564,6 +564,15 @@ vmovups xmmword ptr [rsp+128], xmm13 vmovups xmmword ptr [rsp+144], xmm14 vmovups xmmword ptr [rsp+160], xmm15 mov r10, rcx +lea rax, ap +vmovdqa64 zmm20, zmmword ptr [rax] +vmovdqa64 zmm21, zmmword ptr [rax+64] +vmovdqa64 zmm22, zmmword ptr [rax+128] +vmovdqa64 zmm23, zmmword ptr [rax+192] +vmovdqa64 zmm24, zmmword ptr [rax+256] +vmovdqa64 zmm25, zmmword ptr [rax+320] +vmovdqa64 zmm26, zmmword ptr [rax+384] +vmovdqa64 zmm27, zmmword ptr [rax+448] mov rax, 4503599627370495 vpbroadcastq zmm9, rax lea r9, rp @@ -603,8 +612,22 @@ vpxorq zmm8, zmm8, zmm8 vpmadd52huq zmm8, zmm11, zmmword ptr [rdx+448] vpxorq zmm11, zmm11, zmm11 vpmadd52luq zmm11, zmm0, qword bcst [r9] -lea rax, ap -call @L2 +vpmadd52luq zmm0, zmm11, zmm20 +vpmadd52huq zmm1, zmm11, zmm20 +vpmadd52luq zmm1, zmm11, zmm21 +vpmadd52huq zmm2, zmm11, zmm21 +vpmadd52luq zmm2, zmm11, zmm22 +vpmadd52huq zmm3, zmm11, zmm22 +vpmadd52luq zmm3, zmm11, zmm23 +vpmadd52huq zmm4, zmm11, zmm23 +vpmadd52luq zmm4, zmm11, zmm24 +vpmadd52huq zmm5, zmm11, zmm24 +vpmadd52luq zmm5, zmm11, zmm25 +vpmadd52huq zmm6, zmm11, zmm25 +vpmadd52luq zmm6, zmm11, zmm26 +vpmadd52huq zmm7, zmm11, zmm26 +vpmadd52luq zmm7, zmm11, zmm27 +vpmadd52huq zmm8, zmm11, zmm27 mov ecx, 7 align 32 @L1: @@ -621,13 +644,42 @@ vmovdqa64 zmm5, zmm6 vmovdqa64 zmm6, zmm7 vmovdqa64 zmm7, zmm8 vpxorq zmm8, zmm8, zmm8 -call @L2 +vpmadd52luq zmm0, zmm11, zmmword ptr [rax] +vpmadd52huq zmm1, zmm11, zmmword ptr [rax] +vpmadd52luq zmm1, zmm11, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm11, zmmword ptr [rax+64] +vpmadd52luq zmm2, zmm11, zmmword ptr [rax+128] +vpmadd52huq zmm3, zmm11, zmmword ptr [rax+128] +vpmadd52luq zmm3, zmm11, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm11, zmmword ptr [rax+192] +vpmadd52luq zmm4, zmm11, zmmword ptr [rax+256] +vpmadd52huq zmm5, zmm11, zmmword ptr [rax+256] +vpmadd52luq zmm5, zmm11, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm11, zmmword ptr [rax+320] +vpmadd52luq zmm6, zmm11, zmmword ptr [rax+384] +vpmadd52huq zmm7, zmm11, zmmword ptr [rax+384] +vpmadd52luq zmm7, zmm11, zmmword ptr [rax+448] +vpmadd52huq zmm8, zmm11, zmmword ptr [rax+448] vpsrlq zmm11, zmm12, 52 vpaddq zmm0, zmm0, zmm11 vpxorq zmm11, zmm11, zmm11 vpmadd52luq zmm11, zmm0, qword bcst [r9] -lea rax, ap -call @L2 +vpmadd52luq zmm0, zmm11, zmm20 +vpmadd52huq zmm1, zmm11, zmm20 +vpmadd52luq zmm1, zmm11, zmm21 +vpmadd52huq zmm2, zmm11, zmm21 +vpmadd52luq zmm2, zmm11, zmm22 +vpmadd52huq zmm3, zmm11, zmm22 +vpmadd52luq zmm3, zmm11, zmm23 +vpmadd52huq zmm4, zmm11, zmm23 +vpmadd52luq zmm4, zmm11, zmm24 +vpmadd52huq zmm5, zmm11, zmm24 +vpmadd52luq zmm5, zmm11, zmm25 +vpmadd52huq zmm6, zmm11, zmm25 +vpmadd52luq zmm6, zmm11, zmm26 +vpmadd52huq zmm7, zmm11, zmm26 +vpmadd52luq zmm7, zmm11, zmm27 +vpmadd52huq zmm8, zmm11, zmm27 dec ecx jnz @L1 vpsrlq zmm11, zmm0, 52 @@ -654,29 +706,28 @@ vpandq zmm6, zmm6, zmm9 vpsrlq zmm11, zmm7, 52 vpaddq zmm8, zmm8, zmm11 vpandq zmm7, zmm7, zmm9 -lea rax, p vpxorq zmm10, zmm10, zmm10 -vpsubq zmm12, zmm1, qword bcst [rax] +vpsubq zmm12, zmm1, zmm20 vpsrlq zmm11, zmm12, 63 -vpsubq zmm13, zmm2, qword bcst [rax+8] +vpsubq zmm13, zmm2, zmm21 vpsubq zmm13, zmm13, zmm11 vpsrlq zmm11, zmm13, 63 -vpsubq zmm14, zmm3, qword bcst [rax+16] +vpsubq zmm14, zmm3, zmm22 vpsubq zmm14, zmm14, zmm11 vpsrlq zmm11, zmm14, 63 -vpsubq zmm15, zmm4, qword bcst [rax+24] +vpsubq zmm15, zmm4, zmm23 vpsubq zmm15, zmm15, zmm11 vpsrlq zmm11, zmm15, 63 -vpsubq zmm16, zmm5, qword bcst [rax+32] +vpsubq zmm16, zmm5, zmm24 vpsubq zmm16, zmm16, zmm11 vpsrlq zmm11, zmm16, 63 -vpsubq zmm17, zmm6, qword bcst [rax+40] +vpsubq zmm17, zmm6, zmm25 vpsubq zmm17, zmm17, zmm11 vpsrlq zmm11, zmm17, 63 -vpsubq zmm18, zmm7, qword bcst [rax+48] +vpsubq zmm18, zmm7, zmm26 vpsubq zmm18, zmm18, zmm11 vpsrlq zmm11, zmm18, 63 -vpsubq zmm19, zmm8, qword bcst [rax+56] +vpsubq zmm19, zmm8, zmm27 vpsubq zmm19, zmm19, zmm11 vpsrlq zmm11, zmm19, 63 vpcmpeqq k1, zmm11, zmm10 @@ -713,34 +764,20 @@ ret align 32 @L2: vpmadd52luq zmm0, zmm11, zmmword ptr [rax] -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax] +vpmadd52huq zmm1, zmm11, zmmword ptr [rax] vpmadd52luq zmm1, zmm11, zmmword ptr [rax+64] -vpaddq zmm1, zmm1, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm11, zmmword ptr [rax+64] vpmadd52luq zmm2, zmm11, zmmword ptr [rax+128] -vpaddq zmm2, zmm2, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+128] +vpmadd52huq zmm3, zmm11, zmmword ptr [rax+128] vpmadd52luq zmm3, zmm11, zmmword ptr [rax+192] -vpaddq zmm3, zmm3, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm11, zmmword ptr [rax+192] vpmadd52luq zmm4, zmm11, zmmword ptr [rax+256] -vpaddq zmm4, zmm4, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+256] +vpmadd52huq zmm5, zmm11, zmmword ptr [rax+256] vpmadd52luq zmm5, zmm11, zmmword ptr [rax+320] -vpaddq zmm5, zmm5, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm11, zmmword ptr [rax+320] vpmadd52luq zmm6, zmm11, zmmword ptr [rax+384] -vpaddq zmm6, zmm6, zmm10 -vpxorq zmm10, zmm10, zmm10 -vpmadd52huq zmm10, zmm11, zmmword ptr [rax+384] +vpmadd52huq zmm7, zmm11, zmmword ptr [rax+384] vpmadd52luq zmm7, zmm11, zmmword ptr [rax+448] -vpaddq zmm7, zmm7, zmm10 vpmadd52huq zmm8, zmm11, zmmword ptr [rax+448] ret mcl_c5_vmul endp @@ -1137,7 +1174,38 @@ vpxorq zmm22, zmm22, zmm22 vpmadd52luq zmm21, zmm0, qword bcst [r9] vpmadd52luq zmm22, zmm1, qword bcst [r9] lea rax, apA -call @L5 +vpmadd52luq zmm0, zmm21, zmmword ptr [rax] +vpmadd52luq zmm1, zmm22, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm21, zmmword ptr [rax] +vpmadd52huq zmm3, zmm22, zmmword ptr [rax+64] +vpmadd52luq zmm2, zmm21, zmmword ptr [rax+128] +vpmadd52luq zmm3, zmm22, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm21, zmmword ptr [rax+128] +vpmadd52huq zmm5, zmm22, zmmword ptr [rax+192] +vpmadd52luq zmm4, zmm21, zmmword ptr [rax+256] +vpmadd52luq zmm5, zmm22, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm21, zmmword ptr [rax+256] +vpmadd52huq zmm7, zmm22, zmmword ptr [rax+320] +vpmadd52luq zmm6, zmm21, zmmword ptr [rax+384] +vpmadd52luq zmm7, zmm22, zmmword ptr [rax+448] +vpmadd52huq zmm8, zmm21, zmmword ptr [rax+384] +vpmadd52huq zmm9, zmm22, zmmword ptr [rax+448] +vpmadd52luq zmm8, zmm21, zmmword ptr [rax+512] +vpmadd52luq zmm9, zmm22, zmmword ptr [rax+576] +vpmadd52huq zmm10, zmm21, zmmword ptr [rax+512] +vpmadd52huq zmm11, zmm22, zmmword ptr [rax+576] +vpmadd52luq zmm10, zmm21, zmmword ptr [rax+640] +vpmadd52luq zmm11, zmm22, zmmword ptr [rax+704] +vpmadd52huq zmm12, zmm21, zmmword ptr [rax+640] +vpmadd52huq zmm13, zmm22, zmmword ptr [rax+704] +vpmadd52luq zmm12, zmm21, zmmword ptr [rax+768] +vpmadd52luq zmm13, zmm22, zmmword ptr [rax+832] +vpmadd52huq zmm14, zmm21, zmmword ptr [rax+768] +vpmadd52huq zmm15, zmm22, zmmword ptr [rax+832] +vpmadd52luq zmm14, zmm21, zmmword ptr [rax+896] +vpmadd52luq zmm15, zmm22, zmmword ptr [rax+960] +vpmadd52huq zmm16, zmm21, zmmword ptr [rax+896] +vpmadd52huq zmm17, zmm22, zmmword ptr [rax+960] mov r10, 7 align 32 @L4: @@ -1165,7 +1233,38 @@ vmovdqa64 zmm14, zmm16 vmovdqa64 zmm15, zmm17 vpxorq zmm16, zmm16, zmm16 vpxorq zmm17, zmm17, zmm17 -call @L5 +vpmadd52luq zmm0, zmm21, zmmword ptr [rax] +vpmadd52luq zmm1, zmm22, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm21, zmmword ptr [rax] +vpmadd52huq zmm3, zmm22, zmmword ptr [rax+64] +vpmadd52luq zmm2, zmm21, zmmword ptr [rax+128] +vpmadd52luq zmm3, zmm22, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm21, zmmword ptr [rax+128] +vpmadd52huq zmm5, zmm22, zmmword ptr [rax+192] +vpmadd52luq zmm4, zmm21, zmmword ptr [rax+256] +vpmadd52luq zmm5, zmm22, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm21, zmmword ptr [rax+256] +vpmadd52huq zmm7, zmm22, zmmword ptr [rax+320] +vpmadd52luq zmm6, zmm21, zmmword ptr [rax+384] +vpmadd52luq zmm7, zmm22, zmmword ptr [rax+448] +vpmadd52huq zmm8, zmm21, zmmword ptr [rax+384] +vpmadd52huq zmm9, zmm22, zmmword ptr [rax+448] +vpmadd52luq zmm8, zmm21, zmmword ptr [rax+512] +vpmadd52luq zmm9, zmm22, zmmword ptr [rax+576] +vpmadd52huq zmm10, zmm21, zmmword ptr [rax+512] +vpmadd52huq zmm11, zmm22, zmmword ptr [rax+576] +vpmadd52luq zmm10, zmm21, zmmword ptr [rax+640] +vpmadd52luq zmm11, zmm22, zmmword ptr [rax+704] +vpmadd52huq zmm12, zmm21, zmmword ptr [rax+640] +vpmadd52huq zmm13, zmm22, zmmword ptr [rax+704] +vpmadd52luq zmm12, zmm21, zmmword ptr [rax+768] +vpmadd52luq zmm13, zmm22, zmmword ptr [rax+832] +vpmadd52huq zmm14, zmm21, zmmword ptr [rax+768] +vpmadd52huq zmm15, zmm22, zmmword ptr [rax+832] +vpmadd52luq zmm14, zmm21, zmmword ptr [rax+896] +vpmadd52luq zmm15, zmm22, zmmword ptr [rax+960] +vpmadd52huq zmm16, zmm21, zmmword ptr [rax+896] +vpmadd52huq zmm17, zmm22, zmmword ptr [rax+960] vpsrlq zmm21, zmm23, 52 vpsrlq zmm22, zmm24, 52 vpaddq zmm0, zmm0, zmm21 @@ -1175,7 +1274,38 @@ vpxorq zmm22, zmm22, zmm22 vpmadd52luq zmm21, zmm0, qword bcst [r9] vpmadd52luq zmm22, zmm1, qword bcst [r9] lea rax, apA -call @L5 +vpmadd52luq zmm0, zmm21, zmmword ptr [rax] +vpmadd52luq zmm1, zmm22, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm21, zmmword ptr [rax] +vpmadd52huq zmm3, zmm22, zmmword ptr [rax+64] +vpmadd52luq zmm2, zmm21, zmmword ptr [rax+128] +vpmadd52luq zmm3, zmm22, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm21, zmmword ptr [rax+128] +vpmadd52huq zmm5, zmm22, zmmword ptr [rax+192] +vpmadd52luq zmm4, zmm21, zmmword ptr [rax+256] +vpmadd52luq zmm5, zmm22, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm21, zmmword ptr [rax+256] +vpmadd52huq zmm7, zmm22, zmmword ptr [rax+320] +vpmadd52luq zmm6, zmm21, zmmword ptr [rax+384] +vpmadd52luq zmm7, zmm22, zmmword ptr [rax+448] +vpmadd52huq zmm8, zmm21, zmmword ptr [rax+384] +vpmadd52huq zmm9, zmm22, zmmword ptr [rax+448] +vpmadd52luq zmm8, zmm21, zmmword ptr [rax+512] +vpmadd52luq zmm9, zmm22, zmmword ptr [rax+576] +vpmadd52huq zmm10, zmm21, zmmword ptr [rax+512] +vpmadd52huq zmm11, zmm22, zmmword ptr [rax+576] +vpmadd52luq zmm10, zmm21, zmmword ptr [rax+640] +vpmadd52luq zmm11, zmm22, zmmword ptr [rax+704] +vpmadd52huq zmm12, zmm21, zmmword ptr [rax+640] +vpmadd52huq zmm13, zmm22, zmmword ptr [rax+704] +vpmadd52luq zmm12, zmm21, zmmword ptr [rax+768] +vpmadd52luq zmm13, zmm22, zmmword ptr [rax+832] +vpmadd52huq zmm14, zmm21, zmmword ptr [rax+768] +vpmadd52huq zmm15, zmm22, zmmword ptr [rax+832] +vpmadd52luq zmm14, zmm21, zmmword ptr [rax+896] +vpmadd52luq zmm15, zmm22, zmmword ptr [rax+960] +vpmadd52huq zmm16, zmm21, zmmword ptr [rax+896] +vpmadd52huq zmm17, zmm22, zmmword ptr [rax+960] dec r10 jnz @L4 vpsrlq zmm21, zmm0, 52 @@ -1334,62 +1464,34 @@ align 32 @L5: vpmadd52luq zmm0, zmm21, zmmword ptr [rax] vpmadd52luq zmm1, zmm22, zmmword ptr [rax+64] -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+64] +vpmadd52huq zmm2, zmm21, zmmword ptr [rax] +vpmadd52huq zmm3, zmm22, zmmword ptr [rax+64] vpmadd52luq zmm2, zmm21, zmmword ptr [rax+128] vpmadd52luq zmm3, zmm22, zmmword ptr [rax+192] -vpaddq zmm2, zmm2, zmm19 -vpaddq zmm3, zmm3, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+128] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+192] +vpmadd52huq zmm4, zmm21, zmmword ptr [rax+128] +vpmadd52huq zmm5, zmm22, zmmword ptr [rax+192] vpmadd52luq zmm4, zmm21, zmmword ptr [rax+256] vpmadd52luq zmm5, zmm22, zmmword ptr [rax+320] -vpaddq zmm4, zmm4, zmm19 -vpaddq zmm5, zmm5, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+256] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+320] +vpmadd52huq zmm6, zmm21, zmmword ptr [rax+256] +vpmadd52huq zmm7, zmm22, zmmword ptr [rax+320] vpmadd52luq zmm6, zmm21, zmmword ptr [rax+384] vpmadd52luq zmm7, zmm22, zmmword ptr [rax+448] -vpaddq zmm6, zmm6, zmm19 -vpaddq zmm7, zmm7, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+384] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+448] +vpmadd52huq zmm8, zmm21, zmmword ptr [rax+384] +vpmadd52huq zmm9, zmm22, zmmword ptr [rax+448] vpmadd52luq zmm8, zmm21, zmmword ptr [rax+512] vpmadd52luq zmm9, zmm22, zmmword ptr [rax+576] -vpaddq zmm8, zmm8, zmm19 -vpaddq zmm9, zmm9, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+512] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+576] +vpmadd52huq zmm10, zmm21, zmmword ptr [rax+512] +vpmadd52huq zmm11, zmm22, zmmword ptr [rax+576] vpmadd52luq zmm10, zmm21, zmmword ptr [rax+640] vpmadd52luq zmm11, zmm22, zmmword ptr [rax+704] -vpaddq zmm10, zmm10, zmm19 -vpaddq zmm11, zmm11, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+640] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+704] +vpmadd52huq zmm12, zmm21, zmmword ptr [rax+640] +vpmadd52huq zmm13, zmm22, zmmword ptr [rax+704] vpmadd52luq zmm12, zmm21, zmmword ptr [rax+768] vpmadd52luq zmm13, zmm22, zmmword ptr [rax+832] -vpaddq zmm12, zmm12, zmm19 -vpaddq zmm13, zmm13, zmm20 -vpxorq zmm19, zmm19, zmm19 -vpxorq zmm20, zmm20, zmm20 -vpmadd52huq zmm19, zmm21, zmmword ptr [rax+768] -vpmadd52huq zmm20, zmm22, zmmword ptr [rax+832] +vpmadd52huq zmm14, zmm21, zmmword ptr [rax+768] +vpmadd52huq zmm15, zmm22, zmmword ptr [rax+832] vpmadd52luq zmm14, zmm21, zmmword ptr [rax+896] vpmadd52luq zmm15, zmm22, zmmword ptr [rax+960] -vpaddq zmm14, zmm14, zmm19 -vpaddq zmm15, zmm15, zmm20 vpmadd52huq zmm16, zmm21, zmmword ptr [rax+896] vpmadd52huq zmm17, zmm22, zmmword ptr [rax+960] ret diff --git a/src/gen_bint_x64.py b/src/gen_bint_x64.py index 0e83fb2e..2e393391 100644 --- a/src/gen_bint_x64.py +++ b/src/gen_bint_x64.py @@ -87,6 +87,29 @@ def sub_p_if_possible(t, s, k, z, c, pp, vmask): for i in range(N): vpandq(t[i]|k, s[i], vmask) +# input : s[N] +# output : t[N] = s >= p ? s-p : t +# k : mask register +# c : for CF +# z : for zero +# vp : [C_p] +def sub_p_if_possible2(t, s, k, z, c, vp, vmask): + S = 63 + N = 8 + assert(len(t) == N and len(s) == N) + # s = t-p + for i in range(N): + vpsubq(s[i], t[i], vp[i]) + if i > 0: + vpsubq(s[i], s[i], c) + vpsrlq(c, s[i], S) + + #vpxorq(z, z, z) + vpcmpeqq(k, c, z) # k = s>=0 + # t = select(k, t, s&mask) + for i in range(N): + vpandq(t[i]|k, s[i], vmask) + def gen_vadd(mont, vN=1): SUF = 'A' if vN == 2 else '' with FuncProc(MSM_PRE+'vadd'+SUF): @@ -347,7 +370,7 @@ def vmulUnit(z, px, y, N, H): vmulH(z[N], y, ptr(px+i*64)) # [H]:z[0:N] = z[0:N] + x[] * y -def vmulUnitAdd(z, px, y, N, H): +def vmulUnitAdd(z, px, y, N): for i in range(0, N): vmulL(z[i], y, ptr(px+i*64)) vmulH(z[i+1], y, ptr(px+i*64)) @@ -360,7 +383,7 @@ def shift(v, s): def gen_vmul(mont): with FuncProc(MSM_PRE+'vmul'): - with StackFrame(3, 1, useRCX=True, vNum=mont.N*2+4, vType=T_ZMM) as sf: + with StackFrame(3, 1, useRCX=True, vNum=mont.N*2+4+8, vType=T_ZMM) as sf: regs = list(reversed(sf.v)) W = mont.W N = mont.N @@ -375,9 +398,14 @@ def gen_vmul(mont): H = pops(regs, 1)[0] q = pops(regs, 1)[0] s = pops(regs, N) + vp = pops(regs, N) s0 = s[0] # alias lpL = Label() + # vp = load(C_ap) + lea(rax, ptr(rip+C_ap)) + for i in range(N): + vmovdqa64(vp[i], ptr(rax+i*64)) vmulUnitAddL = Label() mov(rax, mont.mask) @@ -393,9 +421,11 @@ def gen_vmul(mont): vpxorq(q, q, q) vmulL(q, t[0], ptr_b(rp)) - lea(rax, ptr(rip+C_ap)) - - call(vmulUnitAddL) # t += p * q + #lea(rax, ptr(rip+C_ap)) + #call(vmulUnitAddL) # t += p * q + for i in range(0, N): + vmulL(t[i], q, vp[i]) + vmulH(t[i+1], q, vp[i]) # N-1 times loop mov(ecx, N-1) @@ -406,15 +436,20 @@ def gen_vmul(mont): vmovdqa64(q, ptr(py)) add(py, 64) shift(t, s0) - call(vmulUnitAddL) # t += x * py[i] + #call(vmulUnitAddL) # t += x * py[i] + vmulUnitAdd(t, rax, q, N) vpsrlq(q, s0, W) vpaddq(t[0], t[0], q) vpxorq(q, q, q) vmulL(q, t[0], ptr_b(rp)) - lea(rax, ptr(rip+C_ap)) - call(vmulUnitAddL) # t += p * q + #lea(rax, ptr(rip+C_ap)) + #call(vmulUnitAddL) # t += p * q + #vmulUnitAdd(t, rax, q, N) + for i in range(0, N): + vmulL(t[i], q, vp[i]) + vmulH(t[i+1], q, vp[i]) dec(ecx) jnz(lpL) @@ -424,9 +459,9 @@ def gen_vmul(mont): vpaddq(t[i], t[i], q) vpandq(t[i-1], t[i-1], vmask) - lea(rax, ptr(rip+C_p)) + #lea(rax, ptr(rip+C_p)) vpxorq(H, H, H) # zero - sub_p_if_possible(t[1:], s, k1, H, q, rax, vmask) + sub_p_if_possible2(t[1:], s, k1, H, q, vp, vmask) un(vmovdqa64)(ptr(pz), t[1:]) @@ -435,7 +470,7 @@ def gen_vmul(mont): align(32) L(vmulUnitAddL) #set rax(= px) and q(= y) - vmulUnitAdd(t, rax, q, N, H) + vmulUnitAdd(t, rax, q, N) ret() def vmulUnitA(z, px, y, N, H): @@ -454,7 +489,7 @@ def vmulUnitA(z, px, y, N, H): un(vpxorq)(z[N], z[N], z[N]) un(vmulH)(z[N], y, ptr(px+i*64*vN)) -def vmulUnitAddA(z, px, y, N, H): +def vmulUnitAddA(z, px, y, N): un = genUnrollFunc() vN = 2 for i in range(0, N): @@ -509,8 +544,8 @@ def gen_vmulA(mont): un(vmulL)(q, t[0], ptr_b(rp)) lea(rax, ptr(rip+C_apA)) - - call(vmulUnitAddAL) # t += p * q + #call(vmulUnitAddAL) # t += p * q + vmulUnitAddA(t, rax, q, N) # N-1 times loop mov(i_, N-1) @@ -521,7 +556,8 @@ def gen_vmulA(mont): un(vmovdqa64)(q, ptr(py)) add(py, 64*vN) shiftA(t, s0) - call(vmulUnitAddAL) # t += x * py[i] + #call(vmulUnitAddAL) # t += x * py[i] + vmulUnitAddA(t, rax, q, N) un(vpsrlq)(q, s0, W) un(vpaddq)(t[0], t[0], q) @@ -529,7 +565,8 @@ def gen_vmulA(mont): un(vmulL)(q, t[0], ptr_b(rp)) lea(rax, ptr(rip+C_apA)) - call(vmulUnitAddAL) # t += p * q + #call(vmulUnitAddAL) # t += p * q + vmulUnitAddA(t, rax, q, N) dec(i_) jnz(lpL) @@ -559,7 +596,7 @@ def gen_vmulA(mont): align(32) L(vmulUnitAddAL) #set rax(= px) and q(= y) - vmulUnitAddA(t, rax, q, N, H) + vmulUnitAddA(t, rax, q, N) ret() def msm_data(mont): align(64) diff --git a/src/msm_avx.cpp b/src/msm_avx.cpp index 8218c8b4..edc23502 100644 --- a/src/msm_avx.cpp +++ b/src/msm_avx.cpp @@ -339,7 +339,7 @@ inline void vmul(V *z, const V *x, const U *y) uvselect(z, c, t+N, z); #endif } -#if defined(USE_ASM) && defined(__clang__) +#ifdef USE_ASM template<> inline void vmul(Vec *z, const Vec *x, const Vec *y) {