// This file is generated from a similarly-named Perl script in the BoringSSL
// source tree. Do not edit by hand.

#if defined(__has_feature)
#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
#define OPENSSL_NO_ASM
#endif
#endif

#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__)
#if defined(BORINGSSL_PREFIX)
#include <boringssl_prefix_symbols_asm.h>
#endif
.text	









.globl	_abi_test_trampoline
.private_extern _abi_test_trampoline
.p2align	4
_abi_test_trampoline:











	subq	$120,%rsp


	movq	%r8,48(%rsp)
	movq	%rbx,64(%rsp)


	movq	%rbp,72(%rsp)


	movq	%r12,80(%rsp)


	movq	%r13,88(%rsp)


	movq	%r14,96(%rsp)


	movq	%r15,104(%rsp)


	movq	0(%rsi),%rbx
	movq	8(%rsi),%rbp
	movq	16(%rsi),%r12
	movq	24(%rsi),%r13
	movq	32(%rsi),%r14
	movq	40(%rsi),%r15

	movq	%rdi,32(%rsp)
	movq	%rsi,40(%rsp)




	movq	%rdx,%r10
	movq	%rcx,%r11
	decq	%r11
	js	L$args_done
	movq	(%r10),%rdi
	addq	$8,%r10
	decq	%r11
	js	L$args_done
	movq	(%r10),%rsi
	addq	$8,%r10
	decq	%r11
	js	L$args_done
	movq	(%r10),%rdx
	addq	$8,%r10
	decq	%r11
	js	L$args_done
	movq	(%r10),%rcx
	addq	$8,%r10
	decq	%r11
	js	L$args_done
	movq	(%r10),%r8
	addq	$8,%r10
	decq	%r11
	js	L$args_done
	movq	(%r10),%r9
	addq	$8,%r10
	leaq	0(%rsp),%rax
L$args_loop:
	decq	%r11
	js	L$args_done






	movq	%r11,56(%rsp)
	movq	(%r10),%r11
	movq	%r11,(%rax)
	movq	56(%rsp),%r11

	addq	$8,%r10
	addq	$8,%rax
	jmp	L$args_loop

L$args_done:
	movq	32(%rsp),%rax
	movq	48(%rsp),%r10
	testq	%r10,%r10
	jz	L$no_unwind


	pushfq
	orq	$0x100,0(%rsp)
	popfq



	nop
.globl	_abi_test_unwind_start
.private_extern _abi_test_unwind_start
_abi_test_unwind_start:

	call	*%rax
.globl	_abi_test_unwind_return
.private_extern _abi_test_unwind_return
_abi_test_unwind_return:




	pushfq
	andq	$-0x101,0(%rsp)
	popfq
.globl	_abi_test_unwind_stop
.private_extern _abi_test_unwind_stop
_abi_test_unwind_stop:

	jmp	L$call_done

L$no_unwind:
	call	*%rax

L$call_done:

	movq	40(%rsp),%rsi
	movq	%rbx,0(%rsi)
	movq	%rbp,8(%rsi)
	movq	%r12,16(%rsi)
	movq	%r13,24(%rsi)
	movq	%r14,32(%rsi)
	movq	%r15,40(%rsi)
	movq	64(%rsp),%rbx

	movq	72(%rsp),%rbp

	movq	80(%rsp),%r12

	movq	88(%rsp),%r13

	movq	96(%rsp),%r14

	movq	104(%rsp),%r15

	addq	$120,%rsp



	.byte	0xf3,0xc3




