Blame sysdeps/x86_64/mul_1.S

Packit Service 82fcde
/* AMD64 __mpn_mul_1 -- Multiply a limb vector with a limb and store
Packit Service 82fcde
   the result in a second limb vector.
Packit Service 82fcde
   Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU MP Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU MP Library is free software; you can redistribute it and/or modify
Packit Service 82fcde
   it under the terms of the GNU Lesser General Public License as published by
Packit Service 82fcde
   the Free Software Foundation; either version 2.1 of the License, or (at your
Packit Service 82fcde
   option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU MP Library is distributed in the hope that it will be useful, but
Packit Service 82fcde
   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service 82fcde
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit Service 82fcde
   License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public License
Packit Service 82fcde
   along with the GNU MP Library; see the file COPYING.LIB.  If not,
Packit Service 82fcde
   see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
#include "asm-syntax.h"
Packit Service 82fcde
Packit Service 82fcde
#define rp	%rdi
Packit Service 82fcde
#define up	%rsi
Packit Service 82fcde
#define n_param	%rdx
Packit Service 82fcde
#define vl	%rcx
Packit Service 82fcde
Packit Service 82fcde
#define n	%r11
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
ENTRY (__mpn_mul_1)
Packit Service 82fcde
	push	%rbx
Packit Service 82fcde
	cfi_adjust_cfa_offset (8)
Packit Service 82fcde
	cfi_rel_offset (%rbx, 0)
Packit Service 82fcde
	xor	%r10, %r10
Packit Service 82fcde
	mov	(up), %rax		/* read first u limb early */
Packit Service 82fcde
	mov	n_param, %rbx		/* move away n from rdx, mul uses it */
Packit Service 82fcde
	mul	vl
Packit Service 82fcde
	mov	%rbx, %r11
Packit Service 82fcde
Packit Service 82fcde
	add	%r10, %rax
Packit Service 82fcde
	adc	$0, %rdx
Packit Service 82fcde
Packit Service 82fcde
	and	$3, %ebx
Packit Service 82fcde
	jz	L(b0)
Packit Service 82fcde
	cmp	$2, %ebx
Packit Service 82fcde
	jz	L(b2)
Packit Service 82fcde
	jg	L(b3)
Packit Service 82fcde
Packit Service 82fcde
L(b1):	dec	n
Packit Service 82fcde
	jne	L(gt1)
Packit Service 82fcde
	mov	%rax, (rp)
Packit Service 82fcde
	jmp	L(ret)
Packit Service 82fcde
L(gt1):	lea	8(up,n,8), up
Packit Service 82fcde
	lea	-8(rp,n,8), rp
Packit Service 82fcde
	neg	n
Packit Service 82fcde
	xor	%r10, %r10
Packit Service 82fcde
	xor	%ebx, %ebx
Packit Service 82fcde
	mov	%rax, %r9
Packit Service 82fcde
	mov	(up,n,8), %rax
Packit Service 82fcde
	mov	%rdx, %r8
Packit Service 82fcde
	jmp	L(L1)
Packit Service 82fcde
Packit Service 82fcde
L(b0):	lea	(up,n,8), up
Packit Service 82fcde
	lea	-16(rp,n,8), rp
Packit Service 82fcde
	neg	n
Packit Service 82fcde
	xor	%r10, %r10
Packit Service 82fcde
	mov	%rax, %r8
Packit Service 82fcde
	mov	%rdx, %rbx
Packit Service 82fcde
	jmp	L(L0)
Packit Service 82fcde
Packit Service 82fcde
L(b3):	lea	-8(up,n,8), up
Packit Service 82fcde
	lea	-24(rp,n,8), rp
Packit Service 82fcde
	neg	n
Packit Service 82fcde
	mov	%rax, %rbx
Packit Service 82fcde
	mov	%rdx, %r10
Packit Service 82fcde
	jmp	L(L3)
Packit Service 82fcde
Packit Service 82fcde
L(b2):	lea	-16(up,n,8), up
Packit Service 82fcde
	lea	-32(rp,n,8), rp
Packit Service 82fcde
	neg	n
Packit Service 82fcde
	xor	%r8, %r8
Packit Service 82fcde
	xor	%ebx, %ebx
Packit Service 82fcde
	mov	%rax, %r10
Packit Service 82fcde
	mov	24(up,n,8), %rax
Packit Service 82fcde
	mov	%rdx, %r9
Packit Service 82fcde
	jmp	L(L2)
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4
Packit Service 82fcde
L(top): mov	%r10, (rp,n,8)
Packit Service 82fcde
	add	%rax, %r9
Packit Service 82fcde
	mov	(up,n,8), %rax
Packit Service 82fcde
	adc	%rdx, %r8
Packit Service 82fcde
	mov	$0, %r10d
Packit Service 82fcde
L(L1):	mul	vl
Packit Service 82fcde
	mov	%r9, 8(rp,n,8)
Packit Service 82fcde
	add	%rax, %r8
Packit Service 82fcde
	adc	%rdx, %rbx
Packit Service 82fcde
L(L0):	mov	8(up,n,8), %rax
Packit Service 82fcde
	mul	vl
Packit Service 82fcde
	mov	%r8, 16(rp,n,8)
Packit Service 82fcde
	add	%rax, %rbx
Packit Service 82fcde
	adc	%rdx, %r10
Packit Service 82fcde
L(L3):	mov	16(up,n,8), %rax
Packit Service 82fcde
	mul	vl
Packit Service 82fcde
	mov	%rbx, 24(rp,n,8)
Packit Service 82fcde
	mov	$0, %r8d                # zero
Packit Service 82fcde
	mov	%r8, %rbx               # zero
Packit Service 82fcde
	add	%rax, %r10
Packit Service 82fcde
	mov	24(up,n,8), %rax
Packit Service 82fcde
	mov	%r8, %r9                # zero
Packit Service 82fcde
	adc	%rdx, %r9
Packit Service 82fcde
L(L2):	mul	vl
Packit Service 82fcde
	add	$4, n
Packit Service 82fcde
	js	L(top)
Packit Service 82fcde
Packit Service 82fcde
	mov	%r10, (rp,n,8)
Packit Service 82fcde
	add	%rax, %r9
Packit Service 82fcde
	adc	%r8, %rdx
Packit Service 82fcde
	mov	%r9, 8(rp,n,8)
Packit Service 82fcde
	add	%r8, %rdx
Packit Service 82fcde
L(ret):	mov	%rdx, %rax
Packit Service 82fcde
Packit Service 82fcde
	pop	%rbx
Packit Service 82fcde
	cfi_adjust_cfa_offset (-8)
Packit Service 82fcde
	cfi_restore (%rbx)
Packit Service 82fcde
	ret
Packit Service 82fcde
END (__mpn_mul_1)