-
Notifications
You must be signed in to change notification settings - Fork 0
/
libmathasm.S
163 lines (127 loc) · 1.72 KB
/
libmathasm.S
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
.intel_syntax noprefix
.global fac
.global sum
.global power
.global absolute
.global fib
.global collatz
.global gcd
.global lcm
.section .text
// unsigned long fac(unsigned int n)
fac:
cmp rdi, 2
jbe .trivfac
xor rax, rax
or al, 1
mov ecx, edi
cdqe
.loopfac:
cmp ecx, 1
je .endfac
mul rcx
dec ecx
jmp .loopfac
.trivfac:
mov rax, rdi
.endfac:
ret
// unsigned long sum(int n)
sum:
test eax, eax
jz .endsum
cmp eax, 1
jz .endsum
mov rax, 0xFFFFFFFF
and rdi, rax
xor rax, rax
mov eax, edi
inc eax
mul rdi
shr rax
.endsum:
ret
// unsigned long power(int n, unsigned int k)
power:
test esi, esi
jz .endpowone
push rsi
shr esi, 1
call power
pop rsi
mov ecx, esi
and ecx, 1
jz .endpowsq
mul rax
cmp esi, 0
jg .powtimesbase
div rdi
ret
.powtimesbase:
mul rdi
ret
.endpowsq:
mul rax
ret
.endpowone:
mov rax, 1
ret
// unsigned long absolute(long n)
absolute:
xor rax, rax
or rax, rdi
jns .endabs
neg rax
.endabs:
ret
// unsigned long fib(unsigned long n)
fib:
test rdi, rdi
jz .trivfib
cmp rdi, 1
jz .trivfib
push rcx
dec rdi
mov rcx, rdi
xor rdi, rdi
mov rax, 1
.loopfib:
test rcx, rcx
jz .endloopfib
xadd rax, rdi
dec rcx
jmp .loopfib
.endloopfib:
pop rcx
jmp .endfib
.trivfib:
mov rax, rdi
.endfib:
ret
// unsigned long collatz(unsigned long n)
collatz:
xor rcx, rcx
mov rdx, rdi
.loopcollatz:
cmp rdx, 1
jz .endcollatz
test rdx, 1
jz .evencollatz
mov r8, rdx
shl rdx, 1
add rdx, r8
inc rdx
inc rcx
.evencollatz:
shr rdx, 1
inc rcx
jmp .loopcollatz
.endcollatz:
mov rax, rcx
ret
// unsigned long gcd(unsigned long n, unsigned long m)
gcd:
ret
// unsigned long lcm(unsigned long n, unsigned long m)
lcm:
ret