.intel_syntax noprefix .global sc_wide_mul .global sc_wide_mul_signed .global sc_bit_length .global sc_div_extended .text sc_wide_mul: /* rdi=*a, rsi=*b */ mov rax, [rdi] /* *a -> rax */ mul qword ptr [rsi] /* unsigned rax*(*b) -> rdx:rax */ mov [rdi], rax /* lo -> *a */ mov [rsi], rdx /* hi -> *b */ ret sc_wide_mul_signed: mov rax, [rdi] imul qword ptr [rsi] mov [rdi], rax mov [rsi], rdx ret sc_bit_length: /* rdi=a */ bsr rax, rdi /* Bit Scan Reverse */ jz .L1 inc rax ret .L1: /* a=0: rax undefined */ xor rax, rax ret sc_div_extended: /* rdi=*a_lo, rsi=*a_hi, rdx=b */ mov rcx, rdx /* save b -> rcx */ mov rax, [rdi] /* *a_lo -> rax */ mov rdx, [rsi] /* *a_hi -> rdx */ div rcx /* unsigned rdx:rax / b -> Q rax, R rdx */ mov [rsi], rax /* quotient -> *a_hi */ mov [rdi], rdx /* remainder -> *a_lo */ ret