aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Senkevich <andrew.senkevich@intel.com>2015-06-17 15:38:29 +0300
committerAndrew Senkevich <andrew.senkevich@intel.com>2015-06-17 15:38:29 +0300
commit6af25acc7b6313fd8934c3b2f0eb3da5a1c6eb6b (patch)
tree6b667fc73a74f97c43853ce2ffd7b090321412df
parentc71c89e5c72baf43fd44d08dda8ab846eec5b1d6 (diff)
downloadglibc-6af25acc7b6313fd8934c3b2f0eb3da5a1c6eb6b.tar.xz
glibc-6af25acc7b6313fd8934c3b2f0eb3da5a1c6eb6b.zip
Vector log for x86_64 and tests.
Here is implementation of vectorized log containing SSE, AVX, AVX2 and AVX512 versions according to Vector ABI <https://groups.google.com/forum/#!topic/x86-64-abi/LmppCfN1rZ4>. * bits/libm-simd-decl-stubs.h: Added stubs for log. * math/bits/mathcalls.h: Added log declaration with __MATHCALL_VEC. * sysdeps/unix/sysv/linux/x86_64/libmvec.abilist: New versions added. * sysdeps/x86/fpu/bits/math-vector.h: Added SIMD declaration and asm redirections for log. * sysdeps/x86_64/fpu/Makefile (libmvec-support): Added new files. * sysdeps/x86_64/fpu/Versions: New versions added. * sysdeps/x86_64/fpu/libm-test-ulps: Regenerated. * sysdeps/x86_64/fpu/multiarch/Makefile (libmvec-sysdep_routines): Added build of SSE, AVX2 and AVX512 IFUNC versions. * sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S: New file. * sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S: New file. * sysdeps/x86_64/fpu/multiarch/svml_d_log4_core.S: New file. * sysdeps/x86_64/fpu/multiarch/svml_d_log4_core_avx2.S: New file. * sysdeps/x86_64/fpu/multiarch/svml_d_log8_core.S: New file. * sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S: New file. * sysdeps/x86_64/fpu/svml_d_log2_core.S: New file. * sysdeps/x86_64/fpu/svml_d_log4_core.S: New file. * sysdeps/x86_64/fpu/svml_d_log4_core_avx.S: New file. * sysdeps/x86_64/fpu/svml_d_log8_core.S: New file. * sysdeps/x86_64/fpu/svml_d_log_data.S: New file. * sysdeps/x86_64/fpu/svml_d_log_data.h: New file. * sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c: Added vector log test. * sysdeps/x86_64/fpu/test-double-vlen2.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen4.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: Likewise. * sysdeps/x86_64/fpu/test-double-vlen8.c: Likewise. * NEWS: Mention addition of x86_64 vector log.
-rw-r--r--ChangeLog34
-rw-r--r--NEWS2
-rw-r--r--bits/libm-simd-decl-stubs.h4
-rw-r--r--math/bits/mathcalls.h2
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/libmvec.abilist4
-rw-r--r--sysdeps/x86/fpu/bits/math-vector.h12
-rw-r--r--sysdeps/x86_64/fpu/Makefile2
-rw-r--r--sysdeps/x86_64/fpu/Versions1
-rw-r--r--sysdeps/x86_64/fpu/libm-test-ulps12
-rw-r--r--sysdeps/x86_64/fpu/multiarch/Makefile2
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S38
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S229
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log4_core.S38
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log4_core_avx2.S210
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log8_core.S39
-rw-r--r--sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S468
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log2_core.S29
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log4_core.S29
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log4_core_avx.S25
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log8_core.S25
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log_data.S1662
-rw-r--r--sysdeps/x86_64/fpu/svml_d_log_data.h54
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen2.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen4-avx2.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen4.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c1
-rw-r--r--sysdeps/x86_64/fpu/test-double-vlen8.c1
30 files changed, 2927 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index aedec5a5a5..bad022e036 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2015-06-17 Andrew Senkevich <andrew.senkevich@intel.com>
+
+ * bits/libm-simd-decl-stubs.h: Added stubs for log.
+ * math/bits/mathcalls.h: Added log declaration with __MATHCALL_VEC.
+ * sysdeps/unix/sysv/linux/x86_64/libmvec.abilist: New versions added.
+ * sysdeps/x86/fpu/bits/math-vector.h: Added SIMD declaration and asm
+ redirections for log.
+ * sysdeps/x86_64/fpu/Makefile (libmvec-support): Added new files.
+ * sysdeps/x86_64/fpu/Versions: New versions added.
+ * sysdeps/x86_64/fpu/libm-test-ulps: Regenerated.
+ * sysdeps/x86_64/fpu/multiarch/Makefile (libmvec-sysdep_routines): Added
+ build of SSE, AVX2 and AVX512 IFUNC versions.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S: New file.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S: New file.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log4_core.S: New file.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log4_core_avx2.S: New file.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log8_core.S: New file.
+ * sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log2_core.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log4_core.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log4_core_avx.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log8_core.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log_data.S: New file.
+ * sysdeps/x86_64/fpu/svml_d_log_data.h: New file.
+ * sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c: Added vector log test.
+ * sysdeps/x86_64/fpu/test-double-vlen2.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen4.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: Likewise.
+ * sysdeps/x86_64/fpu/test-double-vlen8.c: Likewise.
+ * NEWS: Mention addition of x86_64 vector log.
+
2015-06-17 Szabolcs Nagy <szabolcs.nagy@arm.com>
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return_lazy): Fix
diff --git a/NEWS b/NEWS
index b215276b07..4c666878dd 100644
--- a/NEWS
+++ b/NEWS
@@ -53,7 +53,7 @@ Version 2.22
condition in some applications.
* Added vector math library named libmvec with the following vectorized x86_64
- implementations: cos, cosf, sin, sinf.
+ implementations: cos, cosf, sin, sinf, log.
The library can be disabled with --disable-mathvec. Use of the functions is
enabled with -fopenmp -ffast-math starting from -O1 for GCC version >= 4.9.0.
The library is linked in as needed when using -lm (no need to specify -lmvec
diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h
index 50310d643a..6367b775a3 100644
--- a/bits/libm-simd-decl-stubs.h
+++ b/bits/libm-simd-decl-stubs.h
@@ -41,4 +41,8 @@
#define __DECL_SIMD_sinf
#define __DECL_SIMD_sinl
+#define __DECL_SIMD_log
+#define __DECL_SIMD_logf
+#define __DECL_SIMD_logl
+
#endif
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index fbe7a3a6af..c41946fa0e 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -106,7 +106,7 @@ __MATHCALL (frexp,, (_Mdouble_ __x, int *__exponent));
__MATHCALL (ldexp,, (_Mdouble_ __x, int __exponent));
/* Natural logarithm of X. */
-__MATHCALL (log,, (_Mdouble_ __x));
+__MATHCALL_VEC (log,, (_Mdouble_ __x));
/* Base-ten logarithm of X. */
__MATHCALL (log10,, (_Mdouble_ __x));
diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist
index dcf9c7d148..3357957d3d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist
@@ -1,18 +1,22 @@
GLIBC_2.22
GLIBC_2.22 A
_ZGVbN2v_cos F
+ _ZGVbN2v_log F
_ZGVbN2v_sin F
_ZGVbN4v_cosf F
_ZGVbN4v_sinf F
_ZGVcN4v_cos F
+ _ZGVcN4v_log F
_ZGVcN4v_sin F
_ZGVcN8v_cosf F
_ZGVcN8v_sinf F
_ZGVdN4v_cos F
+ _ZGVdN4v_log F
_ZGVdN4v_sin F
_ZGVdN8v_cosf F
_ZGVdN8v_sinf F
_ZGVeN16v_cosf F
_ZGVeN16v_sinf F
_ZGVeN8v_cos F
+ _ZGVeN8v_log F
_ZGVeN8v_sin F
diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h
index 2b739c5444..ed85622560 100644
--- a/sysdeps/x86/fpu/bits/math-vector.h
+++ b/sysdeps/x86/fpu/bits/math-vector.h
@@ -36,5 +36,17 @@
# define __DECL_SIMD_sin __DECL_SIMD_x86_64
# undef __DECL_SIMD_sinf
# define __DECL_SIMD_sinf __DECL_SIMD_x86_64
+# undef __DECL_SIMD_log
+# define __DECL_SIMD_log __DECL_SIMD_x86_64
+
+/* Workaround to exclude unnecessary symbol aliases in libmvec
+ while GCC creates the vector names based on scalar asm name.
+ Corresponding discussion started at
+ <https://gcc.gnu.org/ml/gcc/2015-06/msg00173.html>. */
+__asm__ ("_ZGVbN2v___log_finite = _ZGVbN2v_log");
+__asm__ ("_ZGVcN4v___log_finite = _ZGVcN4v_log");
+__asm__ ("_ZGVdN4v___log_finite = _ZGVdN4v_log");
+__asm__ ("_ZGVeN8v___log_finite = _ZGVeN8v_log");
+
# endif
#endif
diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile
index b6ecbc3cee..a5097468ee 100644
--- a/sysdeps/x86_64/fpu/Makefile
+++ b/sysdeps/x86_64/fpu/Makefile
@@ -7,6 +7,8 @@ libmvec-support += svml_d_cos2_core svml_d_cos4_core_avx \
svml_s_cosf8_core svml_s_cosf16_core svml_s_cosf_data \
svml_s_sinf4_core svml_s_sinf8_core_avx \
svml_s_sinf8_core svml_s_sinf16_core svml_s_sinf_data \
+ svml_d_log2_core svml_d_log4_core_avx svml_d_log4_core \
+ svml_d_log8_core svml_d_log_data \
init-arch
endif
diff --git a/sysdeps/x86_64/fpu/Versions b/sysdeps/x86_64/fpu/Versions
index 3f3b22812b..7bda47f4af 100644
--- a/sysdeps/x86_64/fpu/Versions
+++ b/sysdeps/x86_64/fpu/Versions
@@ -2,6 +2,7 @@ libmvec {
GLIBC_2.22 {
_ZGVbN2v_cos; _ZGVcN4v_cos; _ZGVdN4v_cos; _ZGVeN8v_cos;
_ZGVbN2v_sin; _ZGVcN4v_sin; _ZGVdN4v_sin; _ZGVeN8v_sin;
+ _ZGVbN2v_log; _ZGVcN4v_log; _ZGVdN4v_log; _ZGVeN8v_log;
_ZGVbN4v_cosf; _ZGVcN8v_cosf; _ZGVdN8v_cosf; _ZGVeN16v_cosf;
_ZGVbN4v_sinf; _ZGVcN8v_sinf; _ZGVdN8v_sinf; _ZGVeN16v_sinf;
}
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index c2b6c4dfcb..949a099090 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1847,6 +1847,18 @@ ifloat: 2
ildouble: 1
ldouble: 1
+Function: "log_vlen2":
+double: 1
+
+Function: "log_vlen4":
+double: 1
+
+Function: "log_vlen4_avx2":
+double: 1
+
+Function: "log_vlen8":
+double: 1
+
Function: "pow":
float: 3
ifloat: 3
diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
index 61759b8d0b..16d93caf57 100644
--- a/sysdeps/x86_64/fpu/multiarch/Makefile
+++ b/sysdeps/x86_64/fpu/multiarch/Makefile
@@ -56,6 +56,8 @@ ifeq ($(subdir),mathvec)
libmvec-sysdep_routines += svml_d_cos2_core_sse4 svml_d_cos4_core_avx2 \
svml_d_cos8_core_avx512 svml_d_sin2_core_sse4 \
svml_d_sin4_core_avx2 svml_d_sin8_core_avx512 \
+ svml_d_log2_core_sse4 svml_d_log4_core_avx2 \
+ svml_d_log8_core_avx512 \
svml_s_cosf4_core_sse4 svml_s_cosf8_core_avx2 \
svml_s_cosf16_core_avx512 svml_s_sinf4_core_sse4 \
svml_s_sinf8_core_avx2 svml_s_sinf16_core_avx512
diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S b/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S
new file mode 100644
index 0000000000..38d369fc3c
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S
@@ -0,0 +1,38 @@
+/* Multiple versions of vectorized log.
+ Copyright (C) 2014-2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <init-arch.h>
+
+ .text
+ENTRY (_ZGVbN2v_log)
+ .type _ZGVbN2v_log, @gnu_indirect_function
+ cmpl $0, KIND_OFFSET+__cpu_features(%rip)
+ jne 1f
+ call __init_cpu_features
+1: leaq _ZGVbN2v_log_sse4(%rip), %rax
+ testl $bit_SSE4_1, __cpu_features+CPUID_OFFSET+index_SSE4_1(%rip)
+ jz 2f
+ ret
+2: leaq _ZGVbN2v_log_sse2(%rip), %rax
+ ret
+END (_ZGVbN2v_log)
+libmvec_hidden_def (_ZGVbN2v_log)
+
+#define _ZGVbN2v_log _ZGVbN2v_log_sse2
+#include "../svml_d_log2_core.S"
diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S
new file mode 100644
index 0000000000..82f3d8215d
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_log2_core_sse4.S
@@ -0,0 +1,229 @@
+/* Function log vectorized with SSE4.
+ Copyright (C) 2014-2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include "svml_d_log_data.h"
+
+ .text
+ENTRY (_ZGVbN2v_log_sse4)
+/*
+ ALGORITHM DESCRIPTION:
+
+ log(x) = -log(Rcp) + log(Rcp*x),
+ where Rcp ~ 1/x (accuracy ~9 bits, obtained by rounding
+ HW approximation to 1+9 mantissa bits)
+
+ Reduced argument R=Rcp*x-1 is used to approximate log(1+R) as polynomial
+
+ log(Rcp) = exponent_Rcp*log(2) + log(mantissa_Rcp)
+ -log(mantissa_Rcp) is obtained from a lookup table,
+ accessed by a 9-bit index
+ */
+ pushq %rbp
+ cfi_adjust_cfa_offset (8)
+ cfi_rel_offset (%rbp, 0)
+ movq %rsp, %rbp
+ cfi_def_cfa_register (%rbp)
+ andq $-64, %rsp
+ subq $320, %rsp
+ movaps %xmm0, %xmm6
+ movq __svml_dlog_data@GOTPCREL(%rip), %r8
+ movaps %xmm6, %xmm3
+ movaps %xmm6, %xmm2
+
+/* isolate exponent bits */
+ movaps %xmm6, %xmm1
+ psrlq $20, %xmm1
+ movups _ExpMask(%r8), %xmm5
+
+/* preserve mantissa, set input exponent to 2^(-10) */
+ andps %xmm6, %xmm5
+ orps _Two10(%r8), %xmm5
+
+/* reciprocal approximation good to at least 11 bits */
+ cvtpd2ps %xmm5, %xmm7
+ cmpltpd _MinNorm(%r8), %xmm3
+ cmpnlepd _MaxNorm(%r8), %xmm2
+ movlhps %xmm7, %xmm7
+
+/* combine and get argument value range mask */
+ orps %xmm2, %xmm3
+ rcpps %xmm7, %xmm0
+ movmskpd %xmm3, %eax
+ movups _HalfMask(%r8), %xmm2
+
+/* argument reduction started: R = Mantissa*Rcp - 1 */
+ andps %xmm5, %xmm2
+ cvtps2pd %xmm0, %xmm4
+ subpd %xmm2, %xmm5
+
+/* round reciprocal to nearest integer, will have 1+9 mantissa bits */
+ roundpd $0, %xmm4, %xmm4
+ mulpd %xmm4, %xmm2
+ mulpd %xmm4, %xmm5
+ subpd _One(%r8), %xmm2
+ addpd %xmm2, %xmm5
+ movups _Threshold(%r8), %xmm2
+
+/* calculate index for table lookup */
+ movaps %xmm4, %xmm3
+ cmpltpd %xmm4, %xmm2
+ pshufd $221, %xmm1, %xmm7
+ psrlq $40, %xmm3
+
+/* convert biased exponent to DP format */
+ cvtdq2pd %xmm7, %xmm0
+ movd %xmm3, %edx
+ movups _poly_coeff_1(%r8), %xmm4
+
+/* polynomial computation */
+ mulpd %xmm5, %xmm4
+ andps _Bias(%r8), %xmm2
+ orps _Bias1(%r8), %xmm2
+
+/*
+ Table stores -log(0.5*mantissa) for larger mantissas,
+ adjust exponent accordingly
+ */
+ subpd %xmm2, %xmm0
+ addpd _poly_coeff_2(%r8), %xmm4
+
+/* exponent*log(2.0) */
+ mulpd _L2(%r8), %xmm0
+ movaps %xmm5, %xmm2
+ mulpd %xmm5, %xmm2
+ movups _poly_coeff_3(%r8), %xmm7
+ mulpd %xmm5, %xmm7
+ mulpd %xmm2, %xmm4
+ addpd _poly_coeff_4(%r8), %xmm7
+ addpd %xmm4, %xmm7
+ mulpd %xmm7, %xmm2
+ movslq %edx, %rdx
+ pextrd $2, %xmm3, %ecx
+
+/*
+ reconstruction:
+ (exponent*log(2)) + (LogRcp + (R+poly))
+ */
+ addpd %xmm2, %xmm5
+ movslq %ecx, %rcx
+ movsd _LogRcp_lookup(%r8,%rdx), %xmm1
+ movhpd _LogRcp_lookup(%r8,%rcx), %xmm1
+ addpd %xmm5, %xmm1
+ addpd %xmm1, %xmm0
+ testl %eax, %eax
+ jne .LBL_1_3
+
+.LBL_1_2:
+ cfi_remember_state
+ movq %rbp, %rsp
+ cfi_def_cfa_register (%rsp)
+ popq %rbp
+ cfi_adjust_cfa_offset (-8)
+ cfi_restore (%rbp)
+ ret
+
+.LBL_1_3:
+ cfi_restore_state
+ movups %xmm6, 192(%rsp)
+ movups %xmm0, 256(%rsp)
+ je .LBL_1_2
+
+ xorb %cl, %cl
+ xorl %edx, %edx
+ movups %xmm8, 112(%rsp)
+ movups %xmm9, 96(%rsp)
+ movups %xmm10, 80(%rsp)
+ movups %xmm11, 64(%rsp)
+ movups %xmm12, 48(%rsp)
+ movups %xmm13, 32(%rsp)
+ movups %xmm14, 16(%rsp)
+ movups %xmm15, (%rsp)
+ movq %rsi, 136(%rsp)
+ movq %rdi, 128(%rsp)
+ movq %r12, 168(%rsp)
+ cfi_offset_rel_rsp (12, 168)
+ movb %cl