diff --git a/lib/ngtcp2_cc.c b/lib/ngtcp2_cc.c index bf1a17eb7a2845c61cd77d9213cdbedb52f17408..ef2e63a0efdac007b26dfd276945c01f9e80ddb9 100644 --- a/lib/ngtcp2_cc.c +++ b/lib/ngtcp2_cc.c @@ -244,6 +244,14 @@ static uint64_t ngtcp2_cbrt(uint64_t n) { #if defined(_MSC_VER) # if defined(_M_X64) d = (int)__lzcnt64(n); +# elif defined(_M_ARM64) + { + unsigned long index; + d = sizeof(uint64_t) * CHAR_BIT; + if (_BitScanReverse64(&index, n)) { + d = d - 1 - index; + } + } # else if ((n >> 32) != 0) { d = __lzcnt((unsigned int)(n >> 32)); diff --git a/lib/ngtcp2_ringbuf.c b/lib/ngtcp2_ringbuf.c index 3e43af8f725b12680e93f174eaca69d10859826a..e4deab1ff76b83f2ff07c8ac38b8c65ab66942f8 100644 --- a/lib/ngtcp2_ringbuf.c +++ b/lib/ngtcp2_ringbuf.c @@ -31,6 +31,16 @@ #include "ngtcp2_macro.h" +#if defined(_MSC_VER) && defined(_M_ARM64) +unsigned int __popcnt(unsigned int x) { + unsigned int c = 0; + for (; x; ++c) { + x &= x - 1; + } + return c; +} +#endif + int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, const ngtcp2_mem *mem) { #ifdef WIN32