summaryrefslogtreecommitdiff
path: root/vere/ext/gmp/gen/x86_64-windows/mpn/invert_limb.s
blob: ae2d2f05939d154c2420b969488bc225dbd060ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130






























































	.text
	.align	16, 0x90
	.globl	__gmpn_invert_limb
	
	.def	__gmpn_invert_limb
	.scl	2
	.type	32
	.endef
__gmpn_invert_limb:
		
	push	%rdi
	push	%rsi
	mov	%rcx, %rdi

	mov	%rdi, %rax		
	shr	$55, %rax		

	lea	-512+__gmpn_invert_limb_table(%rip), %r8

	movzwl	(%r8,%rax,2), %ecx	

	
	mov	%rdi, %rsi		
	mov	%ecx, %eax	
	imul	%ecx, %ecx	
	shr	$24, %rsi		
	inc	%rsi			
	imul	%rsi, %rcx		
	shr	$40, %rcx		
	sal	$11, %eax		
	dec	%eax
	sub	%ecx, %eax	

	
	mov	$0x1000000000000000, %rcx
	imul	%rax, %rsi		
	sub	%rsi, %rcx
	imul	%rax, %rcx
	sal	$13, %rax
	shr	$47, %rcx
	add	%rax, %rcx		

	
	mov	%rdi, %rsi		
	shr	%rsi			
	sbb	%rax, %rax		
	sub	%rax, %rsi		
	imul	%rcx, %rsi		
	and	%rcx, %rax		
	shr	%rax			
	sub	%rsi, %rax		
	mul	%rcx
	sal	$31, %rcx
	shr	%rdx
	add	%rdx, %rcx		

	mov	%rdi, %rax
	mul	%rcx
	add	%rdi, %rax
	mov	%rcx, %rax
	adc	%rdi, %rdx
	sub	%rdx, %rax

	pop	%rsi
	pop	%rdi
	ret