OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [tools/] [riscv-gnu-toolchain-master/] [gcc/] [libgcc/] [config/] [riscv/] [div.S] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
  .text
2
  .align 2
3
 
4
#ifndef __riscv64
5
/* Our RV64 64-bit routines are equivalent to our RV32 32-bit routines.  */
6
# define __udivdi3 __udivsi3
7
# define __umoddi3 __umodsi3
8
# define __divdi3 __divsi3
9
# define __moddi3 __modsi3
10
#else
11
  .globl __udivsi3
12
__udivsi3:
13
  /* Compute __udivdi3(a0 << 32, a1 << 32); cast result to uint32_t.  */
14
  sll    a0, a0, 32
15
  sll    a1, a1, 32
16
  move   t0, ra
17
  jal    __udivdi3
18
  sext.w a0, a0
19
  jr     t0
20
 
21
  .globl __umodsi3
22
__umodsi3:
23
  /* Compute __udivdi3((uint32_t)a0, (uint32_t)a1); cast a1 to uint32_t.  */
24
  sll    a0, a0, 32
25
  sll    a1, a1, 32
26
  srl    a0, a0, 32
27
  srl    a1, a1, 32
28
  move   t0, ra
29
  jal    __udivdi3
30
  sext.w a0, a1
31
  jr     t0
32
 
33
  .globl __modsi3
34
  __modsi3 = __moddi3
35
 
36
  .globl __divsi3
37
__divsi3:
38
  /* Check for special case of INT_MIN/-1. Otherwise, fall into __divdi3.  */
39
  li    t0, -1
40
  beq   a1, t0, .L20
41
#endif
42
 
43
  .globl __divdi3
44
__divdi3:
45
  bltz  a0, .L10
46
  bltz  a1, .L11
47
  /* Since the quotient is positive, fall into __udivdi3.  */
48
 
49
  .globl __udivdi3
50
__udivdi3:
51
  mv    a2, a1
52
  mv    a1, a0
53
  li    a0, -1
54
  beqz  a2, .L5
55
  li    a3, 1
56
  bgeu  a2, a1, .L2
57
.L1:
58
  blez  a2, .L2
59
  slli  a2, a2, 1
60
  slli  a3, a3, 1
61
  bgtu  a1, a2, .L1
62
.L2:
63
  li    a0, 0
64
.L3:
65
  bltu  a1, a2, .L4
66
  sub   a1, a1, a2
67
  or    a0, a0, a3
68
.L4:
69
  srli  a3, a3, 1
70
  srli  a2, a2, 1
71
  bnez  a3, .L3
72
.L5:
73
  ret
74
 
75
  .globl __umoddi3
76
__umoddi3:
77
  /* Call __udivdi3(a0, a1), then return the remainder, which is in a1.  */
78
  move  t0, ra
79
  jal   __udivdi3
80
  move  a0, a1
81
  jr    t0
82
 
83
  /* Handle negative arguments to __divdi3.  */
84
.L10:
85
  neg   a0, a0
86
  bgez  a1, .L12      /* Compute __udivdi3(-a0, a1), then negate the result.  */
87
  neg   a1, a1
88
  j     __divdi3      /* Compute __udivdi3(-a0, -a1).  */
89
.L11:                 /* Compute __udivdi3(a0, -a1), then negate the result.  */
90
  neg   a1, a1
91
.L12:
92
  move  t0, ra
93
  jal   __divdi3
94
  neg   a0, a0
95
  jr    t0
96
 
97
  .globl __moddi3
98
__moddi3:
99
  move   t0, ra
100
  bltz   a1, .L31
101
  bltz   a0, .L32
102
.L30:
103
  jal    __udivdi3    /* The dividend is not negative.  */
104
  move   a0, a1
105
  jr     t0
106
.L31:
107
  neg    a1, a1
108
  bgez   a0, .L30
109
.L32:
110
  neg    a0, a0
111
  jal    __udivdi3    /* The dividend is hella negative.  */
112
  neg    a0, a1
113
  jr     t0
114
 
115
#ifdef __riscv64
116
  /* continuation of __divsi3 */
117
.L20:
118
  sll   t0, t0, 31
119
  bne   a0, t0, __divdi3
120
  ret
121
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.