Projects : gscm : gscm_usrbin
1 | .intel_syntax noprefix |
2 | .global sc_wide_mul |
3 | .global sc_wide_mul_signed |
4 | .global sc_bit_length |
5 | .global sc_div_extended |
6 | .text |
7 | |
8 | sc_wide_mul: /* rdi=*a, rsi=*b */ |
9 | mov rax, [rdi] /* *a -> rax */ |
10 | mul qword ptr [rsi] /* unsigned rax*(*b) -> rdx:rax */ |
11 | mov [rdi], rax /* lo -> *a */ |
12 | mov [rsi], rdx /* hi -> *b */ |
13 | ret |
14 | |
15 | sc_wide_mul_signed: |
16 | mov rax, [rdi] |
17 | imul qword ptr [rsi] |
18 | mov [rdi], rax |
19 | mov [rsi], rdx |
20 | ret |
21 | |
22 | sc_bit_length: /* rdi=a */ |
23 | bsr rax, rdi /* Bit Scan Reverse */ |
24 | jz .L1 |
25 | inc rax |
26 | ret |
27 | .L1: /* a=0: rax undefined */ |
28 | xor rax, rax |
29 | ret |
30 | |
31 | sc_div_extended: /* rdi=*a_lo, rsi=*a_hi, rdx=b */ |
32 | mov rcx, rdx /* save b -> rcx */ |
33 | mov rax, [rdi] /* *a_lo -> rax */ |
34 | mov rdx, [rsi] /* *a_hi -> rdx */ |
35 | div rcx /* unsigned rdx:rax / b -> Q rax, R rdx */ |
36 | mov [rsi], rax /* quotient -> *a_hi */ |
37 | mov [rdi], rdx /* remainder -> *a_lo */ |
38 | ret |