diff --git a/src/math/expm1minus-sse2-rr2-lut16-p3.c b/src/math/expm1minus-sse2-rr2-lut16-p3.c
new file mode 100644
index 0000000..d7572c0
--- /dev/null
+++ b/src/math/expm1minus-sse2-rr2-lut16-p3.c
@@ -0,0 +1,120 @@
+// Copyright 2020 Google LLC
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree.
+
+#include <assert.h>
+#include <stddef.h>
+
+#include <emmintrin.h>
+
+#include <xnnpack/common.h>
+#include <xnnpack/math-stubs.h>
+
+
+// Table of exp2(k / 16) values decremented (as integer) by (k << 19), k = 0..15
+extern XNN_INTERNAL const float xnn_table_exp2minus_k_over_16[16];
+
+void xnn_math_f32_expm1minus__sse2_rr2_lut16_p3(
+    size_t n,
+    const float* input,
+    float* output)
+{
+  assert(n % (4 * sizeof(float)) == 0);
+
+  // The largest x for which expm1f(x) is saturated at -1.0f.
+  const __m128 vsat_cutoff = _mm_set1_ps(-0x1.154246p+4f);
+  // Large number such that ulp(magic bias) == exp2(-4)
+  const __m128 vmagic_bias = _mm_set1_ps(0x1.800000p19f);
+  const __m128 vlog2e = _mm_set1_ps(0x1.715476p+0f);
+  // Mask for the lowest 4 bits
+  const __m128i vindex_mask = _mm_set1_epi32(0xF);
+  // Last 9 bits are zeroes
+  const __m128 vminus_ln2_hi = _mm_set1_ps(-0x1.62E400p-1f);
+  const __m128 vminus_ln2_lo = _mm_set1_ps(-0x1.7F7D1Cp-20f);
+  // Coefficient of polynomial approximation
+  //   exp(t) - 1 ~ t * (1 + t * (c2 + t * c3))
+  // on [-log(2)/32, log(2)/32]
+  const __m128 vc3 = _mm_set1_ps(0x1.55561Cp-3f);
+  const __m128 vc2 = _mm_set1_ps(0x1.0001ECp-1f);
+  const __m128 vone = _mm_set1_ps(1.0f);
+
+  for (; n != 0; n -= 4 * sizeof(float)) {
+    __m128 vx = _mm_loadu_ps(input);
+
+    // The function saturates at -1 for large negative inputs: expm1f(x) == -1.0f for x <= sat_cutoff ~= -17.328680.
+    // To guarantee this behaviour, we clip input at sat_cutoff, and leverage the fact that for our implementation
+    // expm1f(sat_cutoff) == -1.0f. The order of operands in the [V]MAXPS instruction matters: it ensures that NaN
+    // inputs are passed unchanged.
+    vx = _mm_max_ps(vsat_cutoff, vx);
+
+    // Compute reduced argument n := round(x / log(2), 4).
+    // We do it by adding a large number (magic bias), which cause rounding of the result to 4 fractional bits, then
+    // subtracing the large number back. The trick with adding large number is valid only within certain bounds
+    // (|x / log(2)| <= 2**18, i.e. |x| <= 0x1.62E43p+17 = 181704.375), but that is acceptable, because inputs x are
+    // restricted to [-17.328680, 0].
+    // Note that addition-subtraction of the large number doesn't cause overflow for inputs in this range.
+    __m128 vn = _mm_add_ps(_mm_mul_ps(vx, vlog2e), vmagic_bias);
+
+    // Create a floating-point number s (scale) such that s := 2**n for valid inputs, i.e. -17.328680 <= x <= 0.0. As n
+    // has 4 fractional bits, we split s == 2**n = 2**int(n) * 2**frac(n). We create s in two steps:
+    // 1. Fetch 2**frac(n) from the table using the 4 low bits of n, as integer. Note that the fetched values are in
+    //    the [1.0, 2.0) range, i.e. their floating-point exponent is 0.
+    // 2. Adjust fecthed value by addition of int(n) to its floating-point exponent. The result is always a normalized
+    //    number, because for -17.328680 <= x <= 0.0 we have -25 <= int(n) <= 0, and thus the adjusted exponent is not
+    //    lower than -25.
+    //
+    // Shift bits 4:12 into 23:31 (position of floating-point exponent).
+    const __m128i ven = _mm_slli_epi32(_mm_castps_si128(vn), 19);
+
+    // Use bits 0:4 bits of n, as integer, as an index for table lookup of l := 2**frac(n).
+    const __m128i vidx = _mm_slli_epi32(_mm_and_si128(_mm_castps_si128(vn), vindex_mask), 2);
+#if XNN_ARCH_X86_64
+    const uint64_t vidx_lo = (uint64_t) _mm_cvtsi128_si64(vidx);
+    const uint64_t vidx_hi = (uint64_t) _mm_cvtsi128_si64(_mm_unpackhi_epi64(vidx, vidx));
+    const __m128i vl0 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_lo)));
+    const __m128i vl2 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_hi)));
+    const __m128i vl1 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_lo >> 32))));
+    const __m128i vl3 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_hi >> 32))));
+#else
+    const uint32_t vidx0 = (uint32_t) _mm_cvtsi128_si32(vidx);
+    const uint32_t vidx1 = (uint32_t) _mm_extract_epi16(vidx, 2);
+    const uint32_t vidx2 = (uint32_t) _mm_extract_epi16(vidx, 4);
+    const uint32_t vidx3 = (uint32_t) _mm_extract_epi16(vidx, 6);
+    const __m128i vl0 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + vidx0)));
+    const __m128i vl2 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + vidx2)));
+    const __m128i vl1 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + vidx1)));
+    const __m128i vl3 = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + vidx3)));
+#endif
+    const __m128i vl = _mm_unpacklo_epi64(_mm_unpacklo_epi32(vl0, vl1), _mm_unpacklo_epi32(vl2, vl3));
+    // Adjust exponent of the value l fetched from the table to get the final s value.
+    const __m128 vs = _mm_castsi128_ps(_mm_add_epi32(vl, ven));
+
+    // Subtract the large number back to get final n := round(x / log(2), 4).
+    vn = _mm_sub_ps(vn, vmagic_bias);
+
+    // Compute reduced argument t := x - n * log(2).
+    // Use Cody-Waite range reduction method (note two constants to represent log(2)) to improve accuracy.
+    __m128 vt = _mm_add_ps(_mm_mul_ps(vn, vminus_ln2_hi), vx);
+    vt = _mm_add_ps(_mm_mul_ps(vn, vminus_ln2_lo), vt);
+
+    // Compute degree-3 polynomial approximation for exp(t) - 1 on [-log(2)/32, log(2)/32].
+    //   P(t) = t * (1 + t * (c2 + t * c3)) = t + t * (t * (c2 + t * c3)) = t + t * p
+    __m128 vp = _mm_add_ps(_mm_mul_ps(vc3, vt), vc2);
+    vp = _mm_mul_ps(vp, vt);
+
+    // Reconstruct the exp(x) - 1 value:
+    //   exp(x) - 1 = s * (1 + t * (1 + t * (c2 + t * c3))) - 1
+    //              = (s - 1) + s * (t + t * p)
+    //              = ((t * s) + (t * s) * p) + (s - 1)
+    vt = _mm_mul_ps(vt, vs);
+    const __m128 vsm1 = _mm_sub_ps(vs, vone);
+    vp = _mm_add_ps(_mm_mul_ps(vp, vt), vt);
+    const __m128 vf = _mm_add_ps(vp, vsm1);
+
+    _mm_storeu_ps(output, vf);
+
+    input += 4;
+    output += 4;
+  }
+}
