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