summaryrefslogtreecommitdiffstats
path: root/src/cep.S
blob: 8b7661d8719d4b829e7f907630e8bd298e3fd037 (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
#include "abi.inc"
#include "defs.inc"

        .text

PUBFUNC cepis_normalize_cep
        test    %rsi, %rsi
        jz      .Lnorm_usage
        movb    $0, (%rsi)
        test    %rdi, %rdi
        jz      .Lnorm_bad
        xor     %ecx, %ecx
.Lnorm_loop:
        movzbl  (%rdi), %eax
        inc     %rdi
        test    %al, %al
        jz      .Lnorm_done
        cmp     $'-', %al
        je      .Lnorm_loop
        cmp     $'.', %al
        je      .Lnorm_loop
        cmp     $' ', %al
        je      .Lnorm_loop
        cmp     $9, %al
        jb      .Lnorm_digit
        cmp     $13, %al
        jbe     .Lnorm_loop
.Lnorm_digit:
        cmp     $'0', %al
        jb      .Lnorm_bad
        cmp     $'9', %al
        ja      .Lnorm_bad
        cmp     $8, %rcx
        jae     .Lnorm_bad
        mov     %al, (%rsi, %rcx, 1)
        inc     %rcx
        jmp     .Lnorm_loop
.Lnorm_done:
        cmp     $8, %rcx
        jne     .Lnorm_bad
        movb    $0, 8(%rsi)
        xor     %eax, %eax
        ret
.Lnorm_bad:
        movb    $0, (%rsi)
        mov     $CEPIS_ERR_INVALID_CEP, %eax
        ret
.Lnorm_usage:
        mov     $CEPIS_ERR_USAGE, %eax
        ret
ENDFUNC cepis_normalize_cep

        .section .note.GNU-stack,"",@progbits