• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1@
2@ Written by Wilco Dijkstra, 1996. The following email exchange establishes the
3@ license.
4@
5@ From: Wilco Dijkstra <Wilco.Dijkstra@ntlworld.com>
6@ Date: Fri, Jun 24, 2011 at 3:20 AM
7@ Subject: Re: sqrt routine
8@ To: Kevin Ma <kma@google.com>
9@ Hi Kevin,
10@ Thanks for asking. Those routines are public domain (originally posted to
11@ comp.sys.arm a long time ago), so you can use them freely for any purpose.
12@ Cheers,
13@ Wilco
14@
15@ ----- Original Message -----
16@ From: "Kevin Ma" <kma@google.com>
17@ To: <Wilco.Dijkstra@ntlworld.com>
18@ Sent: Thursday, June 23, 2011 11:44 PM
19@ Subject: Fwd: sqrt routine
20@ Hi Wilco,
21@ I saw your sqrt routine from several web sites, including
22@ http://www.finesse.demon.co.uk/steven/sqrt.html.
23@ Just wonder if there's any copyright information with your Successive
24@ approximation routines, or if I can freely use it for any purpose.
25@ Thanks.
26@ Kevin
27
28@ Minor modifications in code style for WebRTC, 2012.
29@ Output is bit-exact with the reference C code in spl_sqrt_floor.c.
30
31@ Input :             r0 32 bit unsigned integer
32@ Output:             r0 = INT (SQRT (r0)), precision is 16 bits
33@ Registers touched:  r1, r2
34
35#include "webrtc/system_wrappers/include/asm_defines.h"
36
37GLOBAL_FUNCTION WebRtcSpl_SqrtFloor
38.align  2
39DEFINE_FUNCTION WebRtcSpl_SqrtFloor
40  mov    r1, #3 << 30
41  mov    r2, #1 << 30
42
43  @ unroll for i = 0 .. 15
44
45  cmp    r0, r2, ror #2 * 0
46  subhs  r0, r0, r2, ror #2 * 0
47  adc    r2, r1, r2, lsl #1
48
49  cmp    r0, r2, ror #2 * 1
50  subhs  r0, r0, r2, ror #2 * 1
51  adc    r2, r1, r2, lsl #1
52
53  cmp    r0, r2, ror #2 * 2
54  subhs  r0, r0, r2, ror #2 * 2
55  adc    r2, r1, r2, lsl #1
56
57  cmp    r0, r2, ror #2 * 3
58  subhs  r0, r0, r2, ror #2 * 3
59  adc    r2, r1, r2, lsl #1
60
61  cmp    r0, r2, ror #2 * 4
62  subhs  r0, r0, r2, ror #2 * 4
63  adc    r2, r1, r2, lsl #1
64
65  cmp    r0, r2, ror #2 * 5
66  subhs  r0, r0, r2, ror #2 * 5
67  adc    r2, r1, r2, lsl #1
68
69  cmp    r0, r2, ror #2 * 6
70  subhs  r0, r0, r2, ror #2 * 6
71  adc    r2, r1, r2, lsl #1
72
73  cmp    r0, r2, ror #2 * 7
74  subhs  r0, r0, r2, ror #2 * 7
75  adc    r2, r1, r2, lsl #1
76
77  cmp    r0, r2, ror #2 * 8
78  subhs  r0, r0, r2, ror #2 * 8
79  adc    r2, r1, r2, lsl #1
80
81  cmp    r0, r2, ror #2 * 9
82  subhs  r0, r0, r2, ror #2 * 9
83  adc    r2, r1, r2, lsl #1
84
85  cmp    r0, r2, ror #2 * 10
86  subhs  r0, r0, r2, ror #2 * 10
87  adc    r2, r1, r2, lsl #1
88
89  cmp    r0, r2, ror #2 * 11
90  subhs  r0, r0, r2, ror #2 * 11
91  adc    r2, r1, r2, lsl #1
92
93  cmp    r0, r2, ror #2 * 12
94  subhs  r0, r0, r2, ror #2 * 12
95  adc    r2, r1, r2, lsl #1
96
97  cmp    r0, r2, ror #2 * 13
98  subhs  r0, r0, r2, ror #2 * 13
99  adc    r2, r1, r2, lsl #1
100
101  cmp    r0, r2, ror #2 * 14
102  subhs  r0, r0, r2, ror #2 * 14
103  adc    r2, r1, r2, lsl #1
104
105  cmp    r0, r2, ror #2 * 15
106  subhs  r0, r0, r2, ror #2 * 15
107  adc    r2, r1, r2, lsl #1
108
109  bic    r0, r2, #3 << 30  @ for rounding add: cmp r0, r2  adc r2, #1
110  bx lr
111