Skip to content

Commit 4b77fec

Browse files
Merge #1512: msan: notate more variable assignments from assembly code
f7f0184 msan: notate more variable assignments from assembly code (Cory Fields) a613391 change inconsistent array param to pointer (Cory Fields) Pull request description: This was missed in 31ba404 because older versions of clang did not complain about it. But clang-17, at least, does. The array-as-a-param makes this annoying because `sizeof(l)` is not helpful. I'd be happy to change the size calculation if there are any better suggestions or strong preferences. ACKs for top commit: sipa: utACK f7f0184 real-or-random: ACK f7f0184 tests work fine with clang 17 and `./configure CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls" CC=clang` Tree-SHA512: 8ab22209ef322a10f500b123c82ae5e7141ae1da0e7a890cbf90bd7d2eb11f397db4ccfe15a1666f2f49228585cccbf5bec741effebd1e2c6012cb7ea1689675
2 parents 05bfab6 + f7f0184 commit 4b77fec

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

src/scalar_4x64_impl.h

+22-19
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l)
681681
secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r));
682682
}
683683

684-
static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) {
684+
static void secp256k1_scalar_mul_512(uint64_t *l8, const secp256k1_scalar *a, const secp256k1_scalar *b) {
685685
#ifdef USE_ASM_X86_64
686686
const uint64_t *pb = b->d;
687687
__asm__ __volatile__(
@@ -696,7 +696,7 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
696696
/* (rax,rdx) = a0 * b0 */
697697
"movq %%r15, %%rax\n"
698698
"mulq %%r11\n"
699-
/* Extract l0 */
699+
/* Extract l8[0] */
700700
"movq %%rax, 0(%%rsi)\n"
701701
/* (r8,r9,r10) = (rdx) */
702702
"movq %%rdx, %%r8\n"
@@ -714,7 +714,7 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
714714
"addq %%rax, %%r8\n"
715715
"adcq %%rdx, %%r9\n"
716716
"adcq $0, %%r10\n"
717-
/* Extract l1 */
717+
/* Extract l8[1] */
718718
"movq %%r8, 8(%%rsi)\n"
719719
"xorq %%r8, %%r8\n"
720720
/* (r9,r10,r8) += a0 * b2 */
@@ -735,7 +735,7 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
735735
"addq %%rax, %%r9\n"
736736
"adcq %%rdx, %%r10\n"
737737
"adcq $0, %%r8\n"
738-
/* Extract l2 */
738+
/* Extract l8[2] */
739739
"movq %%r9, 16(%%rsi)\n"
740740
"xorq %%r9, %%r9\n"
741741
/* (r10,r8,r9) += a0 * b3 */
@@ -764,7 +764,7 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
764764
"addq %%rax, %%r10\n"
765765
"adcq %%rdx, %%r8\n"
766766
"adcq $0, %%r9\n"
767-
/* Extract l3 */
767+
/* Extract l8[3] */
768768
"movq %%r10, 24(%%rsi)\n"
769769
"xorq %%r10, %%r10\n"
770770
/* (r8,r9,r10) += a1 * b3 */
@@ -785,7 +785,7 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
785785
"addq %%rax, %%r8\n"
786786
"adcq %%rdx, %%r9\n"
787787
"adcq $0, %%r10\n"
788-
/* Extract l4 */
788+
/* Extract l8[4] */
789789
"movq %%r8, 32(%%rsi)\n"
790790
"xorq %%r8, %%r8\n"
791791
/* (r9,r10,r8) += a2 * b3 */
@@ -800,51 +800,54 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
800800
"addq %%rax, %%r9\n"
801801
"adcq %%rdx, %%r10\n"
802802
"adcq $0, %%r8\n"
803-
/* Extract l5 */
803+
/* Extract l8[5] */
804804
"movq %%r9, 40(%%rsi)\n"
805805
/* (r10,r8) += a3 * b3 */
806806
"movq %%r15, %%rax\n"
807807
"mulq %%r14\n"
808808
"addq %%rax, %%r10\n"
809809
"adcq %%rdx, %%r8\n"
810-
/* Extract l6 */
810+
/* Extract l8[6] */
811811
"movq %%r10, 48(%%rsi)\n"
812-
/* Extract l7 */
812+
/* Extract l8[7] */
813813
"movq %%r8, 56(%%rsi)\n"
814814
: "+d"(pb)
815-
: "S"(l), "D"(a->d)
815+
: "S"(l8), "D"(a->d)
816816
: "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory");
817+
818+
SECP256K1_CHECKMEM_MSAN_DEFINE(l8, sizeof(*l8) * 8);
819+
817820
#else
818821
/* 160 bit accumulator. */
819822
uint64_t c0 = 0, c1 = 0;
820823
uint32_t c2 = 0;
821824

822-
/* l[0..7] = a[0..3] * b[0..3]. */
825+
/* l8[0..7] = a[0..3] * b[0..3]. */
823826
muladd_fast(a->d[0], b->d[0]);
824-
extract_fast(l[0]);
827+
extract_fast(l8[0]);
825828
muladd(a->d[0], b->d[1]);
826829
muladd(a->d[1], b->d[0]);
827-
extract(l[1]);
830+
extract(l8[1]);
828831
muladd(a->d[0], b->d[2]);
829832
muladd(a->d[1], b->d[1]);
830833
muladd(a->d[2], b->d[0]);
831-
extract(l[2]);
834+
extract(l8[2]);
832835
muladd(a->d[0], b->d[3]);
833836
muladd(a->d[1], b->d[2]);
834837
muladd(a->d[2], b->d[1]);
835838
muladd(a->d[3], b->d[0]);
836-
extract(l[3]);
839+
extract(l8[3]);
837840
muladd(a->d[1], b->d[3]);
838841
muladd(a->d[2], b->d[2]);
839842
muladd(a->d[3], b->d[1]);
840-
extract(l[4]);
843+
extract(l8[4]);
841844
muladd(a->d[2], b->d[3]);
842845
muladd(a->d[3], b->d[2]);
843-
extract(l[5]);
846+
extract(l8[5]);
844847
muladd_fast(a->d[3], b->d[3]);
845-
extract_fast(l[6]);
848+
extract_fast(l8[6]);
846849
VERIFY_CHECK(c1 == 0);
847-
l[7] = c0;
850+
l8[7] = c0;
848851
#endif
849852
}
850853

0 commit comments

Comments
 (0)