.globl	_abi_test_clobber_rax
.private_extern _abi_test_clobber_rax
.p2align	4
_abi_test_clobber_rax:
	xorq	%rax,%rax
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rbx
.private_extern _abi_test_clobber_rbx
.p2align	4
_abi_test_clobber_rbx:
	xorq	%rbx,%rbx
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rcx
.private_extern _abi_test_clobber_rcx
.p2align	4
_abi_test_clobber_rcx:
	xorq	%rcx,%rcx
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rdx
.private_extern _abi_test_clobber_rdx
.p2align	4
_abi_test_clobber_rdx:
	xorq	%rdx,%rdx
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rdi
.private_extern _abi_test_clobber_rdi
.p2align	4
_abi_test_clobber_rdi:
	xorq	%rdi,%rdi
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rsi
.private_extern _abi_test_clobber_rsi
.p2align	4
_abi_test_clobber_rsi:
	xorq	%rsi,%rsi
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_rbp
.private_extern _abi_test_clobber_rbp
.p2align	4
_abi_test_clobber_rbp:
	xorq	%rbp,%rbp
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r8
.private_extern _abi_test_clobber_r8
.p2align	4
_abi_test_clobber_r8:
	xorq	%r8,%r8
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r9
.private_extern _abi_test_clobber_r9
.p2align	4
_abi_test_clobber_r9:
	xorq	%r9,%r9
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r10
.private_extern _abi_test_clobber_r10
.p2align	4
_abi_test_clobber_r10:
	xorq	%r10,%r10
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r11
.private_extern _abi_test_clobber_r11
.p2align	4
_abi_test_clobber_r11:
	xorq	%r11,%r11
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r12
.private_extern _abi_test_clobber_r12
.p2align	4
_abi_test_clobber_r12:
	xorq	%r12,%r12
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r13
.private_extern _abi_test_clobber_r13
.p2align	4
_abi_test_clobber_r13:
	xorq	%r13,%r13
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r14
.private_extern _abi_test_clobber_r14
.p2align	4
_abi_test_clobber_r14:
	xorq	%r14,%r14
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_r15
.private_extern _abi_test_clobber_r15
.p2align	4
_abi_test_clobber_r15:
	xorq	%r15,%r15
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm0
.private_extern _abi_test_clobber_xmm0
.p2align	4
_abi_test_clobber_xmm0:
	pxor	%xmm0,%xmm0
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm1
.private_extern _abi_test_clobber_xmm1
.p2align	4
_abi_test_clobber_xmm1:
	pxor	%xmm1,%xmm1
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm2
.private_extern _abi_test_clobber_xmm2
.p2align	4
_abi_test_clobber_xmm2:
	pxor	%xmm2,%xmm2
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm3
.private_extern _abi_test_clobber_xmm3
.p2align	4
_abi_test_clobber_xmm3:
	pxor	%xmm3,%xmm3
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm4
.private_extern _abi_test_clobber_xmm4
.p2align	4
_abi_test_clobber_xmm4:
	pxor	%xmm4,%xmm4
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm5
.private_extern _abi_test_clobber_xmm5
.p2align	4
_abi_test_clobber_xmm5:
	pxor	%xmm5,%xmm5
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm6
.private_extern _abi_test_clobber_xmm6
.p2align	4
_abi_test_clobber_xmm6:
	pxor	%xmm6,%xmm6
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm7
.private_extern _abi_test_clobber_xmm7
.p2align	4
_abi_test_clobber_xmm7:
	pxor	%xmm7,%xmm7
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm8
.private_extern _abi_test_clobber_xmm8
.p2align	4
_abi_test_clobber_xmm8:
	pxor	%xmm8,%xmm8
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm9
.private_extern _abi_test_clobber_xmm9
.p2align	4
_abi_test_clobber_xmm9:
	pxor	%xmm9,%xmm9
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm10
.private_extern _abi_test_clobber_xmm10
.p2align	4
_abi_test_clobber_xmm10:
	pxor	%xmm10,%xmm10
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm11
.private_extern _abi_test_clobber_xmm11
.p2align	4
_abi_test_clobber_xmm11:
	pxor	%xmm11,%xmm11
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm12
.private_extern _abi_test_clobber_xmm12
.p2align	4
_abi_test_clobber_xmm12:
	pxor	%xmm12,%xmm12
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm13
.private_extern _abi_test_clobber_xmm13
.p2align	4
_abi_test_clobber_xmm13:
	pxor	%xmm13,%xmm13
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm14
.private_extern _abi_test_clobber_xmm14
.p2align	4
_abi_test_clobber_xmm14:
	pxor	%xmm14,%xmm14
	.byte	0xf3,0xc3


.globl	_abi_test_clobber_xmm15
.private_extern _abi_test_clobber_xmm15
.p2align	4
_abi_test_clobber_xmm15:
	pxor	%xmm15,%xmm15
	.byte	0xf3,0xc3





.globl	_abi_test_bad_unwind_wrong_register
.private_extern _abi_test_bad_unwind_wrong_register
.p2align	4
_abi_test_bad_unwind_wrong_register:


	pushq	%r12





	nop
	popq	%r12

	.byte	0xf3,0xc3








.globl	_abi_test_bad_unwind_temporary
.private_extern _abi_test_bad_unwind_temporary
.p2align	4
_abi_test_bad_unwind_temporary:


	pushq	%r12



	movq	%r12,%rax
	incq	%rax
	movq	%rax,(%rsp)



	movq	%r12,(%rsp)


	popq	%r12

	.byte	0xf3,0xc3








.globl	_abi_test_get_and_clear_direction_flag
.private_extern _abi_test_get_and_clear_direction_flag
_abi_test_get_and_clear_direction_flag:
	pushfq
	popq	%rax
	andq	$0x400,%rax
	shrq	$10,%rax
	cld
	.byte	0xf3,0xc3





.globl	_abi_test_set_direction_flag
.private_extern _abi_test_set_direction_flag
_abi_test_set_direction_flag:
	std
	.byte	0xf3,0xc3

#endif
#if defined(__ELF__)
// See https://www.airs.com/blog/archives/518.
.section .note.GNU-stack,"",%progbits
#endif
