summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/alpha/divq.S
blob: cf70862c45ae1191c1e882e573c0455aff1c66be (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
/* taken from glibc 2.2 */

        .set noreorder
        .set noat

        .ent __divqu
        .globl __divqu

        .align 3
__divqu :
        lda     $30 , - 48 ($30 )
        .frame  $30 , 48 , $23  , 0
        .prologue 0
$udiv:
        stq     $1 , 0($30 )
        mov  $25   ,  $1
        stq     $2 , 8($30 )
        mov  $24   ,  $2
        stq     $0 , 16($30 )
        clr     $27
        stq     $3  , 24($30 )
        ldiq    $0  , 1
         stq $4   ,32($30 )
        beq     $1  , $divbyzero

        .align 3


1:      cmpult  $1  , $2  , $at
        blt     $1  , 2f
        addq    $1  , $1  , $1
        addq    $0  , $0  , $0
        bne     $at  , 1b
        unop
2:
3:       addq $27    ,$0  , $4
        srl     $0  , 1, $0
        cmpule  $1  , $2  , $at
        subq    $2  , $1  , $3
         cmovne $at   ,$4  , $27
        srl     $1  , 1, $1
        cmovne  $at  , $3  , $2
        bne     $0  , 3b

$done:  ldq     $1 , 0($30 )
        ldq     $2 , 8($30 )
        ldq     $0 , 16($30 )
        ldq     $3  , 24($30 )
         ldq $4   ,32($30 )
        lda     $30 , 48 ($30 )
        ret     $31 , ($23  ), 1

$divbyzero:
        mov     $16 , $3
        ldiq    $16 , -2
        call_pal 170
        mov     $3  , $16
        clr     $27
        br      $done

        .end __divqu

        .ent __divq
        .globl __divq

        .align 3
__divq :
        lda     $30 , - 48 ($30 )
        .frame  $30 , 48 , $23  , 0
        .prologue 0
        or      $24  , $25  , $at

        bge     $at , $udiv


        stq     $24  , 0($30 )
        negq  $24   ,  $at
        stq     $25  , 8($30 )
        cmovge  $at , $at , $24
        stq     $23  , 16($30 )
        negq  $25   ,  $at
        stq     $3  , 24($30 )
        cmovge  $at , $at , $25


        bsr     $23  , __divqu


        ldq     $24  , 0($30 )
        ldq     $25  , 8($30 )
        xor $24  , $25  ,  $at
        negq  $27   ,  $3

        ldq     $23  , 16($30 )
        cmovlt  $at , $3  , $27
        ldq     $3  , 24($30 )

        lda     $30 , 48 ($30 )
        ret     $31 , ($23  ), 1

        .end    __divq