1 |
%$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_cil0/c_cil0.tex,v 1.24 2003/11/03 02:14:24 dtashley Exp $
|
2 |
|
3 |
\chapter[\ccilzeroshorttitle{}]{\ccilzerolongtitle{}}
|
4 |
|
5 |
\label{ccil0}
|
6 |
|
7 |
\beginchapterquote{``If our ancestors had invented arithmetic by counting with
|
8 |
their two fists or their eight fingers, instead of their
|
9 |
ten `digits', we would never have to worry about
|
10 |
writing binary-decimal conversion routines.
|
11 |
(And we would perhaps never have learned as much about
|
12 |
number systems.)''}
|
13 |
{Donald E. Knuth, \cite[p. 319]{bibref:b:knuthclassic2ndedvol2}}
|
14 |
|
15 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
16 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
17 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
18 |
\section{Introduction}
|
19 |
%Section tag: INT0
|
20 |
\label{ccil0:sint0}
|
21 |
|
22 |
Low-cost microcontrollers have no support for floating-point arithmetic,
|
23 |
and so integer arithmetic and fixed-point arithmetic are used nearly exclusively
|
24 |
in embedded systems. The ability to implement integer arithmetic
|
25 |
economically is a critical skill in the development of embedded
|
26 |
systems.
|
27 |
|
28 |
Integer arithmetic algorithms are critically important in embedded
|
29 |
systems for the following reasons:
|
30 |
|
31 |
\begin{itemize}
|
32 |
\item Mistakes in the implementation of arithmetic are frequently
|
33 |
responsible for product problems. (Mistakes are not confined
|
34 |
to obvious errors---errors such as filters which do not converge
|
35 |
on their input are also responsible for product problems.)
|
36 |
\item Floating-point arithmetic is not available or ill-advised
|
37 |
for nearly all small embedded systems for the following reasons:
|
38 |
\begin{itemize}
|
39 |
\item Low-cost microcontrollers do not possess hardware support for
|
40 |
floating-point arithmetic.
|
41 |
\item Implementation of floating-point arithmetic in software is
|
42 |
computationally expensive.
|
43 |
\item Implementation of floating-point arithmetic in software may
|
44 |
require large floating-point libraries, typically consuming
|
45 |
1K-4K of ROM.
|
46 |
\item Safety-critical software standards typically prohibit the
|
47 |
use of floating-point arithmetic.
|
48 |
\end{itemize}
|
49 |
\item Integer arithmetic algorithms (other than addition and subtraction)
|
50 |
are quite tedious and error-prone for a software developer to design, implement, and
|
51 |
unit test. The implementation of such algorithms represents
|
52 |
cost and risk. Cost and risk benefits are achieved if the algorithms in detail are
|
53 |
available in advance (thus precluding design activities), or
|
54 |
better yet if ready-to-use integer algorithm libraries are available.
|
55 |
\end{itemize}
|
56 |
|
57 |
This chapter describes the more fundamental principles and algorithms
|
58 |
(representation, fixed-point arithmetic, treatment of overflow, comparison,
|
59 |
addition, subtraction, multiplication, and division). A section
|
60 |
(Section \ref{ccil0:smim0}) is also included
|
61 |
on miscellaneous mappings involving integers which
|
62 |
are not numerical in intent.
|
63 |
Chapter %\cdtazeroxrefhyphen\cdtazerovolarabic{}
|
64 |
TBD
|
65 |
describes more complicated
|
66 |
integer algorithms and techniques (discrete-time operations
|
67 |
such as filtering, integration, and differentiation as well as more
|
68 |
complex functions such as square root). The split between these two chapters
|
69 |
is arbitrary; and in fact the material could have been divided differently
|
70 |
or combined.
|
71 |
|
72 |
Treatment of the topics in this chapter is largely in accordance with
|
73 |
Knuth \cite{bibref:b:knuthclassic2ndedvol2}. The principal issues in
|
74 |
the implementation of integer algorithms are:
|
75 |
|
76 |
\begin{itemize}
|
77 |
\item \textbf{How to use the arithmetic [or other] instructions provided by the machine to
|
78 |
operate on larger operands.} Microcontrollers typically provide arithmetic
|
79 |
instructions (comparison, shifting, addition, subtraction, and often but not
|
80 |
always multiplication and/or division) that operate on 8-bit or 16-bit integers.
|
81 |
A key question
|
82 |
is how small-operand instructions ``scale up''---that is, if and how they can
|
83 |
be used to assist in the implementation of integer arithmetic for much larger
|
84 |
operands.
|
85 |
\item \textbf{The order of the algorithm involved.} The order of algorithms
|
86 |
is a complicated issue when applied to microcontroller work. Many sophisticated
|
87 |
algorithms have a breakpoint below which they are less economical than
|
88 |
an inferior algorithm. Some applications (such as generating cryptographic keys
|
89 |
when integers thousands of bits long must be tested for primality) will
|
90 |
benefit from sophisticated algorithms becuase the operand sizes are large enough
|
91 |
to pass any such breakpoints. However, in microcontroller work, the need to manipulate
|
92 |
integers longer than 64 bits is very rare; thus, the breakpoints that indicate the
|
93 |
use of more sophisticated algorithms may not be reached. In microcontroller work,
|
94 |
depending on the operand sizes, there are circumstances in which an
|
95 |
$O(n^2)$ algorithm may be preferable to an $O(\log n)$ algorithm. Generally,
|
96 |
the order of algorithms must be balanced against operand sizes.
|
97 |
\end{itemize}
|
98 |
|
99 |
We do diverge from Knuth in some areas. The most prominent divergence is
|
100 |
in the proofs offered for some important theorems and lemmas. Knuth
|
101 |
employs contrapositive proof formats in many circumstances, whereas we prefer
|
102 |
to use linear proofs that are more understandable to engineers and microcontroller
|
103 |
software developers.
|
104 |
|
105 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
106 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
107 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
108 |
\section[Paradigms And Principles]
|
109 |
{Paradigms And Principles Of Microcontroller Arithmetic}
|
110 |
%Section tag: PPM0
|
111 |
\label{ccil0:sppm0}
|
112 |
|
113 |
How should one think about microcontroller arithmetic? What principles
|
114 |
guide us in its design and implementation? In this section,
|
115 |
we provide some general principles and paradigms of thought.
|
116 |
|
117 |
|
118 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
119 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
120 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
121 |
\subsection{Microcontroller Arithmetic As An Accident Of Silicon Design}
|
122 |
%Subsection tag: MAS0
|
123 |
\label{ccil0:sppm0:smas0}
|
124 |
|
125 |
In chapters
|
126 |
\cfryzeroxrefhyphen{}\ref{cfry0},
|
127 |
\ccfrzeroxrefhyphen{}\ref{ccfr0},
|
128 |
and
|
129 |
\cratzeroxrefhyphen{}\ref{crat0}
|
130 |
we consider rational approximation,
|
131 |
both in the form $h/k$ and $h/2^q$. Both forms of rational approximation
|
132 |
tend to be effective because we know that all modern processors possess
|
133 |
shift instructions, most possess integer multiply instructions, and many
|
134 |
possess integer divide instructions. In other words, the design
|
135 |
of the machine instruction set drives the strategies for implementation
|
136 |
of arithmetic, and makes some strategies attractive.
|
137 |
|
138 |
Similarly, the observation that all microcontrollers provide instructions
|
139 |
for integer arithmetic creates the attractiveness of fixed-point arithmetic.
|
140 |
|
141 |
Thus, we might view our approaches to microcontroller arithmetic as
|
142 |
an ``accident'' of silicon design, or as being driven by silicon
|
143 |
design.
|
144 |
|
145 |
Generally, we seek to determine the best way to use the primitive
|
146 |
operations provided by the machine (the instruction set) to
|
147 |
accomplish the mappings of interest.
|
148 |
|
149 |
The ``classic'' algorithms
|
150 |
presented by Knuth
|
151 |
Knuth (\cite[pp. 265-284]{bibref:b:knuthclassic2ndedvol2}) are especially
|
152 |
designed to use the ``small'' addition, subtraction, multiplication, and
|
153 |
division provided by the machine to add, subtract, multiply, and divide arbitrarily
|
154 |
large integers. In
|
155 |
\cite[pp. 265-266]{bibref:b:knuthclassic2ndedvol2}) Knuth writes:
|
156 |
|
157 |
\begin{quote}
|
158 |
\emph{The most important fact to understand about extended-precision numbers
|
159 |
is that they may be regarded as numbers written in radix-$w$ notation,
|
160 |
where $w$ is the computer's word size. For example, an integer that
|
161 |
fills 10 words on a computer whose word size is $w=10^{10}$ has 100
|
162 |
decimal digits; but we will consider it to be a 10-place number to
|
163 |
the base $10^{10}$. This viewpoint is justified for the same reason
|
164 |
that we may convert, say, from binary to hexadecimal notation,
|
165 |
simply by grouping the bits together.}
|
166 |
|
167 |
\emph{In these terms, we are given the following primitive operations to work with:}
|
168 |
|
169 |
\begin{itemize}
|
170 |
\item \emph{a$_0$) addition or subtraction of one-place integers, giving a one-place
|
171 |
answer and a carry;}
|
172 |
\item \emph{b$_0$) multiplication of a one-place integer by another one-place integer,
|
173 |
giving a two place answer;}
|
174 |
\item \emph{c$_0$) division of a two-place integer by a one-place integer,
|
175 |
provided that the quotient is a one-place integer, and yielding
|
176 |
also a one-place remainder.}
|
177 |
\end{itemize}
|
178 |
|
179 |
\noindent{}\emph{By adjusting the word size, if necessary, nearly all computers
|
180 |
will have these three operations available; so we will construct algorithms
|
181 |
(a), (b), and (c) mentioned above in terms of the primitive operations
|
182 |
(a$_0$), (b$_0$), and (c$_0$).}
|
183 |
|
184 |
\emph{Since we are visualizing extended-precision integers as base $b$ numbers, it is
|
185 |
sometimes helpful to think of the situation when $b = 10$, and to imagine
|
186 |
that we are doing the arithmetic by hand. Then operation (a$_0$) is analogous
|
187 |
to memorizing the addition table; (b$_0$) is analogous to memorizing the
|
188 |
multiplication table, and (c$_0$) is essentially memorizing the multiplication
|
189 |
table in reverse. The more complicated operations (a), (b), (c) on
|
190 |
high-precision numbers can now be done using simple addition, subraction,
|
191 |
multiplication, and long-division procedures that children are taught
|
192 |
in elementary school.}
|
193 |
\end{quote}
|
194 |
|
195 |
The critical issue for implementation of integer arithmetic with large operands
|
196 |
is how to use small-operand instructions to operate on larger operands---in other words,
|
197 |
how to ``scale up'' the capability provided by the instruction set.
|
198 |
|
199 |
|
200 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
201 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
202 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
203 |
\subsection{Microcontroller Arithmetic As A Mapping From Quantized Domain To
|
204 |
Quantized Range}
|
205 |
%Subsection tag: MAM0
|
206 |
\label{ccil0:sppm0:smam0}
|
207 |
|
208 |
Microcontroller software accepts inputs which are quantized. In nearly all cases,
|
209 |
this involves a mapping from $\vworkrealset$ to $\vworkintset$. Often, because
|
210 |
microcontroller products are optimized for cost, the quantization hardware
|
211 |
delivers quite poor precision, frequently less than 8 bits.
|
212 |
|
213 |
When a quantized input is accepted, it defines an inquality. Knowledge of
|
214 |
the quantized input (an integer) confines the actual input (a real
|
215 |
number, before
|
216 |
quantization) to an interval. With a low-cost hardware design, the
|
217 |
interval can be fairly large. Usually, by adding cost, the
|
218 |
interval can be made smaller.
|
219 |
|
220 |
Microcontroller outputs tend to be quantized as well, so it is
|
221 |
accurate to also characterize outputs as integers. For example, a PWM signal
|
222 |
generated by a microcontroller or the output of a D/A converter is
|
223 |
controlled by data that is an integer. Like inputs, often the ``granularity''
|
224 |
with which outputs can be controlled is quite coarse---again, 8 bits or
|
225 |
less is not uncommon.
|
226 |
|
227 |
Thus, we may view microcontroller software as a mapping from poor-quality
|
228 |
inputs to poor-quality outputs.
|
229 |
|
230 |
In such a framework, where the nature of inputs and outputs introduces
|
231 |
substantial error, it is imperative not to introduce additional error
|
232 |
in computer arithmetic. In other words, given inputs which are
|
233 |
integers, the responsibility of the software is to choose the best
|
234 |
integers as outputs. Usually this means that calculations should be
|
235 |
devised so as not to lose any information (i.e.
|
236 |
not to lose remainders, for example). Losing information is usually
|
237 |
equivalent to not being able to make the most correct mapping from input
|
238 |
to output. ``Lossy'' arithmetic can degrade the performance of a system,
|
239 |
since poor arithmetic may compound an inexpensive hardware design.
|
240 |
|
241 |
|
242 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
243 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
244 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
245 |
\subsection{Microcontroller Arithmetic As A Simulation Of Continuous Controllers}
|
246 |
%Subsection tag: MAE0
|
247 |
\label{ccil0:sppm0:smae0}
|
248 |
|
249 |
Control systems have not always employed digital controllers.
|
250 |
Many books and web sites (see \cite{bibref:w:historycontrol01}, for example)
|
251 |
discuss the historical development of feedback control. Controllers
|
252 |
have not historically been digital, or even electronic.
|
253 |
Early controllers for governing steam devices or windmills were
|
254 |
ultimately mechanical, and relied upon inertia or other physical
|
255 |
properties. It is possible to realize abstract notions
|
256 |
(integrators, differentiators, gains) using hydraulic systems or other mechanical systems;
|
257 |
and in fact hydraulic feedback controllers were used in early rockets
|
258 |
and aircraft. Very naturally, abstract notions (integrators,
|
259 |
differentiators, gains) can be implemented using analog
|
260 |
electronic components. The most common implementations involve
|
261 |
operational amplifiers, and the behavior of such implementations comes
|
262 |
very close to the ideal mathematical models.
|
263 |
|
264 |
Mechanical, hydraulic, and non-digital electronic controllers have
|
265 |
one very desirable characteristic---\emph{clipping}. If, for example,
|
266 |
one provides an analog differentiator with a $dV/dt$ which
|
267 |
is too large, the output that the differentiator can
|
268 |
provide is limited, usually by the supply voltage available to an operational
|
269 |
amplifier.
|
270 |
The differentiator \emph{must} clip.
|
271 |
|
272 |
Clipping often leads to behavior which is close to what
|
273 |
intuition would expect (i.e. we would present
|
274 |
clipping as an occasional advantage). For example, if an input to
|
275 |
an analog control system suffers a failure, the behavior
|
276 |
the of the controller is limited, as is its internal
|
277 |
state. Similarly, when the
|
278 |
input is restored, the controller will usually recover
|
279 |
in a reasonable time because the
|
280 |
state of the controller (typically maintained in capacitors) is limited
|
281 |
in the magnitude it can attain.
|
282 |
|
283 |
We might view a digital controller as an emulation of
|
284 |
an analog controller. We may want to cause the
|
285 |
controller to have limits (i.e. rails) internally, for
|
286 |
example to prevent excessive integrator ``windup''. We discuss
|
287 |
this further in Section \ref{ccil0:sode0}.
|
288 |
|
289 |
|
290 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
291 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
292 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
293 |
\section{Practical Design Issues}
|
294 |
%Section tag: PDI0
|
295 |
\label{ccil0:spdi0}
|
296 |
|
297 |
In this section, we consider practical issues surrounding the design
|
298 |
and construction of a set of integer arithmetic subroutines.
|
299 |
In practice, such a collection of subroutines is likely to be
|
300 |
arranged into a library. The purpose of the library would be to
|
301 |
free the clients (or callers) of the library from the complexity of
|
302 |
large integer calculations.
|
303 |
|
304 |
The design decisions surrounding the construction of a library vary in
|
305 |
the objectivity with which they can be approached. Some design decisions
|
306 |
(such as the best mechanism for passing parameters) can be approached
|
307 |
rigorously because the measures of goodness are unequivocal (minimal ROM consumption
|
308 |
or execution time, for example). However, other design decisions, particulary the
|
309 |
decision of the exact nature of the interface between an arithmetic library and
|
310 |
its clients, are more subjective. One size does \emph{not} fit all.
|
311 |
|
312 |
|
313 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
314 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
315 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
316 |
\subsection{Parameter Passing And Temporary Storage Mechanisms}
|
317 |
%Subsection tag: PPM0
|
318 |
\label{ccil0:spdi0:sppm0}
|
319 |
|
320 |
In small microcontroller work, the desire to save ROM and execution time
|
321 |
may lead to inelegant software construction. Because an arithmetic library
|
322 |
used in microcontroller work may be called from many different places
|
323 |
throughout ROM, serious thought should be given to optimizing the
|
324 |
parameter passing mechanisms, even perhaps at the expense of elegance.
|
325 |
The way in which the arithmetic library allocates temporary storage is
|
326 |
also a point of concern, because the most elegant way of allocating temporary
|
327 |
storage (on the stack) may either not be feasible (because of the possibility
|
328 |
of stack overflow) or may not be efficient (because the addressing modes of
|
329 |
the machine make data on the stack inefficient to address). In this section
|
330 |
we discuss both parameter passing and temporary storage mechanisms.
|
331 |
|
332 |
In the remainder of the discussion, we make the following assumptions
|
333 |
about software architecture.
|
334 |
|
335 |
\begin{enumerate}
|
336 |
\item \textbf{The arithmetic library need not be re-entrant.}
|
337 |
Most ``small'' microcontroller software loads use a non-preemptive
|
338 |
scheduling paradigm, so this is a reasonable assumption. We also
|
339 |
make the reasonable assumption that ISR's may not make calls into
|
340 |
the arithmetic library.
|
341 |
\item \textbf{Dynamic memory allocation, other than on the stack,
|
342 |
is not allowed by the software architecture.} This is also
|
343 |
a reasonable assumption in ``small'' microcontroller software.
|
344 |
\end{enumerate}
|
345 |
|
346 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
347 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
348 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
349 |
\subsubsection{Parameter Passing Mechanisms}
|
350 |
%Subsubsection tag: PPM0
|
351 |
\label{ccil0:spdi0:sppm0:sppm0}
|
352 |
|
353 |
If an arithmetic library exists in a microcontroller software load,
|
354 |
it may be called many times throughout ROM. Thus, the parameter
|
355 |
passing mechanisms chosen may have a large effect on ROM consumption
|
356 |
(due to the setup required for each subroutine call multiplied by
|
357 |
many instances throughout ROM) and execution time
|
358 |
(because in microcontroller software longer instructions nearly always
|
359 |
require more time). Because of the criticality of ROM consumption,
|
360 |
parameter passing mechanisms that lack elegance may be attractive.
|
361 |
|
362 |
In the category of parameter passing, we also include the way in which
|
363 |
return value(s) are passed back to the caller.
|
364 |
|
365 |
The following parameter-passing mechanisms may be employed:
|
366 |
|
367 |
\begin{enumerate}
|
368 |
\item \textbf{Pass by value as storage class \emph{automatic}.}
|
369 |
The most common scenario is that the arithmetic
|
370 |
library is written in assembly-language to be called from
|
371 |
`C', and so the assembly-language subroutines must adhere to the
|
372 |
parameter-passing conventions used by the compiler.
|
373 |
This usually means that the entire input or output value
|
374 |
will be passed in CPU registers or on the stack. Somewhat rarely,
|
375 |
a compiler will pass parameters in static locations.\footnote{The
|
376 |
usual reason for a `C' compiler to pass parameters in static locations
|
377 |
is because the instruction set of the machine was not designed for
|
378 |
higher-level languages, and references to [usually \emph{near}] memory
|
379 |
are cheaper than stack references. Such compilers also typically
|
380 |
analyze the calling tree of the program where possible and use this
|
381 |
information to overlay the parameter-passing memory areas of
|
382 |
subroutines that cannot be active simultaneously. Without the ability
|
383 |
to analyze the calling tree and make overlay decisions based on it,
|
384 |
memory would be exhausted, because each subroutine would need to have its
|
385 |
own static storage for parameters and local variables.}
|
386 |
\item \textbf{Pass by reference.}
|
387 |
Typically, it is convenient to pass pointer(s) to area(s) of memory
|
388 |
containing input operands, and also a pointer to an area of memory
|
389 |
owned by the caller which is written with the result by the arithmetic subroutine.
|
390 |
The efficiency of this approach depends on the compiler and the instruction
|
391 |
set of the machine. If the instruction set of the machine cannot
|
392 |
make effective use of pointers or stack frames, an arithmetic subroutine
|
393 |
might be constructed so that it first copies the operands to a static area of memory
|
394 |
reserved for the arithmetic library, then performs the necessary arithmetic
|
395 |
operations on the operands in the static area,
|
396 |
then copies the result(s) back to the area owned by the caller.
|
397 |
\item \textbf{Pass by common data block.}
|
398 |
In some cases, it may be preferable to reserve a block of memory in which to
|
399 |
pass parameters to arithmetic library functions, and from which to retrieve
|
400 |
results after an arithmetic library function returns. The allocation of such
|
401 |
a static memory block may be done manually\footnote{Note to self: need to
|
402 |
include gentleman's agreements on memory usage in my note on software architecture.}
|
403 |
or automatically (by development tools which can analyze the function calling tree and
|
404 |
manage the overlaying).
|
405 |
\end{enumerate}
|
406 |
|
407 |
|
408 |
|
409 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
410 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
411 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
412 |
\subsubsection{Temporary Storage Mechanisms}
|
413 |
%Subsubsection tag: TSM0
|
414 |
\label{ccil0:spdi0:sppm0:stsm0}
|
415 |
|
416 |
Need to indicate clearly on section on software architectures the
|
417 |
primary temporary storage mechanisms:
|
418 |
|
419 |
\begin{itemize}
|
420 |
\item Stack.
|
421 |
\item Memory block with overlay functionality.
|
422 |
\end{itemize}
|
423 |
|
424 |
Need to expand software architecture section to cover this, so don't
|
425 |
discuss here.
|
426 |
|
427 |
|
428 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
429 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
430 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
431 |
\subsection{Reporting Of Overflow, Underflow, And Domain Errors}
|
432 |
%Subsection tag: OUD0
|
433 |
\label{ccil0:spdi0:soud0}
|
434 |
|
435 |
Long integer data types used in microcontroller work are typically
|
436 |
of a static size (they cannot grow in size in as operations are
|
437 |
performed on them). The reason for the typical static sizes is that
|
438 |
dynamic allocation (except for allocation and
|
439 |
deallocation on the stack as subroutines
|
440 |
are called and return) is rarely used in small microcontroller work.
|
441 |
It will come about in the normal usage of an integer arithmetic
|
442 |
library that an attempt will be made to operate on integers in
|
443 |
a way which generates an overflow, generates an
|
444 |
underflow, or
|
445 |
represents a domain error (division by zero or
|
446 |
square root of a negative integer, for example).
|
447 |
An important design decision is how such normal exceptions should be
|
448 |
handled.
|
449 |
|
450 |
Possible design decisions in this area are:
|
451 |
|
452 |
\begin{enumerate}
|
453 |
\item \label{enum:ccil0:spdi0:soud0:01:01}
|
454 |
\textbf{To design arithmetic subroutines so that exceptions are not
|
455 |
possible.}
|
456 |
For example, multiplying an $m$-word integer by an $n$-word integer
|
457 |
will always generate an integer that will fit within $m+n$ words.
|
458 |
If a multiplication subroutine is designed so that the caller must
|
459 |
provide an $m$-word operand and an $n$-word operand and a pointer to
|
460 |
an $(m+n)$-word area of memory for the result, an overflow cannot occur.
|
461 |
Such a design decision essentially pushes overflow detection back up to
|
462 |
the callers of arithmetic subroutines.
|
463 |
\item \label{enum:ccil0:spdi0:soud0:01:02}
|
464 |
\textbf{To design arithmetic subroutines so that exceptions are possible,
|
465 |
but not to detect the exceptions, thus providing an implementation that
|
466 |
will produce incorrect results with some operand data values.}
|
467 |
For example, if an arithmetic subroutine is designed to add an $m$-word
|
468 |
operand to another $m$-word operand to produce an $m$-word result, overflow
|
469 |
is possible. A design decision to fail to detect such exceptions pushes
|
470 |
the responsibility up to the callers of the arithmetic subroutines.
|
471 |
Callers must devise a method for not calling arithmetic subroutines
|
472 |
with data values that will cause an exception, or else to detect an exception
|
473 |
when it has occurred.
|
474 |
\item \label{enum:ccil0:spdi0:soud0:01:03}
|
475 |
\textbf{To ``rail'' the result in response to an exception.}
|
476 |
It was stated earlier that analog control system functional blocks
|
477 |
built with operational
|
478 |
amplifiers typically have an output which cannot go beyond the
|
479 |
supply rails. One may implement similar behavior in arithmetic subroutines.
|
480 |
In an addition subroutine which adds two $m$-word operands to produce an
|
481 |
$m$-word result (with each word having $w$ bits), it would be natural to
|
482 |
return $2^{mw}-1$ in the event of an overflow in a positive direction and
|
483 |
$-2^{mw}$ in the event of an overlfow in a negative direction. Note that
|
484 |
the caller will not be able to distinguish a ``rail'' value which represents
|
485 |
a valid result from a ``rail'' value substituted to indicate an exception.
|
486 |
\item \label{enum:ccil0:spdi0:soud0:01:04}
|
487 |
\textbf{To reserve special result data values to indicate exceptions.}
|
488 |
Depending on the arithmetic subroutine being implemented, it may be possible
|
489 |
to reserve certain result data values to indicate exceptions. This approach
|
490 |
is often awkward, as most mathematical subroutines are naturally defined so that
|
491 |
all bit patterns in the memory reserved for the result are valid numbers.
|
492 |
Additionally, with long result data values, it may not be economical to
|
493 |
compare the result against the reserved exception values. Thus, this is seldom
|
494 |
an optimal way to deal with exceptions.
|
495 |
|
496 |
Additionally, if this approach is employed, the semantics of how exception
|
497 |
values combine with other exception values and data values must be decided.
|
498 |
\item \label{enum:ccil0:spdi0:soud0:01:05}
|
499 |
\textbf{To return exception codes to the caller separate from the result data.}
|
500 |
In the `C' language, pointers are often used to supply an arithmetic subroutine
|
501 |
with the input operands and to provide the arithmetic subroutine with a location
|
502 |
(which belongs to the caller) in which to store the result data. Thus, the return
|
503 |
value of the arithmetic subroutine (normally assigned through the subroutine name)
|
504 |
is often available to return exception codes. For example,
|
505 |
a `C' function may be defined as
|
506 |
|
507 |
\begin{verbatim}
|
508 |
unsigned char int128_add(INT128 *result,
|
509 |
INT128 *arg1,
|
510 |
INT128 *arg2),
|
511 |
\end{verbatim}
|
512 |
|
513 |
leaving the returned \texttt{unsigned char} value available to return
|
514 |
exception information. Note that this arrangement has the following advantages:
|
515 |
|
516 |
\begin{enumerate}
|
517 |
\item All bit patterns in the result data memory area area available
|
518 |
as data bit patterns.
|
519 |
\item The exception data is very economical to test, because it is placed
|
520 |
in a machine-native data type.
|
521 |
\item The exception data can easily be discarded or by the caller if desired.
|
522 |
\item All decisions about how to handle exceptions are left to the caller.
|
523 |
\end{enumerate}
|
524 |
\item \label{enum:ccil0:spdi0:soud0:01:06}
|
525 |
\textbf{To maintain exception data with each result integer.}
|
526 |
It is possible to reserve bits for exception information which are part of the
|
527 |
long integer data type. This exception state essentially conveys
|
528 |
\emph{NaN}\footnote{\emph{N}ot \emph{a} \emph{n}umber.} information---integers with
|
529 |
exception information set are not true numbers, but rather they are different from the
|
530 |
true result in some way. As with (\ref{enum:ccil0:spdi0:soud0:01:04}), the
|
531 |
semantics of how to combine NaN values and NaN values with ordinary non-NaN numbers
|
532 |
must be defined.
|
533 |
\item \label{enum:ccil0:spdi0:soud0:01:07}
|
534 |
\textbf{To maintain a global exception state variable.}
|
535 |
A variable or set of variables can be reserved which hold the
|
536 |
exception information, if any, from the most recent call to
|
537 |
a function in the arithmetic library.
|
538 |
|
539 |
To save CPU cycles, the arithmetic library can
|
540 |
be designed so that it will assign the global exception state variable only if an
|
541 |
exception occurs---the caller then has the responsibility of clearing the exception
|
542 |
state variable before making any call into the arithmetic library where the
|
543 |
exception result is of interest. The interface between the caller and the library
|
544 |
can be further optimized if the library only OR's data into the variable containing
|
545 |
the exception state. Using this optimization, the caller can clear the exception state
|
546 |
variable, make several calls into the arithmetic library, and then retrieve a meaningful
|
547 |
exception state variable value summarizing several arithmetic operations.
|
548 |
\item \label{enum:ccil0:spdi0:soud0:01:08}
|
549 |
\textbf{Hybrid approaches.}
|
550 |
The approaches (\ref{enum:ccil0:spdi0:soud0:01:01})
|
551 |
through (\ref{enum:ccil0:spdi0:soud0:01:07}) can be combined.
|
552 |
For example, approach (\ref{enum:ccil0:spdi0:soud0:01:03})
|
553 |
might be combined with approach (\ref{enum:ccil0:spdi0:soud0:01:05})
|
554 |
so that exceptions are ``railed'', but the caller may also be made
|
555 |
aware that an exception has occured. Many hybrid approaches are possible.
|
556 |
\end{enumerate}
|
557 |
|
558 |
|
559 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
560 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
561 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
562 |
\subsection{Semantics Of Combining Overflow, Underflow, And Domain Errors}
|
563 |
%Subsection tag: CMB0
|
564 |
\label{ccil0:spdi0:scmb0}
|
565 |
|
566 |
For control system arithmetic, some form of clipping as suggested
|
567 |
in Section \ref{ccil0:sppm0:smae0} is probably the
|
568 |
best approach. Definitely, an overflow should generate a result
|
569 |
which is the largest representable integer, and an
|
570 |
underflow should generate a result which is the smallest
|
571 |
representable integer.
|
572 |
|
573 |
In addition to treating an overflow by clipping, it may be
|
574 |
advantageous to reserve a flag in the representation of a
|
575 |
multiple-precision integer to record that an overflow has occured and been clipped.
|
576 |
Some functions which accept the integer as input may be interested
|
577 |
in the value of such a flag, where othere---perhaps most---may
|
578 |
not.
|
579 |
|
580 |
The correct course of action in the event of a domain error (such
|
581 |
as division by zero) is less clear. It is noteworthy that in a
|
582 |
normal control system, domain errors cannot occur (but overflows
|
583 |
can).
|
584 |
|
585 |
The best approach when a domain error is involved probably
|
586 |
depends on the basis for the underlying calculation. For
|
587 |
example, if integer division is used as part of a
|
588 |
strategy for software ratiometric conversion, a value
|
589 |
of zero in the denominator probably represents extreme electrical
|
590 |
noise, and the most sane approach may be to replace the
|
591 |
denominator by one. However, in other contexts it may be appropriate
|
592 |
to think in terms of
|
593 |
|
594 |
\begin{equation}
|
595 |
\lim_{k \rightarrow 0^+} \frac{kn}{kd}
|
596 |
\end{equation}
|
597 |
|
598 |
\noindent{}or
|
599 |
|
600 |
\begin{equation}
|
601 |
\lim_{k \rightarrow 0^-} \frac{kn}{kd} .
|
602 |
\end{equation}
|
603 |
|
604 |
Put in other terms, there is not a clear ``one solution
|
605 |
meets all needs'' approach to dealing with domain
|
606 |
errors.
|
607 |
|
608 |
As in the case of overflows, it may be advantageous to reserve a bit
|
609 |
flag to signal that a domain error has occured and that the result
|
610 |
is not valid or not reliable. Note that floating point chips
|
611 |
(such as the 80x87) provide similar indications of domain errors.
|
612 |
|
613 |
It may also be advantageous to adopt conventions for how
|
614 |
overflow or domain error flags propagate through binary or
|
615 |
unary operators. For example, if two numbers are multiplied, and
|
616 |
one of the two has the overflow flag set, it may be wise set the
|
617 |
overflow flag in the result. A scheme for how warning
|
618 |
flags propagate may be beneficial.
|
619 |
|
620 |
|
621 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
622 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
623 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
624 |
\subsection{Variable Versus Constant Subroutine Execution Time}
|
625 |
%Subsection tag: VVC0
|
626 |
\label{ccil0:spdi0:svvc0}
|
627 |
|
628 |
As a design goal of an embedded system, we seek to minimize the
|
629 |
timing variability of software components. An arithmetic subroutine
|
630 |
that with a high probability takes a short time to execute and with a
|
631 |
low probability takes a long time to execute, and where the execution
|
632 |
time is data dependent, is a serious risk. An embedded software product
|
633 |
may pass all release testing, but then fail in the field because of
|
634 |
specific data values used in calculations.
|
635 |
|
636 |
A very conservative design goal would be to design every arithmetic subroutine
|
637 |
to require exactly the same execution time, regardless of data values.
|
638 |
This goal is not practical because machine instructions themselves
|
639 |
usually have a variable execution time, particularly for multiplication
|
640 |
and division instructions. A fallback goal would be to avoid
|
641 |
large differences between minimum and maximum execution time, without
|
642 |
increasing the maximum execution time. A very practical step to take
|
643 |
(using division as an example)
|
644 |
is to insert artifical delays into easily detectable exception cases (such as
|
645 |
division by zero) so that the exception case takes as long as the
|
646 |
minimum time for a division with valid operands.
|
647 |
|
648 |
|
649 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
650 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
651 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
652 |
\section{Fixed-Point Arithmetic}
|
653 |
%Section tag: FPA0
|
654 |
\label{ccil0:sfpa0}
|
655 |
|
656 |
\emph{Fixed-point arithmetic}\index{fixed-point arithmetic}
|
657 |
is a scheme for the representation
|
658 |
of engineering quantities (conceptually real numbers with optional
|
659 |
units) by integers so that calculations can be performed
|
660 |
on these quantitites using [usually multiple-precision]
|
661 |
integer arithmetic.
|
662 |
|
663 |
In discussing fixed-point arithmetic,
|
664 |
we must be careful to distinguish between the
|
665 |
\emph{represented value} (the engineering quantity)
|
666 |
and the \emph{representation} (the integer which represents
|
667 |
the engineering quantity). In most cases, we must also
|
668 |
be careful to devise a system to track the units of the
|
669 |
represented values, as, especially with control systems,
|
670 |
the units of represented values (due to integration and
|
671 |
differentiation) can become very complex
|
672 |
and mistakes are easy to make.
|
673 |
|
674 |
Fixed-point arithmetic is the dominant paradigm of construction
|
675 |
for calculations in small microcontroller systems. It may not be
|
676 |
clear why this should be so or what advantages it offers [over
|
677 |
floating-point arithmetic]. The reasons for
|
678 |
this predominance are:
|
679 |
|
680 |
\begin{itemize}
|
681 |
\item Fixed-point calculations tend to be very efficient, because
|
682 |
they make direct use of the integer arithmetic instructions in the
|
683 |
microcontroller's instruction set. On the other hand, floating-point
|
684 |
arithmetic operations tend to be much slower.
|
685 |
|
686 |
\item Floating-point calculations typically require a floating-point
|
687 |
library, which may consume at least several hundred bytes
|
688 |
of ROM.
|
689 |
|
690 |
\item Some safety-critical software standards prohibit the use of
|
691 |
floating-point arithmetic because it can result in nebulous
|
692 |
behavior. Fixed-point arithmetic avoids these concerns.
|
693 |
\end{itemize}
|
694 |
|
695 |
In order to carry out fixed-point arithmetic---that is, in order to
|
696 |
operate on engineering quantities as integers---we
|
697 |
require that the relationship between the
|
698 |
represented value and the representation be of the form
|
699 |
|
700 |
\begin{equation}
|
701 |
\label{eq:ccil0:sfpa0:00}
|
702 |
x = r_I u + \Psi,
|
703 |
\end{equation}
|
704 |
|
705 |
\noindent{}where $x \in \vworkrealset$ (possibly with units) is the represented
|
706 |
value, $u \in \vworkintset$ is the representation,
|
707 |
$r_I \in \vworkrealset$ is the scaling factor (possibly with
|
708 |
units), and $\Psi \in \vworkrealset$ (possibly with units) is the offset.
|
709 |
Note that the units of $r_I$, $\Psi$, and $x$ must match.
|
710 |
|
711 |
We further require that $r_I \vworkdivides{} \Psi$\footnote{We \emph{are}
|
712 |
aware that this is an abuse of nomenclature, as
|
713 |
`$\vworkdivides$' (``divides'') is traditionally only applied to integers.}
|
714 |
(i.e. that $\Psi$ be an
|
715 |
integral multiple of $r_I$)
|
716 |
so that the offset in the represented value corresponds to an integer
|
717 |
in the representation. Without this restriction, we could not remove the
|
718 |
offset from the representation with integer subtraction only. Note that
|
719 |
we do \emph{not} require that $r_I$ or $\Psi$ be rational, although
|
720 |
they must both be rational or both be irrational in order to satisfy
|
721 |
(\ref{eq:ccil0:sfpa0:00}).
|
722 |
|
723 |
In (\ref{eq:ccil0:sfpa0:00}), since we've required that $r_I \vworkdivides{} \Psi$,
|
724 |
we can replace $\Psi$ by
|
725 |
|
726 |
\begin{equation}
|
727 |
\label{eq:ccil0:sfpa0:00b}
|
728 |
\psi = \frac{\Psi}{r_I}
|
729 |
\end{equation}
|
730 |
|
731 |
\noindent{}to obtain
|
732 |
|
733 |
\begin{equation}
|
734 |
\label{eq:ccil0:sfpa0:01}
|
735 |
x = r_I (u + \psi),
|
736 |
\end{equation}
|
737 |
|
738 |
\noindent{}where $\psi \in \vworkintset$ is the offset in representational
|
739 |
counts.
|
740 |
|
741 |
Note that we can also easily obtain the following relationships from the
|
742 |
defining equations (\ref{eq:ccil0:sfpa0:00}),
|
743 |
(\ref{eq:ccil0:sfpa0:00b}), and (\ref{eq:ccil0:sfpa0:01}).
|
744 |
|
745 |
\begin{equation}
|
746 |
\label{eq:ccil0:sfpa0:02}
|
747 |
u = \frac{x - \Psi}{r_I} = \frac{x}{r_I} - \psi
|
748 |
\end{equation}
|
749 |
|
750 |
\begin{equation}
|
751 |
\label{eq:ccil0:sfpa0:03}
|
752 |
\psi = \frac{\Psi}{r_I}
|
753 |
\Longleftrightarrow
|
754 |
\Psi = r_I \psi
|
755 |
\Longleftrightarrow
|
756 |
r_I = \frac{\Psi}{\psi}
|
757 |
\end{equation}
|
758 |
|
759 |
|
760 |
For example, in a 16-bit signed integer (which inherently may range
|
761 |
from -32768 to 32767 inclusive), one might used a fixed-point
|
762 |
representation of 100 integer counts per $^\circ$C ($r_I = 0.01 \; ^\circ$C)
|
763 |
with an offset of 100$^\circ$C ($\Psi$ = 100$^\circ$C or equivalently
|
764 |
$\psi$ = 10000), giving
|
765 |
a representational range from -227.68$^\circ$C to 427.67$^\circ$C inclusive.
|
766 |
|
767 |
If $r_I = 2^N, \; N \in \vworkintset$, then the radix point of the represented
|
768 |
value is positioned
|
769 |
between two bits of the representation---this arrangement may have computational
|
770 |
advantages
|
771 |
if the whole and fractional parts of the represented value need to be separated
|
772 |
easily in the representation. Note also that if $r_I = 2^{WN}$ where $W$ is the
|
773 |
machine integer size of the computer (in bits), then the radix point of the represented value
|
774 |
occurs between two addressable machine integers of the representation, which can be convenient.
|
775 |
However, we do not require for our definition of a fixed-point representation that
|
776 |
$r_I$ be an integral power of two; and in fact we do not even require by our
|
777 |
definition that $r_I$ be rational. Note that in general our definition above is the
|
778 |
weakest set of conditions so that real-world engineering values can be manipulated
|
779 |
using integer operations performed upon the representation.
|
780 |
|
781 |
|
782 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
783 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
784 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
785 |
\section{Representation Of Integers}
|
786 |
%Section Tag: ROI0
|
787 |
\label{ccil0:sroi0}
|
788 |
|
789 |
In this section, we discuss common representations of integers, both
|
790 |
\emph{machine} integers and \emph{synthetic long} integers.
|
791 |
By \emph{representation} we mean the mapping between the abstract
|
792 |
mathematical notion of an integer and the way it is stored in the computer
|
793 |
(voltage levels and the programming model).
|
794 |
Although
|
795 |
in Knuth's development of integer arithmetic
|
796 |
\cite{bibref:b:knuthclassic2ndedvol2}
|
797 |
it is assumed that
|
798 |
integers may be represented in any base, we don't require such generality
|
799 |
in practice and in this work we confine ourselves for the most
|
800 |
part to $b=2^n$, and often to $n = 8i$, $i \in \vworkintsetpos$. The assumption
|
801 |
of $b=2^n$ characterizes all modern digital computers, and we feel comfortable
|
802 |
making this assumption throughout the work. However, the assumption
|
803 |
$n = 8i$, $i \in \vworkintsetpos$ does not hold universally, and so we
|
804 |
most often do not make this assumption.
|
805 |
|
806 |
By \emph{machine} integer, we mean an integer upon which the computer
|
807 |
can operate in a single instruction (such as to add, increment,
|
808 |
load, store, etc.). For most microcontrollers, machine integers are
|
809 |
either 8 or 16 bits in size. The representation of a machine integer
|
810 |
is designed and specified by the microcontroller manufacturer. In principle,
|
811 |
nothing would prevent a microcontroller manufacturer from devising
|
812 |
and implementing a novel way of representing machine integers and supporting
|
813 |
this novel representation with an instruction set. However, in
|
814 |
practice, all machine integers are either simple unsigned integers or two's
|
815 |
complement signed integers. In addition to the efficiency of these
|
816 |
representations with respect to the design of digital logic, these representations
|
817 |
are so standard and so pervasive that they are universally tacitly assumed.
|
818 |
For example, ``\texttt{if (i \& 0x1)}'' is an accepted C-language
|
819 |
idiom for ``if $i$ is odd'', and it is expected that such code will
|
820 |
work on all platforms.
|
821 |
|
822 |
By \emph{synthetic long} integer, we mean an integer of
|
823 |
arbitrary\footnote{By \emph{arbitrary}, we do not necessarily mean that
|
824 |
the integer can grow to be arbitrarily large in magnitude, or that
|
825 |
its maximum size is not known at compile time. We mean \emph{arbitrarily}
|
826 |
longer than a machine integer. Multiple-precision arithmetic libraries
|
827 |
can be divided into two classes---those that fix the size of the integers
|
828 |
at compile time, and those that use dynamic allocation and allow integers to
|
829 |
grow as needed at run time. The former category
|
830 |
is normally used for small microcontroller work, whereas the latter category
|
831 |
(such as the GNU MP Library \cite{bibref:s:gnumultipleprecisionarithmeticlibrary})
|
832 |
is normally used in scientific and number theoretic calculation and on
|
833 |
more powerful platforms than microcontrollers. The representational concepts
|
834 |
we present here apply to both categories.}
|
835 |
length that is formed by concatenating machine integers. There is some
|
836 |
subjectivity in deciding the representation of multiple-precision integers,
|
837 |
and we discuss in the subsections
|
838 |
\ref{ccil0:sroi0:srou0} and
|
839 |
\ref{ccil0:sroi0:sros0} which immediately follow.
|
840 |
|
841 |
|
842 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
843 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
844 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
845 |
\subsection{Representation Of Unsigned Integers}
|
846 |
%Subsection Tag: ROU0
|
847 |
\label{ccil0:sroi0:srou0}
|
848 |
|
849 |
Unsigned machine integers are always represented as an ordered
|
850 |
array of bits (Figure \ref{fig:ccil0:sroi0:srou0:00}). For an
|
851 |
$m$-bit unsigned integer $u$, we denote these bits $u_{[m-1]}$ through
|
852 |
$u_{[0]}$, with $u_{[m-1]}$ the most significant bit. The value
|
853 |
of $u$ is the sum of the values of each bit multiplied
|
854 |
by the power of 2 it represents:
|
855 |
|
856 |
\begin{figure}
|
857 |
\centering
|
858 |
\includegraphics[width=4.6in]{c_cil0/uintrep1.eps}
|
859 |
\caption{Representation Of Unsigned Machine Integers}
|
860 |
\label{fig:ccil0:sroi0:srou0:00}
|
861 |
\end{figure}
|
862 |
|
863 |
\begin{equation}
|
864 |
\label{eq:ccil0:sroi0:srou0:00}
|
865 |
u = \sum_{i=0}^{m-1} u_{[i]} 2^i .
|
866 |
\end{equation}
|
867 |
|
868 |
In general, an $m$-bit unsigned integer can assume the values of
|
869 |
0 through $2^m - 1$, so that
|
870 |
|
871 |
\begin{equation}
|
872 |
\label{eq:ccil0:sroi0:srou0:01}
|
873 |
u \in \{0, \ldots{} , 2^m - 1 \} .
|
874 |
\end{equation}
|
875 |
|
876 |
Unsigned synthetic long integers are always represented as an array
|
877 |
of unsigned machine integers.
|
878 |
Consistent with the GMP \cite{bibref:s:gnumultipleprecisionarithmeticlibrary},
|
879 |
we call each element of the array a \emph{limb} and we call the size of
|
880 |
each limb the \emph{limbsize}. This usage is very close to what Knuth
|
881 |
calls the \emph{word}size $w$ in the excerpt presented in
|
882 |
Section \ref{ccil0:sppm0:smas0}.
|
883 |
|
884 |
Microcontroller processors are more likely than more powerful processors to have
|
885 |
a non-orthogonal instruction set, and so the limbsize may not be consistent between
|
886 |
operations in an arithmetic library.
|
887 |
With some processors, the appropriate limbsize may vary depending on the operation being
|
888 |
performed.
|
889 |
For example, a microcontroller processor may be able to add two 16-bit integers to
|
890 |
obtain a 16-bit result plus a carry, but only be able to multiply two 8-bit integers to
|
891 |
obtain a 16-bit result (thus, the appropriate limbsize for addition may be
|
892 |
16 bits while the appropriate limbsize for multiplication may be 8 bits).
|
893 |
In such cases, it is usually most efficient to add using 16-bit limbs but
|
894 |
multiply using 8-bit limbs. Adding using 8-bit limbs on a machine which will
|
895 |
support 16-bit additions is not normally a good design decision---even if the
|
896 |
machine supports an 8-bit addition instruction which is faster than the 16-bit addition
|
897 |
instruction, $m/2$ 16-bit additions will nearly always be faster than
|
898 |
$m$ 8-bit additions. Using different limbsizes within the same arithmetic library
|
899 |
may require some consideration of alignment and
|
900 |
endian issues, but these are implementation details
|
901 |
which are easily solved.
|
902 |
|
903 |
We view a synthetic long unsigned integer as an array of limbs (machine integers)
|
904 |
of some size, and we agree that we will not address the array in any other way than
|
905 |
by loading and storing limbs of this size.\footnote{Well \ldots{} not quite.
|
906 |
In software for large computers (personal computers and workstations) with an
|
907 |
orthogonal instruction set, we may be able to adhere to this rule. However,
|
908 |
with microcontrollers, arithmetic libraries which are optimized
|
909 |
may break this rule.} In particular, because
|
910 |
computers may be ``big-endian'' or ``little-endian'', loading and storing
|
911 |
smaller units than limbs may lead in
|
912 |
a worst case to software defects or in a best case to non-portable code.
|
913 |
|
914 |
Assume that $w$ is the number of bits in a limb.
|
915 |
Notationally, we denote an unsigned
|
916 |
synthetic long integer as an array of $m$ limbs
|
917 |
$u_{m-1}$ through $u_0$, each containing $w$ bits,
|
918 |
with $u_0$ the least significant machine integer.
|
919 |
We may also define $b=2^w$ (consistent with Knuth's
|
920 |
notation).
|
921 |
The value of
|
922 |
such a synthetic long machine integer is
|
923 |
|
924 |
\begin{equation}
|
925 |
\label{eq:ccil0:sroi0:srou0:02}
|
926 |
u = \sum_{i=0}^{m-1} u_{i} 2^{wi}
|
927 |
=
|
928 |
\sum_{i=0}^{m-1} u_{i} b^i.
|
929 |
\end{equation}
|
930 |
|
931 |
As an alternative, we may write the value as the sum of the bit-values,
|
932 |
|
933 |
\begin{equation}
|
934 |
\label{eq:ccil0:sroi0:srou0:03}
|
935 |
u = \sum_{i=0}^{wm-1} u_{[i]} 2^{i} .
|
936 |
\end{equation}
|
937 |
|
938 |
Naturally, the range of such a synthetic long integer is
|
939 |
|
940 |
\begin{equation}
|
941 |
\label{eq:ccil0:sroi0:srou0:04}
|
942 |
u \in \{0, \ldots{} , 2^{wm} - 1 \} .
|
943 |
\end{equation}
|
944 |
|
945 |
In storing an unsigned synthetic long machine integer, the most natural way
|
946 |
to order the array of limbs depends on whether dynamic memory allocation is
|
947 |
used by the arithmetic library. In microcontroller work, where arithmetic
|
948 |
library subroutines typically operate on fixed-size operands and produce
|
949 |
fixed-size results, storing
|
950 |
limbs most significant limb first (i.e. in `C', so that element \texttt{[0]}
|
951 |
of the array of limbs contains the most significant limb) may be natural
|
952 |
and convenient. However, this ordering would lead to computational waste in a library such
|
953 |
as the GMP \cite{bibref:s:gnumultipleprecisionarithmeticlibrary} where integers
|
954 |
may grow arbitrarily large and the library may need to reallocate long synthetic
|
955 |
integers to contain more limbs, as each reallocation would need to be followed
|
956 |
by a memory copy to align the integer's existing limbs to the end of the array.
|
957 |
For libraries such as the GMP, it is more practical to store limbs
|
958 |
least-significant limb first, as it eliminates the need to copy memory
|
959 |
when reallocations are done.
|
960 |
|
961 |
|
962 |
|
963 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
964 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
965 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
966 |
\subsection{Representation Of Signed Integers}
|
967 |
%Subsection Tag: ROS0
|
968 |
\label{ccil0:sroi0:sros0}
|
969 |
|
970 |
Signed machine integers are always represented in two's complement form on modern
|
971 |
processors. This representation is universal because of the digital logic
|
972 |
conveniences---the same addition and subtraction mappings which are correct
|
973 |
for unsigned machine integers are also correct for signed machine integers,
|
974 |
although the criteria for overflow and comparison are
|
975 |
different.
|
976 |
|
977 |
Most readers are familiar with two's complement representation, so we will not
|
978 |
belabor it. However, we will present essential properties.
|
979 |
When two's complement representation is used in an $m$-bit machine integer $u$:
|
980 |
|
981 |
\begin{enumerate}
|
982 |
\item All bit patterns with $u_{[m-1]} = 0$ represent non-negative integers, and
|
983 |
represent the same integer as if the representation were unsigned.
|
984 |
\item All bit patterns with $u_{[m-1]} = 1$ represent negative numbers; specifically
|
985 |
$u_{[m-2:0]} - 2^{m-1}$; i.e.
|
986 |
|
987 |
\begin{equation}
|
988 |
\label{eq:ccil0:sroi0:sros0:00}
|
989 |
u = - u_{[m-1]} 2^{m-1} + \sum_{i=0}^{m-2} u_{[i]} 2^i .
|
990 |
\end{equation}
|
991 |
|
992 |
\item $u \in \{-2^{m-1}, \ldots{}, 2^{m-1}-1 \}$.
|
993 |
\item All bit patterns represent a unique integer.
|
994 |
\item For any integer except $-2^{m-1}$,
|
995 |
negation can be performed by forming the one's complement (complementing
|
996 |
every bit), then adding one. To see why this is true algebraically, note that
|
997 |
|
998 |
\end{enumerate}
|
999 |
|
1000 |
|
1001 |
However, let us observe that the value of an
|
1002 |
$m$-bit two's complement
|
1003 |
machine integer is
|
1004 |
|
1005 |
|
1006 |
In general, an $m$-bit signed machine integer can assume the values of
|
1007 |
$-2^{m-1}$ through $2^{m-1} - 1$, so that
|
1008 |
|
1009 |
\begin{equation}
|
1010 |
\label{eq:ccil0:sroi0:sros0:01}
|
1011 |
u \in \{-2^{m-1}, \ldots{} , 2^{m-1} - 1 \} .
|
1012 |
\end{equation}
|
1013 |
|
1014 |
There are [at least] two different representations of signed
|
1015 |
multiple-precision integers:
|
1016 |
|
1017 |
\begin{itemize}
|
1018 |
\item Two's complement representation.
|
1019 |
\item Sign-magnitude representation.
|
1020 |
\end{itemize}
|
1021 |
|
1022 |
There are two different representations commonly used
|
1023 |
for signed multiple-precision integers because two's complement
|
1024 |
representation is not ideal for multiplication and division, although
|
1025 |
it is ideal for addition and subtraction. For multiple-precision
|
1026 |
integer arithmetic, sign-magnitude representation is more common.
|
1027 |
|
1028 |
In two's complement representation of multiple-precision integers,
|
1029 |
the representation is the same as suggested by
|
1030 |
(\ref{eq:ccil0:sroi0:sros0:00}), except
|
1031 |
more bits are involved. For a two's complement representation
|
1032 |
of a number consisting of $n$ machine integers with $W$ bits per
|
1033 |
machine integer,
|
1034 |
|
1035 |
\begin{equation}
|
1036 |
\label{eq:ccil0:sroi0:sros0:02}
|
1037 |
u = - u_{B(Wn-1)} 2^{Wn-1} + \sum_{i=0}^{Wn-2} u_{B(i)} 2^i .
|
1038 |
\end{equation}
|
1039 |
|
1040 |
Because we would like to know how to compare signed multiple-precision
|
1041 |
integers in two's complement representation, we can gain some
|
1042 |
insight into the representation by rewriting
|
1043 |
(\ref{eq:ccil0:sroi0:sros0:02}) in terms of machine integers:
|
1044 |
|
1045 |
\begin{equation}
|
1046 |
\label{eq:ccil0:sroi0:sros0:03}
|
1047 |
u = - u_{B(Wn-1)} 2^{Wn-1}
|
1048 |
+
|
1049 |
\sum_{i=W(m-1)}^{Wn-2} u_{B(i)} 2^i
|
1050 |
+
|
1051 |
\sum_{i=0}^{m-2} u_{i} 2^{Wi} .
|
1052 |
\end{equation}
|
1053 |
|
1054 |
(\ref{eq:ccil0:sroi0:sros0:03}) gives some insight into the
|
1055 |
relative values of multiple-precision signed two's complement
|
1056 |
integers with respect to the values of the machine integers
|
1057 |
that comprise them. We discuss this further in
|
1058 |
Section \ref{ccil0:scsi0}.
|
1059 |
|
1060 |
In sign-magnitude representation of multiple-precision signed two's
|
1061 |
complement integers, an integer $u$ is represented as a sign
|
1062 |
bit (usually a value of one indicates negativity), and a magnitude,
|
1063 |
which is $|u|$. Unlike two's complement representation,
|
1064 |
sign-magnitude representation, has two representations of zero---a positive
|
1065 |
one and a negative one. Either a canonical form for zero should be
|
1066 |
adopted, or both values should be treated identically.
|
1067 |
|
1068 |
Assuming that the sign bit is stored in the most significant bit position,
|
1069 |
it is easy to deduce that the value of a multiple-precision
|
1070 |
signed two's complement integer in sign-magnitude representation is
|
1071 |
|
1072 |
\begin{equation}
|
1073 |
\label{eq:ccil0:sros0:srou0:04}
|
1074 |
u = (-1)^{u_{B(m-1)}} \sum_{i=0}^{m-2} u_{B(i)} 2^i .
|
1075 |
\end{equation}
|
1076 |
|
1077 |
Sign-magnitude representation is especially convenient because
|
1078 |
it allows machine instructions which accept unsigned operands to be used
|
1079 |
to make calculations involving signed integers.
|
1080 |
|
1081 |
|
1082 |
|
1083 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1084 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1085 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1086 |
\section{Characteristics Of Practical Processors}
|
1087 |
%Section tag: CPP
|
1088 |
\label{ccil0:scpp0}
|
1089 |
|
1090 |
Before discussing specific algorithms, it is necessary to
|
1091 |
discuss the construction of practical processors---how such a processor
|
1092 |
manipulates machine integers. We accept as a typical processor the
|
1093 |
TMS-370C8, an 8-bit microcontroller manufactured by
|
1094 |
Texas Instruments.
|
1095 |
|
1096 |
\begin{figure}
|
1097 |
\centering
|
1098 |
\includegraphics[width=4.6in]{c_cil0/t370flag.eps}
|
1099 |
\caption{Texas Instruments TMS-370C8 Flags}
|
1100 |
\label{fig:ccil0:scpp0:00}
|
1101 |
\end{figure}
|
1102 |
|
1103 |
\begin{figure}
|
1104 |
\centering
|
1105 |
\includegraphics[width=4.6in]{c_cil0/t370cjmp.eps}
|
1106 |
\caption{Texas Instruments TMS-370C8 Conditional Jump Instructions}
|
1107 |
\label{fig:ccil0:scpp0:01}
|
1108 |
\end{figure}
|
1109 |
|
1110 |
A typical microcontroller allows operations on machine integers
|
1111 |
in the following steps:
|
1112 |
|
1113 |
\begin{itemize}
|
1114 |
\item A machine instruction is performed on one or two machine
|
1115 |
integer operands (for example: addition, subtraction,
|
1116 |
multiplication, division, increment, decrement, complement,
|
1117 |
negation, or comparison). This machine instruction may
|
1118 |
produce a result, and usually sets a number of condition flags that
|
1119 |
reflect the nature and validity of the result (Is it zero?
|
1120 |
Is it negative? Did the result overflow?). As an
|
1121 |
example, the condition
|
1122 |
flags of the TMS-370C8 are shown in Figure \ref{fig:ccil0:scpp0:00}.
|
1123 |
.
|
1124 |
\item A conditional branch instruction is used to branch conditionally
|
1125 |
based on the state of the condition flags. The definition of
|
1126 |
the condition flags and the way in which the conditional
|
1127 |
branch instruction utilizes them is designed to provide a
|
1128 |
way to treat both unsigned and signed machine integers.
|
1129 |
As an example, the way in which the conditional
|
1130 |
jump instructions of the TMS-370C8 use the flags
|
1131 |
is shown in Figure \ref{fig:ccil0:scpp0:01}.
|
1132 |
\end{itemize}
|
1133 |
|
1134 |
It is not too often necessary to understand in detail
|
1135 |
the Boolean relationships that govern how machine integers are
|
1136 |
added, subtracted, and compared; and how signed comparisons differ
|
1137 |
from unsigned comparisons. In most cases, it is adequate to
|
1138 |
rely on the design of the microcontroller. However, we do present
|
1139 |
rudimentary observations in this section.
|
1140 |
|
1141 |
|
1142 |
|
1143 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1144 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1145 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1146 |
\section{Comparison Of Integers}
|
1147 |
|
1148 |
|
1149 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1150 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1151 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1152 |
\subsection{Comparison Of Unsigned Integers}
|
1153 |
|
1154 |
|
1155 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1156 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1157 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1158 |
\subsection{Comparison Of Signed Integers}
|
1159 |
%Section Tag: CSI0
|
1160 |
\label{ccil0:scsi0}
|
1161 |
|
1162 |
|
1163 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1164 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1165 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1166 |
\section{Integer Addition}
|
1167 |
%Section tag: IAD0
|
1168 |
\label{ccil0:siad0}
|
1169 |
|
1170 |
Addition of two $m$-bit integers is a combinational function---that is,
|
1171 |
the inputs uniquely determine the output. Addition of binary
|
1172 |
numbers is performed
|
1173 |
|
1174 |
|
1175 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1176 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1177 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1178 |
\subsection{Hardware Implementation Of Addition}
|
1179 |
|
1180 |
|
1181 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1182 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1183 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1184 |
\subsection{Addition Of Unsigned Operands}
|
1185 |
|
1186 |
|
1187 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1188 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1189 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1190 |
\subsection{Addition Of Signed Operands}
|
1191 |
|
1192 |
|
1193 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1194 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1195 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1196 |
\section {Integer Subtraction}
|
1197 |
|
1198 |
|
1199 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1200 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1201 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1202 |
\subsection{Hardware Implementation Of Subtraction}
|
1203 |
|
1204 |
|
1205 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1206 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1207 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1208 |
\subsection{Subtraction Of Unsigned Operands}
|
1209 |
|
1210 |
|
1211 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1212 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1213 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1214 |
\subsection{Subtraction Of Signed Operands}
|
1215 |
|
1216 |
|
1217 |
|
1218 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1219 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1220 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1221 |
\section{Integer Multiplication}
|
1222 |
|
1223 |
|
1224 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1225 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1226 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1227 |
\subsection{Hardware Implementation Of Multiplication}
|
1228 |
|
1229 |
|
1230 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1231 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1232 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1233 |
\subsection{Multiplication Of Unsigned Operands}
|
1234 |
|
1235 |
|
1236 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1237 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1238 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1239 |
\subsection{Multiplication Of Signed Operands}
|
1240 |
|
1241 |
|
1242 |
|
1243 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1244 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1245 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1246 |
\section{Integer Division}
|
1247 |
\label{ccil0:sidv0}
|
1248 |
|
1249 |
\index{division}\index{integer division}In this section,
|
1250 |
we discuss the best known methods of dividing integers using
|
1251 |
typical microcontroller instruction sets. In general, given
|
1252 |
two arbitrary integers $p$ and $q$, we are interested in determining
|
1253 |
their quotient $q=\lfloor{}p/q\rfloor$ and remainder
|
1254 |
$r=p\bmod{}q$ as economically as possible.
|
1255 |
|
1256 |
|
1257 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1258 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1259 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1260 |
\subsection{Hardware Implementation Of Division}
|
1261 |
|
1262 |
|
1263 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1264 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1265 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1266 |
\subsection{General Unsigned Division Without A Machine Division Instruction}
|
1267 |
\label{ccil0:sidv0:sgdn0}
|
1268 |
|
1269 |
|
1270 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1271 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1272 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1273 |
\subsection{General Unsigned Division With A Machine Division Instruction}
|
1274 |
\label{ccil0:sidv0:sgdu0}
|
1275 |
|
1276 |
As mentioned many places in this work, efficiency in microcontroller software
|
1277 |
involves phrasing computational problems in a way which makes good use of
|
1278 |
the machine instruction set. In Section \ref{ccil0:sidv0:sgdn0} we discussed
|
1279 |
the classic shift-compare-subtract algorithm for division. This algorithm
|
1280 |
is far from efficient. A reasonable question to ask is whether we can
|
1281 |
leverage ``small'' division capability (provided by the machine instruction set)
|
1282 |
to accomplish ``large'' divisions (those which we require in practice).
|
1283 |
It ends up that this is possible: the technique involved is effectively
|
1284 |
to use machine division instructions to estimate the highest-order bits of
|
1285 |
the quotient based on the highest-order bits of the dividend and divisor.
|
1286 |
|
1287 |
Knuth's discussion of division
|
1288 |
algorithms \cite[pp. 270-275]{bibref:b:knuthclassic2ndedvol2} is the
|
1289 |
basis for most of the material in this subsection. However, Knuth has
|
1290 |
a gift for terseness that is sometimes a curse for the reader, and so
|
1291 |
we take more time than Knuth to explain certain results.
|
1292 |
|
1293 |
First, as a starting point, we present \emph{Algorithm D} from
|
1294 |
Knuth \cite[pp. 272-273]{bibref:b:knuthclassic2ndedvol2}. Then,
|
1295 |
we justify the algorithm and explain why it is valid. Finally,
|
1296 |
we supply implementation advice for microcontroller instruction sets.
|
1297 |
|
1298 |
\begin{vworkalgorithmstatementpar}{Arbitrary Unsigned Division Using
|
1299 |
Machine Unsigned Division Instructions}
|
1300 |
\label{alg:ccil0:sidv0:sgdu0:01}
|
1301 |
(From Knuth \cite[pp. 272-273]{bibref:b:knuthclassic2ndedvol2})
|
1302 |
Given nonnegative integers $u=(u_{m+n-1} \ldots{} u_1 u_0)_b$
|
1303 |
and $v=(v_{n-1} \ldots{} v_1 v_0)_b$, where
|
1304 |
$v_{n-1} \neq 0$ and $n > 1$, we form the radix-$b$ quotient
|
1305 |
$\lfloor{}u/v\rfloor{} = (q_m q_{m-1} \ldots{} q_0)_b$ and
|
1306 |
the remainder $u \bmod v = (r_{n-1} \ldots{} r_1 r_0)_b$. When
|
1307 |
$n=1$, the simpler algorithm of
|
1308 |
Subsection \ref{ccil0:sidv0:sldm0}
|
1309 |
should be used.
|
1310 |
|
1311 |
\begin{algblvl0}
|
1312 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:01}
|
1313 |
[Normalize.] Set $d \gets \lfloor{}b/(v_{n-1} + 1)\rfloor$.
|
1314 |
Then set $(u_{m+n} u_{m+n-1} \ldots{} u_1 u_0)_b$ equal to
|
1315 |
$(u_{m+n-1} \ldots{} u_1 u_0)_b$ times $d$; similarly,
|
1316 |
set $(v_{n-1} \ldots{} v_1 v_0)_b$ equal to
|
1317 |
$(v_{n-1} \ldots{} v_1 v_0)_b$ times $d$. (Notice the introduction
|
1318 |
of a new digit position $u_{m+n}$ at the left of
|
1319 |
$u_{m+n-1}$; if $d=1$, all we need to do in this step is set
|
1320 |
$u_{m+n} \gets 0$. On a binary computer it may be preferable
|
1321 |
to choose $d$ to be a power of 2 instead of using the value
|
1322 |
suggested here; any value of $d$ that results in
|
1323 |
$v_{n-1} \geq \lfloor{}b/2\rfloor$ will suffice. See also
|
1324 |
exercise 37.)
|
1325 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:02}
|
1326 |
[Initialize $j$.] Set $j \gets m$. (The loop on $j$,
|
1327 |
steps
|
1328 |
\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}
|
1329 |
through
|
1330 |
\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:07},
|
1331 |
will be essentially a division of
|
1332 |
$(u_{j+n} \ldots{} u_{j+1} u_j)_b$ by $(v_{n-1} \ldots{} v_1 v_0)_b$ to
|
1333 |
get a single quotient digit $q_j$; see Figure \ref{fig:alg:ccil0:sidv0:sgdu0:01:01}.)
|
1334 |
|
1335 |
\begin{figure}
|
1336 |
\centering
|
1337 |
\includegraphics[width=4.6in]{c_cil0/kdfc01.eps}
|
1338 |
\caption{Flowchart For Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} (From \cite[p. 273]{bibref:b:knuthclassic2ndedvol2})}
|
1339 |
\label{fig:alg:ccil0:sidv0:sgdu0:01:01}
|
1340 |
\end{figure}
|
1341 |
|
1342 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:03}
|
1343 |
[Calculate $\hat{q}$.] Set
|
1344 |
$\hat{q} \gets \lfloor{}u_{j+n}b + u_{j+n-1})/v_{n-1}\rfloor$ and
|
1345 |
let $\hat{r}$ be the remainder, $(u_{j+n}b + u_{j+n-1}) \bmod v_{n-1}$.
|
1346 |
Now test if $\hat{q} = b$ or $\hat{q} v_{n-2} > b\hat{r} + u_{j+n-2}$;
|
1347 |
if so, decrease $\hat{q}$ by 1, increase $\hat{r}$ by $v_{n-1}$, and repeat
|
1348 |
this test if $\hat{r} < b$. (The test of $v_{n-2}$ determines at high
|
1349 |
speed most of the cases in which the trial value $\hat{q}$ is one too large,
|
1350 |
and it eliminates \emph{all} cases where $\hat{q}$ is two too large;
|
1351 |
see exercises 19, 20, 21.)
|
1352 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:04}
|
1353 |
[Multiply and subtract.] Replace $(u_{j+n} u_{j+n-1} \ldots{} u_j)_b$ by
|
1354 |
|
1355 |
\begin{equation}
|
1356 |
\nonumber
|
1357 |
(u_{j+n} u_{j+n-1} \ldots{} u_j)_b - \hat{q} (0 v_{n-1} \ldots{} v_1 v_0)_b.
|
1358 |
\end{equation}
|
1359 |
|
1360 |
This computation consists of a simple multiplication by a one-place number,
|
1361 |
combined with a subtraction. The digits $(u_{j+n}, u_{j+n-1}, \ldots{}, u_j)$
|
1362 |
should be kept positive; if the result of this step is actually negative,
|
1363 |
$(u_{j+n} u_{j+n-1} \ldots{} u_j)_b$ should be left as the true
|
1364 |
value plus $b^{n+1}$, namely as the $b$'s complement of the true value, and
|
1365 |
a ``borrow'' to the left should be remembered.
|
1366 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:05}
|
1367 |
[Test remainder.] Set $q_j \gets \hat{q}$. If the result of step
|
1368 |
\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:04} was negative, go to
|
1369 |
step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}; otherwise go on to
|
1370 |
step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:07}.
|
1371 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:06}
|
1372 |
[Add back.] (The probability that this step is necessary is very small, on the
|
1373 |
order of only $2/b$, as shown in exercise 21; test data to activate this step
|
1374 |
should therefore be specifically contrived when debugging.) Decrease
|
1375 |
$q_j$ by 1, and add $(0 v_{n-1} \ldots v_1 v_0)_b$ to
|
1376 |
$(u_{j+n} u_{j+n-1} \ldots{} u_{j+1} u_j)_b$. (A carry will occur to the left of
|
1377 |
$u_{j+n}$, and it should be ignored since it cancels with the borrow that
|
1378 |
occured in step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:04}.)
|
1379 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:07}
|
1380 |
[Loop on $j$.] Decrease $j$ by one. Now if $j \geq 0$, go back to step
|
1381 |
\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}.
|
1382 |
\item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:08}
|
1383 |
[Unnormalize.] Now $(q_m \ldots{} q_1 q_0)_b$ is the desired quotient, and
|
1384 |
the desired remainder may be obtained by dividing
|
1385 |
$(u_{n-1} \ldots{} u_1 u_0)_b$ by $d$.
|
1386 |
\end{algblvl0}
|
1387 |
\end{vworkalgorithmstatementpar}
|
1388 |
\vworkalgorithmfooter{}
|
1389 |
|
1390 |
The general idea of Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} is that
|
1391 |
digits (machine words) of the quotient $q$ can be successively estimated
|
1392 |
based on the first digits of the dividend and divisor. Knuth
|
1393 |
\cite[p. 271]{bibref:b:knuthclassic2ndedvol2} explores the properties of
|
1394 |
the digit estimate
|
1395 |
|
1396 |
\begin{equation}
|
1397 |
\label{eq:ccil0:sidv0:sgdu0:01}
|
1398 |
\hat{q} = \min \left( {\left\lfloor{\frac{u_n b + u_{n-1}}{v_{n-1}}}\right\rfloor, b-1} \right).
|
1399 |
\end{equation}
|
1400 |
|
1401 |
The first point to make about an estimate in the form of
|
1402 |
(\ref{eq:ccil0:sidv0:sgdu0:01}) is that it can only be accomplished
|
1403 |
efficiently if the machine-native division instruction supports
|
1404 |
overflow detection, since it is possible that
|
1405 |
$(u_n b + u_{n-1})/v_{n-1} \geq b$, even if
|
1406 |
$u/v < b$, as is shown by the following example.
|
1407 |
|
1408 |
\begin{vworkexamplestatement}
|
1409 |
\label{ex:ccil0:sidv0:sgdu0:01:01}
|
1410 |
Assume that we wish to apply the estimate of $\hat{q}$ provided by
|
1411 |
(\ref{eq:ccil0:sidv0:sgdu0:01})
|
1412 |
to $u=16,776,704$ and $v=65,535$. Demonstrate that a machine division
|
1413 |
overflow will occur when estimating the first digit, assuming a processor
|
1414 |
that can divide a 16-bit dividend by an 8-bit divisor to produce an 8-bit
|
1415 |
quotient.
|
1416 |
\end{vworkexamplestatement}
|
1417 |
\begin{vworkexampleparsection}{Solution}
|
1418 |
Note that according to Knuth's intention, the word size on such a machine
|
1419 |
is 8 bits. Thus, $b=256$. Note that $u/v = 255 + 255/256 < b = 256$, as
|
1420 |
required by Knuth's precondition. However, although $u/v < b$,
|
1421 |
$u = [255 \; 254 \; 0] [256^2 \; 256 \; 1]^T = [u_2 u_1 u_0] [b^2 b^1 b^0]^T$ and
|
1422 |
$v = [255 \; 255] [256 \; 1]^T = [v_1 v_0] [b^1 b^0]^T$, so that calculating
|
1423 |
an estimate $\hat{q}$ as required by (\ref{eq:ccil0:sidv0:sgdu0:01}),
|
1424 |
$(u_n b + u_{n-1})/v_{n-1} = 65,534/255 = 256 + 254/255 \geq b$, is a division
|
1425 |
overflow for a single machine division instruction. Thus, it follows that
|
1426 |
a machine with division overflow detection can quickly determine that $b-1$ from
|
1427 |
(\ref{eq:ccil0:sidv0:sgdu0:01}) is the minimum, whereas a machine without
|
1428 |
division overflow
|
1429 |
detection would have to use several additional machine instructions to make
|
1430 |
this determination.
|
1431 |
\end{vworkexampleparsection}
|
1432 |
\vworkexamplefooter{}
|
1433 |
|
1434 |
The second thing to establish about $\hat{q}$ as defined by
|
1435 |
(\ref{eq:ccil0:sidv0:sgdu0:01}) is how ``good'' of an estimate
|
1436 |
$\hat{q}$ is---how much information, exactly, about $q$ can we
|
1437 |
obtain by examining the first two words of $u$ and the first
|
1438 |
word of $v$?
|
1439 |
|
1440 |
We first establish in the following lemma that our estimate of
|
1441 |
$q$, $\hat{q}$, can be no less than $q$.
|
1442 |
|
1443 |
\begin{vworklemmastatementpar}{\mbox{\boldmath$\hat{q} \geq q$}}
|
1444 |
\label{lem:ccil0:sidv0:sgdu0:01}
|
1445 |
The estimate of $q$ provided by (\ref{eq:ccil0:sidv0:sgdu0:01}),
|
1446 |
$\hat{q}$ is always at least as great as the actual value of
|
1447 |
$q$, i.e. $\hat{q} \geq q$.
|
1448 |
\end{vworklemmastatementpar}
|
1449 |
\begin{vworklemmaproof}
|
1450 |
Knowledge of $u_{n}$, $u_{n-1}$, and $v_{n-1}$ necessarily confine
|
1451 |
the intervals in which the actual values of $u$ and $v$ may be;
|
1452 |
specifically:\footnote{In
|
1453 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:04})
|
1454 |
and
|
1455 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:07}),
|
1456 |
we use statements of the form ``$x = x$'' as an idiom for
|
1457 |
``$x$ is known''.}
|
1458 |
|
1459 |
\begin{eqnarray}
|
1460 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:01}
|
1461 |
u & = & \sum_{i=0}^{n} u_i b^i \\
|
1462 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:02}
|
1463 |
& = & u_n b^n + u_{n-1} b^{n-1} + \ldots{} + u_2 b^2 + u_1 b + u_0 \\
|
1464 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:03}
|
1465 |
& = & (u_n b + u_{n-1}) b^{n-1} + \ldots{} + u_2 b^2 + u_1 b + u_0
|
1466 |
\end{eqnarray}
|
1467 |
|
1468 |
\begin{eqnarray}
|
1469 |
\nonumber & (u_n = u_n \wedge u_{n-1} = u_{n-1}) & \\
|
1470 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:04}
|
1471 |
& \vworkvimp & \\
|
1472 |
\nonumber & (u_n b + u_{n-1}) b^{n-1} \leq u \leq (u_n b + u_{n-1}) b^{n-1} + b^{n-1} - 1 &
|
1473 |
\end{eqnarray}
|
1474 |
|
1475 |
\begin{eqnarray}
|
1476 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:05}
|
1477 |
v & = & \sum_{i=0}^{n-1} v_i b^i \\
|
1478 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:06}
|
1479 |
& = & v_{n-1} b^{n-1} + v_{n-2} b^{n-2} + \ldots{} + v_2 b^2 + v_1 b + v_0
|
1480 |
\end{eqnarray}
|
1481 |
|
1482 |
\begin{equation}
|
1483 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:07}
|
1484 |
(v_{n-1} = v_{n-1})
|
1485 |
\vworkhimp
|
1486 |
v_{n-1} b^{n-1} \leq v \leq v_{n-1} b^{n-1} + b^{n-1} - 1
|
1487 |
\end{equation}
|
1488 |
|
1489 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:04}) and
|
1490 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:07}) reflect the uncertainties in the
|
1491 |
values of $u$ and $v$ respectively because only the first digit(s) of
|
1492 |
$u$ and $v$ are being considered in forming the estimate $\hat{q}$.
|
1493 |
|
1494 |
By definition, the actual value of $q$ is $\lfloor{}u/v\rfloor$. For a
|
1495 |
rational function $f(u,v) = u/v$ where $u \in [u_{min}, u_{max}]$ and
|
1496 |
$v \in [v_{min}, v_{max}]$, the minimum value of $u/v$ occurs at
|
1497 |
$u_{min}/v_{max}$, and the maximum value of $u/v$ occurs at
|
1498 |
$u_{max}/v_{min}$. We can therefore write that
|
1499 |
|
1500 |
\begin{equation}
|
1501 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:08}
|
1502 |
\left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1}}{v_{n-1} b^{n-1} + b^{n-1} - 1}}\right\rfloor
|
1503 |
\leq
|
1504 |
q
|
1505 |
\leq
|
1506 |
\left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1} + b^{n-1} - 1}{v_{n-1} b^{n-1}}}\right\rfloor .
|
1507 |
\end{equation}
|
1508 |
|
1509 |
In other words, knowledge of $u_{n}$, $u_{n-1}$, and $v_{n-1}$ confines $q$ to the
|
1510 |
interval indicated in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}). We must prove that,
|
1511 |
given a specific $u_{n}$, $u_{n-1}$, and $v_{n-1}$, $\hat{q}$ is at least as large as
|
1512 |
the upper bound in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}); otherwise we could find a
|
1513 |
$q$ such that $q > \hat{q}$. We can algebraically manipulate the upper bound in
|
1514 |
in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}) to yield
|
1515 |
|
1516 |
\begin{equation}
|
1517 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:09}
|
1518 |
\left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1}}{v_{n-1} b^{n-1} + b^{n-1} - 1}}\right\rfloor
|
1519 |
\leq
|
1520 |
q
|
1521 |
\leq
|
1522 |
\left\lfloor{\frac{u_n b + u_{n-1} + \frac{b^{n-1}-1}{b^{n-1}}}{v_{n-1}}}\right\rfloor .
|
1523 |
\end{equation}
|
1524 |
|
1525 |
In (\ref{eq:lem:ccil0:sidv0:sgdu0:01:09}), since $(b^{n-1}-1)/b^{n-1} < 1$ and since
|
1526 |
$u_n b + u_{n-1}$ is an integer, we can conclude that
|
1527 |
$\lfloor u_n b + u_{n-1} + (b^{n-1}-1)/b^{n-1} \rfloor = \lfloor u_n b + u_{n-1} \rfloor$
|
1528 |
and hence that
|
1529 |
|
1530 |
\begin{equation}
|
1531 |
\label{eq:lem:ccil0:sidv0:sgdu0:01:10}
|
1532 |
q
|
1533 |
\leq
|
1534 |
\left\lfloor{\frac{u_n b + u_{n-1} + \frac{b^{n-1}-1}{b^{n-1}}}{v_{n-1}}}\right\rfloor
|
1535 |
=
|
1536 |
\left\lfloor{\frac{u_n b + u_{n-1}}{v_{n-1}}}\right\rfloor
|
1537 |
=
|
1538 |
\hat{q} .
|
1539 |
\end{equation}
|
1540 |
|
1541 |
Therefore, $\hat{q} \geq q$.
|
1542 |
\end{vworklemmaproof}
|
1543 |
\vworklemmafooter{}
|
1544 |
|
1545 |
Lemma \ref{lem:ccil0:sidv0:sgdu0:01} establishes that
|
1546 |
a digit estimate $\hat{q}$ based on the first digit of the
|
1547 |
divisor $v$ can be no less than the actual digit $q$, i.e.
|
1548 |
$\hat{q}-q \geq 0$. However, we must also establish an upper bound
|
1549 |
on $\hat{q}-q$.
|
1550 |
|
1551 |
Intuitively, based on
|
1552 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:06}), we might guess that
|
1553 |
if $v_{n-1}$ is small, the estimate $\hat{q}$ may be quite
|
1554 |
poor, as the interval to which the actual value of $v$ is confined
|
1555 |
may be quite large. This fact is the basis for the normalization
|
1556 |
step [\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:01}] in Algorithm
|
1557 |
\ref{alg:ccil0:sidv0:sgdu0:01}. We now prove a useful result
|
1558 |
for how much $u, v$ must be normalized so that $\hat{q}-q \leq 2$.
|
1559 |
|
1560 |
\begin{vworklemmastatementpar}{Normalization Requirement So That
|
1561 |
\mbox{\boldmath$\hat{q} - q \leq 2$}}
|
1562 |
\label{lem:ccil0:sidv0:sgdu0:02}
|
1563 |
If $v_{n-1} \geq \lfloor b/2 \rfloor$ and $\hat{q}$ is chosen as
|
1564 |
indicated in (\ref{eq:ccil0:sidv0:sgdu0:01}), then
|
1565 |
$0 \leq \hat{q} - q \leq 2$.
|
1566 |
\end{vworklemmastatementpar}
|
1567 |
\begin{vworklemmaproof}
|
1568 |
The lower limit on $\hat{q} - q$ is proved in Lemma \ref{lem:ccil0:sidv0:sgdu0:01}.
|
1569 |
We now seek only to prove that $\hat{q} - q \leq 2$.
|
1570 |
By definition of $\hat{q}$ and $q$,
|
1571 |
|
1572 |
\begin{equation}
|
1573 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:01}
|
1574 |
\hat{q} - q = \left\lfloor {\frac{u_n b + u_{n-1}}{v_{n-1}}} \right\rfloor
|
1575 |
- \left\lfloor {\frac{u}{v}} \right\rfloor
|
1576 |
\end{equation}
|
1577 |
|
1578 |
When only nonnegative integers are involved,
|
1579 |
(\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02})
|
1580 |
supplies an exact expression for the floor of a
|
1581 |
ratio of integers. Using (\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02}),
|
1582 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:01}) can be decomposed into
|
1583 |
|
1584 |
\begin{equation}
|
1585 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:02}
|
1586 |
\hat{q} - q = \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1587 |
- \frac{(u_n b + u_{n-1}) \bmod v_{n-1}}{v_{n-1}}
|
1588 |
- \frac{u}{v}
|
1589 |
+ \frac{u \bmod v}{v} .
|
1590 |
\end{equation}
|
1591 |
|
1592 |
\noindent{}Note that (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) is an exact
|
1593 |
expression (rather than an
|
1594 |
inequality).
|
1595 |
|
1596 |
Note in (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) that
|
1597 |
$(u_n b + u_{n-1}) \bmod v_{n-1} \in [0, v_{n-1}-1]$, and that in general
|
1598 |
there is no reason to expect it cannot be zero. Thus, we can assume that
|
1599 |
it \emph{is} zero, which will maximize $\hat{q}-q$. We can thus convert
|
1600 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) into the inequality
|
1601 |
|
1602 |
\begin{equation}
|
1603 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:03}
|
1604 |
\hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1605 |
- \frac{u}{v}
|
1606 |
+ \frac{u \bmod v}{v} .
|
1607 |
\end{equation}
|
1608 |
|
1609 |
In (\ref{eq:lem:ccil0:sidv0:sgdu0:02:03}) we can also observe that
|
1610 |
$(u \bmod v)/v \in [0, (v-1)/v]$. If we replace this expression with
|
1611 |
``1'' (which is unattainable, but barely), this will change the relational
|
1612 |
operator from ``$\leq$'' to ``$<$'':
|
1613 |
|
1614 |
\begin{equation}
|
1615 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:04}
|
1616 |
\hat{q} - q < \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1617 |
- \frac{u}{v}
|
1618 |
+ 1 .
|
1619 |
\end{equation}
|
1620 |
|
1621 |
The result we wish to show is that with $v_{n-1} \geq \lfloor b/2 \rfloor$,
|
1622 |
$\hat{q}-q \leq 2$. To simplify the subsequent algebraic manipulations, note in
|
1623 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:04}) that
|
1624 |
|
1625 |
\begin{eqnarray}
|
1626 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:05}
|
1627 |
& \hat{q} - q \leq 2 & \\
|
1628 |
\nonumber & \vworkvertequiv & \\
|
1629 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:06}
|
1630 |
& \displaystyle \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1631 |
- \frac{u}{v}
|
1632 |
+ 1 \leq 3 & \\
|
1633 |
\nonumber & \vworkvertequiv & \\
|
1634 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:07}
|
1635 |
& \displaystyle \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1636 |
- \frac{u}{v} \leq 2 &
|
1637 |
\end{eqnarray}
|
1638 |
|
1639 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:06}) may be counterintuitive, so
|
1640 |
further explanation is offered here. Since $\hat{q} \in \vworkintset$ and $q \in \vworkintset$,
|
1641 |
$\hat{q}-q \in \vworkintset$. Thus, proving
|
1642 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:06}) or
|
1643 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}) proves that
|
1644 |
$\hat{q}-q \in \{ \ldots, -1, 0, 1, 2 \}$ (however, by
|
1645 |
Lemma \ref{lem:ccil0:sidv0:sgdu0:01}, $\hat{q}-q \geq 0$, so in fact
|
1646 |
what would be proved is that $\hat{q}-q \in \{ 0, 1, 2 \}$). For
|
1647 |
algebraic simplicity,
|
1648 |
we choose to prove (\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}).
|
1649 |
|
1650 |
First, adjust numerator and denominator of the first term in
|
1651 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}) by $b^{n-1}$ so that the terms more closely
|
1652 |
resemble $u$ and $v$ in
|
1653 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:02})
|
1654 |
and
|
1655 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:01:06}):
|
1656 |
|
1657 |
\begin{equation}
|
1658 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:08}
|
1659 |
\frac{u_n b^n + u_{n-1} b^{n-1}}{v_{n-1} b^{n-1}}
|
1660 |
- \frac{u}{v} \leq 2 .
|
1661 |
\end{equation}
|
1662 |
|
1663 |
For logical implication to be maintained,
|
1664 |
we must make the most pessimistic choices and assumptions possible in
|
1665 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:08}) in order to maximize the value
|
1666 |
of the left side of the inequality.
|
1667 |
The first assumption to be made is the error in estimating
|
1668 |
$u$ and $v$ based on their most significant digits. It can be
|
1669 |
seen that (\ref{eq:lem:ccil0:sidv0:sgdu0:02:08}) will be maximized if:
|
1670 |
|
1671 |
\begin{itemize}
|
1672 |
\item We assume that $u = u_{n} b^n + u_{n-1} b^{n-1}$ (i.e. that we estimate
|
1673 |
$u$ precisely).
|
1674 |
\item We assume that $v = v_{n-1} b^{n-1} + b^{n-1} - 1$ (i.e. that
|
1675 |
we underestimate $v$ by the maximum amount possible).
|
1676 |
\item We minimize the value of $v_{n-1} b^{n-1}$.
|
1677 |
\end{itemize}
|
1678 |
|
1679 |
Assuming that $u$ is estimated precisely yields
|
1680 |
|
1681 |
\begin{equation}
|
1682 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:09}
|
1683 |
\frac{u}{v_{n-1} b^{n-1}}
|
1684 |
- \frac{u}{v} \leq 2 .
|
1685 |
\end{equation}
|
1686 |
|
1687 |
Assuming that $v$ is underestimated by the maximum amount possible
|
1688 |
yields
|
1689 |
|
1690 |
\begin{equation}
|
1691 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:10}
|
1692 |
\frac{u}{v - b^{n-1} + 1}
|
1693 |
- \frac{u}{v} \leq 2 .
|
1694 |
\end{equation}
|
1695 |
|
1696 |
Finally, with $b$ and $v$ fixed, $u$ can be maximized by noting that
|
1697 |
$u \leq bv - 1$ (by the problem assumption that the quotient is a single digit).
|
1698 |
However, for algebraic simplicity, we make the substitution $u=bv$ (rather than
|
1699 |
$u=bv-1$), since the weaker upper bound is strong enough to prove the
|
1700 |
first result we seek.
|
1701 |
|
1702 |
\begin{equation}
|
1703 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:11}
|
1704 |
\frac{bv}{v - b^{n-1} + 1}
|
1705 |
- \frac{bv}{v} \leq 2
|
1706 |
\end{equation}
|
1707 |
|
1708 |
\begin{equation}
|
1709 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:12}
|
1710 |
\frac{bv}{v - b^{n-1} + 1}
|
1711 |
- b \leq 2
|
1712 |
\end{equation}
|
1713 |
|
1714 |
Solving (\ref{eq:lem:ccil0:sidv0:sgdu0:02:12})
|
1715 |
for $v$ yields
|
1716 |
|
1717 |
\begin{equation}
|
1718 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:13}
|
1719 |
v \geq \frac{b^n}{2} + b^{n-1} - \frac{1}{b} - 1
|
1720 |
\end{equation}
|
1721 |
|
1722 |
Again using the assumption that $v$ is underestimated by the maximum amount
|
1723 |
possible, we may make the substitution that $v = v_{n-1} b^{n-1} + b^{n-1} -1$,
|
1724 |
leading to
|
1725 |
|
1726 |
\begin{equation}
|
1727 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:13b}
|
1728 |
v_{n-1} \geq \frac{b}{2} - \frac{1}{2 b^{n-2}} .
|
1729 |
\end{equation}
|
1730 |
|
1731 |
There are two cases to consider: $b$ even and $b$ odd. If $b$ is even, the
|
1732 |
proof is complete, as $\lfloor b/2 \rfloor = b/2$ and the choice of
|
1733 |
$v_{n-1} = \lfloor b/2 \rfloor$ will automatically satisfy
|
1734 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}). However, if $b$ is odd,
|
1735 |
$\lfloor b/2 \rfloor = b/2 - 1/2 < b/2 - 1/2b^{n-2}$, violating
|
1736 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}),
|
1737 |
and so we need to
|
1738 |
further examine this case.
|
1739 |
|
1740 |
If $b$ is odd and $v_{n-1} = \lfloor b/2 \rfloor$, then
|
1741 |
$v_{n-1} = b/2 - 1/2$, violating (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}).
|
1742 |
However, any larger choice of $v_{n-1}$ (such as
|
1743 |
$\lfloor b/2 \rfloor + 1$, $\lfloor b/2 \rfloor + 2$, etc.) satisfies
|
1744 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}); so that it remains only to prove
|
1745 |
the $v_{n-1} = \lfloor b/2 \rfloor = b/2 - 1/2$
|
1746 |
case.
|
1747 |
|
1748 |
If $v_{n-1} = \lfloor b/2 \rfloor = b/2 - 1/2$, then
|
1749 |
|
1750 |
\begin{eqnarray}
|
1751 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:14}
|
1752 |
v & \in & \left[
|
1753 |
\left( \frac{b}{2} - \frac{1}{2}\right) b^{n-1},
|
1754 |
\left( \frac{b}{2} - \frac{1}{2}\right) b^{n-1} + b^{n-1} - 1
|
1755 |
\right] \\
|
1756 |
\nonumber & = &
|
1757 |
\left[
|
1758 |
\frac{b^n}{2} - \frac{b^{n-1}}{2},
|
1759 |
\frac{b^n}{2} + \frac{b^{n-1}}{2} -1
|
1760 |
\right] .
|
1761 |
\end{eqnarray}
|
1762 |
|
1763 |
Note in this case that the estimation error ($v - v_{n-1}b^{n-1}$) and the
|
1764 |
value of $v$ are not independent; and in fact it is this aspect
|
1765 |
of the problem that has led to the violation of
|
1766 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}) with $b$ odd and
|
1767 |
$v_{n-1} = \lfloor b/2 \rfloor$.
|
1768 |
|
1769 |
In order to prove the case of $b$ odd and $v = \lfloor b/2 \rfloor = b/2 - 1/2$,
|
1770 |
we must reexamine some simplifying assumptions made earlier in order to obtain
|
1771 |
tighter inequalities. In (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}), we can no
|
1772 |
longer accept the maximum of $(u \bmod v)/v$ as one; instead we construct the
|
1773 |
tighter inequality
|
1774 |
|
1775 |
\begin{eqnarray}
|
1776 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:15}
|
1777 |
& \displaystyle \hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1778 |
- \frac{u}{v}
|
1779 |
+ \frac{u \bmod v}{v} & \\
|
1780 |
\nonumber & \vworkvimp & \\
|
1781 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:16}
|
1782 |
& \displaystyle \hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
|
1783 |
- \frac{u}{v}
|
1784 |
+ \frac{v-1}{v} , &
|
1785 |
\end{eqnarray}
|
1786 |
|
1787 |
which leads to
|
1788 |
|
1789 |
\begin{equation}
|
1790 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:17}
|
1791 |
\frac{u_n b + u_{n-1}}{v_{n-1}}
|
1792 |
- \frac{u+1}{v}
|
1793 |
< 2 .
|
1794 |
\end{equation}
|
1795 |
|
1796 |
In order to maximize the left-hand side of
|
1797 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:17}), we assume that we
|
1798 |
estimate $u$ exactly so that $u = u_n b^n + u_{n-1} b^{n-1}$,
|
1799 |
yielding
|
1800 |
|
1801 |
\begin{equation}
|
1802 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:18}
|
1803 |
\frac{u}{v_{n-1} b^{n-1}}
|
1804 |
- \frac{u+1}{v}
|
1805 |
< 2 .
|
1806 |
\end{equation}
|
1807 |
|
1808 |
We also assume that $u$ is the maximum value
|
1809 |
possible, $u=bv-1$, leading to
|
1810 |
|
1811 |
\begin{equation}
|
1812 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:19}
|
1813 |
\frac{bv-1}{v_{n-1} b^{n-1}}
|
1814 |
- b
|
1815 |
< 2 .
|
1816 |
\end{equation}
|
1817 |
|
1818 |
Finally, we assume that $v$ is the upper limit in
|
1819 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:02:14}),
|
1820 |
$v=b^n/2 + b^{n-1}/2 - 1$, and substitute the known value of
|
1821 |
$v_{n-1}$ for the case being proved, $v_{n-1} = b/2-1/2$, yielding
|
1822 |
|
1823 |
\begin{equation}
|
1824 |
\label{eq:lem:ccil0:sidv0:sgdu0:02:20}
|
1825 |
\frac{b \left( \frac{b^n}{2} + \frac{b^{n-1}}{2} - 1 \right) - 1}
|
1826 |
{\left( \frac{b}{2} - \frac{1}{2} \right) b^{n-1}}
|
1827 |
- b
|
1828 |
< 2 .
|
1829 |
\end{equation}
|
1830 |
|
1831 |
Simplification of (\ref{eq:lem:ccil0:sidv0:sgdu0:02:20})
|
1832 |
will establish that it is always true. This completes the proof.
|
1833 |
\end{vworklemmaproof}
|
1834 |
\vworklemmafooter{}
|
1835 |
|
1836 |
Lemmas \ref{lem:ccil0:sidv0:sgdu0:01} and
|
1837 |
\ref{lem:ccil0:sidv0:sgdu0:02},
|
1838 |
standing alone, lead to a good implementation of
|
1839 |
division without any further results. If it is known that
|
1840 |
$0 \leq \hat{q} - q \leq 2$, Algorithm \ref{alg:ccil0:sidv0:sgdu0:01}
|
1841 |
can be trivially modified to only calculate
|
1842 |
$\hat{q}$ (omitting the additional tests in Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}),
|
1843 |
and then
|
1844 |
to include up to two add-back steps
|
1845 |
(duplication of Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}).
|
1846 |
Although such an algorithm would be
|
1847 |
satisfactory, it has the disadvantage that the add-back steps would
|
1848 |
be executed very frequently, slowing the algorithm substantially, especially
|
1849 |
for long operands.
|
1850 |
We now show that the additional tests in Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03} of
|
1851 |
Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} can eliminate
|
1852 |
altogether the case of $\hat{q}-q = 2$ (Lemma \ref{lem:ccil0:sidv0:sgdu0:03}), and
|
1853 |
can with a probability close to unity eliminate the
|
1854 |
case of $\hat{q}-q = 1$ (Lemmas \ref{lem:ccil0:sidv0:sgdu0:04}
|
1855 |
and \ref{lem:ccil0:sidv0:sgdu0:05}). Together these tests, which are present in
|
1856 |
the statement of Algorithm \ref{alg:ccil0:sidv0:sgdu0:01},
|
1857 |
reduce add-back (Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}) to rare occurrence, and create a more
|
1858 |
efficient algorithm than would be possible with the
|
1859 |
results of Lemmas \ref{lem:ccil0:sidv0:sgdu0:01} and \ref{lem:ccil0:sidv0:sgdu0:02} alone.
|
1860 |
|
1861 |
\begin{vworklemmastatementpar}
|
1862 |
{\mbox{\boldmath$\hat{q} v_{n-2} \leq b \hat{r} + u_{j+n-2} \vworkhimp 0 \leq \hat{q} - q \leq 1$}}
|
1863 |
\label{lem:ccil0:sidv0:sgdu0:03}
|
1864 |
If the divisor normalization requirement ($v_{n-1} \geq \lfloor b/2 \rfloor$) as specified in
|
1865 |
Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:01} of
|
1866 |
Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} is met, then
|
1867 |
|
1868 |
\begin{equation}
|
1869 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:01}
|
1870 |
\hat{q} v_{n-2} \leq b \hat{r} + u_{j+n-2} \vworkhimp 0 \leq \hat{q} - q \leq 1 .
|
1871 |
\end{equation}
|
1872 |
\end{vworklemmastatementpar}
|
1873 |
\begin{vworklemmaproof}
|
1874 |
For reference, note that:
|
1875 |
|
1876 |
\begin{eqnarray}
|
1877 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:02}
|
1878 |
u & = & u_{j+n} b^{j+n} + u_{j+n-1} b^{j+n-1} + \ldots{} + u_1 b + u_0 \\
|
1879 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:03}
|
1880 |
v & = & v_{n-1} b^{n-1} + v_{n-2} b^{n-2} + \ldots{} + v_1 b + v_0
|
1881 |
\end{eqnarray}
|
1882 |
|
1883 |
By definition, we the remainder
|
1884 |
$\hat{r}$ has the value
|
1885 |
$\hat{r} = u_{j+n} b + u_{j+n-1} - \hat{q} v_{n-1}$. Substituting this value
|
1886 |
into (\ref{eq:lem:ccil0:sidv0:sgdu0:03:01}) produces
|
1887 |
|
1888 |
\begin{equation}
|
1889 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:04}
|
1890 |
\hat{q} v_{n-2} \leq b (u_{j+n} b + u_{j+n-1} - \hat{q} v_{n-1}) + u_{j+n-2} ,
|
1891 |
\end{equation}
|
1892 |
|
1893 |
and solving for $\hat{q}$ yields
|
1894 |
|
1895 |
\begin{equation}
|
1896 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:05}
|
1897 |
\hat{q} \leq \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}}.
|
1898 |
\end{equation}
|
1899 |
|
1900 |
It is known from Lemma \ref{lem:ccil0:sidv0:sgdu0:01} that the type of estimate
|
1901 |
represented by the floor of the right-hand size of (\ref{eq:lem:ccil0:sidv0:sgdu0:03:05})
|
1902 |
can be no less than $q$, leading to
|
1903 |
|
1904 |
\begin{eqnarray}
|
1905 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:06}
|
1906 |
& \displaystyle q \leq \hat{q}
|
1907 |
\leq
|
1908 |
\left\lfloor { \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} } \right\rfloor & \\
|
1909 |
\nonumber & \displaystyle \leq
|
1910 |
\frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}}. &
|
1911 |
\end{eqnarray}
|
1912 |
|
1913 |
Because $q, \hat{q} \in \vworkintset$, it is only necessary to prove that
|
1914 |
|
1915 |
\begin{equation}
|
1916 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:07}
|
1917 |
\frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
|
1918 |
\left\lfloor \frac{u}{v} \right\rfloor
|
1919 |
< 2
|
1920 |
\end{equation}
|
1921 |
|
1922 |
in order to prove that $\hat{q}-q \leq 1$. Using
|
1923 |
(\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02}),
|
1924 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:03:07}) can be rewritten as
|
1925 |
|
1926 |
\begin{equation}
|
1927 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:08}
|
1928 |
\frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
|
1929 |
\frac{u}{v} -
|
1930 |
\frac{u \bmod v}{v}
|
1931 |
< 2 .
|
1932 |
\end{equation}
|
1933 |
|
1934 |
In order for implication to hold, we must make the most pessimistic
|
1935 |
assumptions about $u \bmod v$ (those which maximize it). The maximum value
|
1936 |
of $u \bmod v$ is $v-1$, leading to
|
1937 |
|
1938 |
\begin{equation}
|
1939 |
\label{eq:lem:ccil0:sidv0:sgdu0:03:09}
|
1940 |
\frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
|
1941 |
\frac{u + 1}{v}
|
1942 |
< 1 .
|
1943 |
\end{equation}
|
1944 |
|
1945 |
In order to maximize the left side of (\ref{}),
|
1946 |
we must assume that $u$ is maximized, $v$ is minimized,
|
1947 |
|
1948 |
|
1949 |
\end{vworklemmaproof}
|
1950 |
\vworklemmafooter{}
|
1951 |
|
1952 |
\begin{vworklemmastatementpar}
|
1953 |
{\mbox{\boldmath$\hat{q} v_{n-2} > b \hat{r} + u_{n-2} \vworkhimp q < \hat{q}$}}
|
1954 |
\label{lem:ccil0:sidv0:sgdu0:04}
|
1955 |
Given $\hat{q} > 0$, an estimate of $q$, and the remainder
|
1956 |
based on the estimate, $\hat{r} = u_n b + u_{n-1} - \hat{q} v_{n-1}$,
|
1957 |
|
1958 |
\begin{equation}
|
1959 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:01}
|
1960 |
\hat{q} v_{n-2} > b \hat{r} + u_{n-2} \vworkhimp \hat{q} > q .
|
1961 |
\end{equation}
|
1962 |
\end{vworklemmastatementpar}
|
1963 |
\begin{vworklemmaproof}
|
1964 |
We make the assumption that $v_{n-1}$ and $v_{n-2}$ are not both 0.
|
1965 |
$v_{n-1} > 0$ is guaranteed by
|
1966 |
the normalization of
|
1967 |
$v$ in Algorithm \ref{alg:ccil0:sidv0:sgdu0:01}.
|
1968 |
|
1969 |
\begin{equation}
|
1970 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:02}
|
1971 |
\hat{q} v_{n-2} > b \hat{r} + u_{n-2}
|
1972 |
\end{equation}
|
1973 |
|
1974 |
\begin{equation}
|
1975 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:03}
|
1976 |
\hat{q} v_{n-2} > b (u_n b + u_{n-1} - \hat{q} v_{n-1}) + u_{n-2}
|
1977 |
\end{equation}
|
1978 |
|
1979 |
Solving (\ref{eq:lem:ccil0:sidv0:sgdu0:04:03}) for $\hat{q}$ yields
|
1980 |
|
1981 |
\begin{equation}
|
1982 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:04}
|
1983 |
\hat{q}
|
1984 |
>
|
1985 |
\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}
|
1986 |
\geq
|
1987 |
\left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
|
1988 |
.
|
1989 |
\end{equation}
|
1990 |
|
1991 |
Note that the right-hand term of
|
1992 |
(\ref{eq:lem:ccil0:sidv0:sgdu0:04:04})
|
1993 |
is similar in form to the estimate $\hat{q}$ in
|
1994 |
Lemma \ref{lem:ccil0:sidv0:sgdu0:01}, where it is proved that
|
1995 |
$\hat{q} \geq q$. It is possible to use identical algebraic technique
|
1996 |
as is used in Lemma \ref{lem:ccil0:sidv0:sgdu0:01} in order to prove that
|
1997 |
|
1998 |
\begin{equation}
|
1999 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:05}
|
2000 |
\left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
|
2001 |
\geq q,
|
2002 |
\end{equation}
|
2003 |
|
2004 |
and it follows that
|
2005 |
|
2006 |
\begin{equation}
|
2007 |
\label{eq:lem:ccil0:sidv0:sgdu0:04:06}
|
2008 |
\hat{q}
|
2009 |
>
|
2010 |
\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}
|
2011 |
\geq
|
2012 |
\left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
|
2013 |
\geq q,
|
2014 |
\end{equation}
|
2015 |
|
2016 |
and thus $\hat{q} > q$.
|
2017 |
\end{vworklemmaproof}
|
2018 |
\vworklemmafooter{}
|
2019 |
|
2020 |
\begin{vworklemmastatementpar}
|
2021 |
{Add-back occurs with approximate probability \mbox{\boldmath$2/b$}}
|
2022 |
\label{lem:ccil0:sidv0:sgdu0:05}
|
2023 |
The estimate of $q$ provided by (\ref{eq:ccil0:sidv0:sgdu0:01}),
|
2024 |
\end{vworklemmastatementpar}
|
2025 |
\begin{vworklemmaproof}
|
2026 |
\end{vworklemmaproof}
|
2027 |
\vworklemmafooter{}
|
2028 |
|
2029 |
|
2030 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2031 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2032 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2033 |
\subsection{Division Of Signed Operands}
|
2034 |
|
2035 |
|
2036 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2037 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2038 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2039 |
\subsection{Large Dividends With Machine-Native Divisors}
|
2040 |
\label{ccil0:sidv0:sldm0}
|
2041 |
|
2042 |
Division of arbitrary-sized operands (Section \ref{ccil0:sidv0:sgdu0}) is
|
2043 |
a costly operation. In many practical applications, we are able to exploit
|
2044 |
data sizes of operands or special relationships between the values of
|
2045 |
operands to use the instruction set of the machine more effectively.
|
2046 |
In this subsection, we investigate what optimizations we may achieve when:
|
2047 |
|
2048 |
\begin{itemize}
|
2049 |
\item We wish to calculate the quotient and remainder of
|
2050 |
unsigned integers $p$ and $q$: $p/q$ and
|
2051 |
$p \bmod{} q$; \emph{and}
|
2052 |
\item The machine possesses unsigned division instructions
|
2053 |
which provide both a quotient and a remainder from
|
2054 |
a division; \emph{and}
|
2055 |
\item The bitsize of the divisor $q$ is not larger than can
|
2056 |
be accomodated (as a divisor) by machine division instructions.
|
2057 |
\end{itemize}
|
2058 |
|
2059 |
Processors which possess integer division instructions usually
|
2060 |
possess one of two types of instructions:
|
2061 |
|
2062 |
\begin{itemize}
|
2063 |
\item Instructions where the the divisor, quotient and remainder are
|
2064 |
$Q$ bits, but the dividend is $2Q$ bits (we call these
|
2065 |
``large dividend'' instructions). For example, an
|
2066 |
instruction which accepts a 16-bit dividend and an
|
2067 |
8-bit divisor to produce an 8-bit quotient and an 8-bit remainder is
|
2068 |
typical.
|
2069 |
With such instructions, overflow is possible, and is always detectable.
|
2070 |
However, in this subsection we never describe algorithms which detect
|
2071 |
overflow---instead, we arrange for data values which cannot generate an
|
2072 |
overflow.
|
2073 |
\item Instructions where the dividend, divisor, quotient, and remainder
|
2074 |
are all $Q$ bits (we call these ``small dividend'' instructions).
|
2075 |
With such instructions, overflow is not possible.
|
2076 |
\end{itemize}
|
2077 |
|
2078 |
We call the bitsize $Q$ a \emph{chunk}. We use \emph{chunk} rather than
|
2079 |
\emph{word} because the chunksize and wordsize in general are not
|
2080 |
required to be the same.
|
2081 |
|
2082 |
For the remainder of this discussion, we assume large dividend
|
2083 |
instructions (the first category above).
|
2084 |
The algorithms developed can be implemented on small dividend machines
|
2085 |
by halving data sizes so that the divisor fills no more than half
|
2086 |
of the available bits.
|
2087 |
|
2088 |
We assume that we are interested in calculating the integer quotient
|
2089 |
$\lfloor{}p/q\rfloor$ and remainder $p \bmod{} q$ of two unsigned
|
2090 |
integers $p$ and $q$, where $p$ is of size $P$ bits and $q$ is
|
2091 |
of size $Q$ bits. For simplicity and without detracting from the
|
2092 |
generality of the solution, we assume that $Q \vworkdivides{} P$.
|
2093 |
|
2094 |
We then seek to calculate
|
2095 |
|
2096 |
\begin{eqnarray}
|
2097 |
\label{eq:ccil0:sidv0:sldm0:001}
|
2098 |
\frac{p}{q} & = & \frac{2^{P-Q} p_{[P/Q-1]} + 2^{P-2Q} p_{[P/Q-2]} + \ldots{} + 2^{Q} p_{[1]} + p_{[0]}}{q_{[0]}} \\
|
2099 |
\nonumber & = & \frac{\sum_{i=0}^{P/Q-1} 2^{iQ} p_{[i]}}{q_{[0]}} .
|
2100 |
\end{eqnarray}
|
2101 |
|
2102 |
\noindent{}Using the integer identity
|
2103 |
|
2104 |
\begin{equation}
|
2105 |
\label{eq:ccil0:sidv0:sldm0:002}
|
2106 |
\frac{a}{b} = \left\lfloor{\frac{a}{b}}\right\rfloor + \frac{a \bmod b}{b} ,
|
2107 |
\end{equation}
|
2108 |
|
2109 |
\noindent{}we can reform (\ref{eq:ccil0:sidv0:sldm0:001}) into
|
2110 |
|
2111 |
\begin{eqnarray}
|
2112 |
\nonumber
|
2113 |
\frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
|
2114 |
\label{eq:ccil0:sidv0:sldm0:003}
|
2115 |
& + & 2^{P-Q} \frac{p_{[P/Q-1]}\bmod q_{[0]}}{q_{[0]}}
|
2116 |
+ 2^{P-2Q} \frac{p_{[P/Q-2]}}{q_{[0]}} \\
|
2117 |
\nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} ,
|
2118 |
\end{eqnarray}
|
2119 |
|
2120 |
\noindent{}which can be polished slightly to yield
|
2121 |
|
2122 |
\begin{eqnarray}
|
2123 |
\nonumber
|
2124 |
\frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
|
2125 |
\label{eq:ccil0:sidv0:sldm0:004}
|
2126 |
& + & 2^{P-2Q} \frac{2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}}{q_{[0]}} \\
|
2127 |
\nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} .
|
2128 |
\end{eqnarray}
|
2129 |
|
2130 |
Note in (\ref{eq:ccil0:sidv0:sldm0:004}) that the first term,
|
2131 |
$\lfloor{}p_{[P/Q-1]} / q_{[0]}\rfloor$, as well as
|
2132 |
a portion of the second term, $p_{[P/Q-1]}\bmod q_{[0]}$, can be
|
2133 |
calculated using a single machine division instruction with
|
2134 |
$p_{[P/Q-1]}$ as the dividend and $q_{[0]}$ as the divisor.
|
2135 |
Note also that multiplication of an integer by a power of 2
|
2136 |
can be achieved by placing the integer correctly within the
|
2137 |
result. In this regard note that $Q=8$ or $Q=16$ are
|
2138 |
the most typical cases, and so the placement can be achieved simply
|
2139 |
by selecting the correct memory address.
|
2140 |
|
2141 |
It is initially unclear whether we can evaluate or reduce the fraction in the
|
2142 |
second term of (\ref{eq:ccil0:sidv0:sldm0:004}),
|
2143 |
$[2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}] / q_{[0]}$,
|
2144 |
using a single large dividend machine instruction, because
|
2145 |
the upper chunk of the dividend is populated with non-zero bits
|
2146 |
(specifically, $p_{[P/Q-1]}\bmod q_{[0]}$), and it seems that
|
2147 |
a division overflow may be possible. However, with some thought,
|
2148 |
it is clear that $p_{[P/Q-1]}\bmod q_{[0]} \leq q_{[0]} - 1$ and
|
2149 |
$p_{[P/Q-2]} \leq 2^Q - 1$, thus the largest numerator possible
|
2150 |
is $2^Q q_{[0]} - 1$, which, when divided by $q_{[0]}$, will result
|
2151 |
in a quotient and remainder of $2^Q - 1$. Thus, no division overflow
|
2152 |
can occur, and the fraction in the
|
2153 |
second term of (\ref{eq:ccil0:sidv0:sldm0:004}) can be evaluated
|
2154 |
using a large divisor integer machine instruction.
|
2155 |
|
2156 |
The fraction in the
|
2157 |
second term of (\ref{eq:ccil0:sidv0:sldm0:004}) can be simplified
|
2158 |
using (\ref{eq:ccil0:sidv0:sldm0:002}) to yield:
|
2159 |
|
2160 |
\begin{eqnarray}
|
2161 |
\nonumber
|
2162 |
\frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
|
2163 |
\label{eq:ccil0:sidv0:sldm0:005}
|
2164 |
& + & 2^{P-2Q} \left\lfloor{\frac{2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}}{q_{[0]}}}\right\rfloor \\
|
2165 |
\nonumber & + & 2^{P-2Q} \frac{(2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}) \bmod q_{[0]}}{q_{[0]}} \\
|
2166 |
\nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} .
|
2167 |
\end{eqnarray}
|
2168 |
|
2169 |
The process of combining adjacent terms can be continued until all
|
2170 |
divisions and modulo operations necessary can be carried out using
|
2171 |
long dividend division instructions. If we envision a
|
2172 |
long-dividend division instruction as a functional block that
|
2173 |
accepts a $2Q$-bit dividend and a $Q$-bit divisor to produce a
|
2174 |
$Q$-bit quotient and a $Q$-bit remainder
|
2175 |
(Figure \ref{fig:ccil0:sidv0:sldm0:00}), then we can draw the
|
2176 |
entire division as outlined by (\ref{eq:ccil0:sidv0:sldm0:005})
|
2177 |
as shown in Figure \ref{fig:ccil0:sidv0:sldm0:01}.
|
2178 |
|
2179 |
\begin{figure}
|
2180 |
\centering
|
2181 |
\includegraphics[width=4.6in]{c_cil0/lddvblk.eps}
|
2182 |
\caption{Long Dividend Division Machine Instruction As A Functional Block}
|
2183 |
\label{fig:ccil0:sidv0:sldm0:00}
|
2184 |
\end{figure}
|
2185 |
|
2186 |
\begin{figure}
|
2187 |
\centering
|
2188 |
\includegraphics[width=4.6in]{c_cil0/ldmnblk.eps}
|
2189 |
\caption{Long Dividend/Machine-Native Divisor Division In Functional Block Form}
|
2190 |
\label{fig:ccil0:sidv0:sldm0:01}
|
2191 |
\end{figure}
|
2192 |
|
2193 |
The following example illustrates how to apply the technique.
|
2194 |
|
2195 |
\begin{vworkexamplestatement}
|
2196 |
\label{ex:ccil0:sidv0:sldm0:01}
|
2197 |
Implement 32/8 unsigned division on the TMS370C8 processor, which is
|
2198 |
characterized by a 16/8 division instruction.
|
2199 |
\end{vworkexamplestatement}
|
2200 |
\begin{vworkexampleparsection}{Solution}
|
2201 |
It would be possible to prepare an implementation directly from
|
2202 |
Figure \ref{fig:ccil0:sidv0:sldm0:01}: however, it may be
|
2203 |
more instructive to work through a solution without the
|
2204 |
aid of this figure.
|
2205 |
|
2206 |
In the case of the TMS370C8, the chunk size $Q$ is 8 bits; therefore
|
2207 |
$Q=8$. The problem statement indicates that we must accept 32-bit dividends;
|
2208 |
therefore $P=32$. Thus
|
2209 |
|
2210 |
\begin{equation}
|
2211 |
\label{eq:ex:ccil0:sidv0:sldm0:01:001}
|
2212 |
p = 2^{24} p_{[3]} + 2^{16} p_{[2]} + 2^{8} p_{[1]} + p_{[0]}
|
2213 |
\end{equation}
|
2214 |
|
2215 |
\noindent{}and
|
2216 |
|
2217 |
\begin{equation}
|
2218 |
\label{eq:ex:ccil0:sidv0:sldm0:01:002}
|
2219 |
q = q_{[0]} .
|
2220 |
\end{equation}
|
2221 |
|
2222 |
\noindent{}Thus the quotient and remainder we would like to determine,
|
2223 |
$\lfloor p/q \rfloor$ and $p \bmod q$, can be obtained by repeated
|
2224 |
application of (\ref{eq:ccil0:sidv0:sldm0:002}) as shown
|
2225 |
in Equations (\ref{eq:ex:ccil0:sidv0:sldm0:01:003})
|
2226 |
through (\ref{eq:ex:ccil0:sidv0:sldm0:01:011}).
|
2227 |
|
2228 |
\begin{equation}
|
2229 |
\label{eq:ex:ccil0:sidv0:sldm0:01:003}
|
2230 |
\frac{p}{q}
|
2231 |
=
|
2232 |
\frac{2^{24} p_{[3]} + 2^{16} p_{[2]} + 2^{8} p_{[1]} + p_{[0]}}{q_{[0]}}
|
2233 |
\end{equation}
|
2234 |
|
2235 |
\begin{equation}
|
2236 |
\label{eq:ex:ccil0:sidv0:sldm0:01:004}
|
2237 |
\frac{p}{q}
|
2238 |
=
|
2239 |
2^{24} \frac{p_{[3]}}{q_{[0]}}
|
2240 |
+
|
2241 |
2^{16} \frac{p_{[2]}}{q_{[0]}}
|
2242 |
+
|
2243 |
2^{8} \frac{p_{[1]}}{q_{[0]}}
|
2244 |
+
|
2245 |
\frac{p_{[0]}}{q_{[0]}}
|
2246 |
\end{equation}
|
2247 |
|
2248 |
\begin{equation}
|
2249 |
\label{eq:ex:ccil0:sidv0:sldm0:01:005}
|
2250 |
\frac{p}{q}
|
2251 |
=
|
2252 |
2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2253 |
+
|
2254 |
2^{24} \frac{(p_{[3]} \bmod q_{[0]})}{q_{[0]}}
|
2255 |
+
|
2256 |
2^{16} \frac{p_{[2]}}{q_{[0]}}
|
2257 |
+
|
2258 |
2^{8} \frac{p_{[1]}}{q_{[0]}}
|
2259 |
+
|
2260 |
\frac{p_{[0]}}{q_{[0]}}
|
2261 |
\end{equation}
|
2262 |
|
2263 |
\begin{equation}
|
2264 |
\label{eq:ex:ccil0:sidv0:sldm0:01:006}
|
2265 |
\frac{p}{q}
|
2266 |
=
|
2267 |
2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2268 |
+
|
2269 |
2^{16} \frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}
|
2270 |
+
|
2271 |
2^{8} \frac{p_{[1]}}{q_{[0]}}
|
2272 |
+
|
2273 |
\frac{p_{[0]}}{q_{[0]}}
|
2274 |
\end{equation}
|
2275 |
|
2276 |
\begin{eqnarray}
|
2277 |
\label{eq:ex:ccil0:sidv0:sldm0:01:007}
|
2278 |
\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2279 |
+
|
2280 |
2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
|
2281 |
\nonumber & + &
|
2282 |
2^{16} \frac{(2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}}{q_{[0]}}
|
2283 |
+
|
2284 |
2^{8} \frac{p_{[1]}}{q_{[0]}}
|
2285 |
+
|
2286 |
\frac{p_{[0]}}{q_{[0]}}
|
2287 |
\end{eqnarray}
|
2288 |
|
2289 |
\begin{eqnarray}
|
2290 |
\label{eq:ex:ccil0:sidv0:sldm0:01:008}
|
2291 |
\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2292 |
+
|
2293 |
2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
|
2294 |
\nonumber & + &
|
2295 |
2^{8} \frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}
|
2296 |
+
|
2297 |
\frac{p_{[0]}}{q_{[0]}}
|
2298 |
\end{eqnarray}
|
2299 |
|
2300 |
\begin{eqnarray}
|
2301 |
\nonumber\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2302 |
+
|
2303 |
2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
|
2304 |
\label{eq:ex:ccil0:sidv0:sldm0:01:009}
|
2305 |
& + &
|
2306 |
2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor \\
|
2307 |
\nonumber & + &
|
2308 |
2^{8} \frac{(2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}}{q_{[0]}} \\
|
2309 |
\nonumber & + &
|
2310 |
\frac{p_{[0]}}{q_{[0]}}
|
2311 |
\end{eqnarray}
|
2312 |
|
2313 |
\begin{eqnarray}
|
2314 |
\nonumber\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2315 |
+
|
2316 |
2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
|
2317 |
\label{eq:ex:ccil0:sidv0:sldm0:01:010}
|
2318 |
& + &
|
2319 |
2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor \\
|
2320 |
\nonumber & + &
|
2321 |
\frac{2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}}{q_{[0]}}
|
2322 |
\end{eqnarray}
|
2323 |
|
2324 |
\begin{eqnarray}
|
2325 |
\nonumber & \displaystyle \frac{p}{q} = 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
|
2326 |
+
|
2327 |
2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor & \\
|
2328 |
\label{eq:ex:ccil0:sidv0:sldm0:01:011}
|
2329 |
& \displaystyle +
|
2330 |
2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor & \\
|
2331 |
\nonumber & \displaystyle +
|
2332 |
\left\lfloor{\frac{2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}}{q_{[0]}}}\right\rfloor + & \\
|
2333 |
\nonumber
|
2334 |
& \displaystyle \frac{(2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}) \bmod q_{[0]}}{q_{[0]}}
|
2335 |
&
|
2336 |
\end{eqnarray}
|
2337 |
|
2338 |
Note several things about the implementation suggested by
|
2339 |
(\ref{eq:ex:ccil0:sidv0:sldm0:01:011}):
|
2340 |
|
2341 |
\begin{itemize}
|
2342 |
\item No addition or multiplication is required to calculate terms such as
|
2343 |
$2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}$. The high-order byte of the
|
2344 |
large dividend can be stuffed with $p_{[3]} \bmod q_{[0]}$ and
|
2345 |
the low-order byte with $p_{[2]}$.
|
2346 |
\item No addition or multiplication is required to calculate the
|
2347 |
result $\lfloor p/q \rfloor$.
|
2348 |
Note in (\ref{eq:ex:ccil0:sidv0:sldm0:01:011}) that the results are
|
2349 |
conveniently grouped as bytes with multipliers of $2^{24}$,
|
2350 |
$2^{16}$, $2^8$, and $2^0=1$. The terms can simply be placed into
|
2351 |
the appropriate byte, as a way of multplication by the appropriate
|
2352 |
power of 2. Note also that each term is guaranteed to be
|
2353 |
$\in \{0, 1, 2, \ldots{} , 255\}$, by the argument presented
|
2354 |
earlier for (\ref{eq:ccil0:sidv0:sldm0:004}). Thus, the
|
2355 |
addition will result in no carries, and each result byte can simply
|
2356 |
be placed directly in the correct memory location---addition is
|
2357 |
not necessary.
|
2358 |
\item Four machine division instructions are required, and the remainder
|
2359 |
is produced automatically by the fourth instruction.
|
2360 |
\end{itemize}
|
2361 |
|
2362 |
An implemenation for the TMS370C8 is supplied as Figure
|
2363 |
\ref{fig:ex:ccil0:sidv0:sldm0:01:01}. A block diagram of the data
|
2364 |
flow for this implementation is supplied as
|
2365 |
Figure \ref{fig:ex:ccil0:sidv0:sldm0:01:02}.
|
2366 |
\end{vworkexampleparsection}
|
2367 |
\vworkexamplefooter{}
|
2368 |
|
2369 |
\begin{figure}
|
2370 |
\begin{verbatim}
|
2371 |
;Assume that byte memory locations p3, p2, p1, and p0 contain the
|
2372 |
;32-bit unsigned dividend, and byte q0 contains the 8-bit unsigned
|
2373 |
;divisor. Assume also that the result quotient will be placed
|
2374 |
;in byte memory locations d3, d2, d1, and d0; and that the
|
2375 |
;remainder will be placed in the byte memory location r0. Further
|
2376 |
;assume that all memory locations are in the register file (near).
|
2377 |
CLR A ;High-order chunk of large divisor
|
2378 |
;must be 0.
|
2379 |
MOV p3, B ;Load the low-order chunk of divisor.
|
2380 |
DIV q0, A ;Perform the first division.
|
2381 |
MOV A, d3 ;Quotient becomes this part of the
|
2382 |
;result.
|
2383 |
MOV B, A ;Remainder becomes high-order chunk of
|
2384 |
;next division.
|
2385 |
MOV p2, B ;Next byte becomes low-order chunk.
|
2386 |
DIV q0, A ;Do the second division.
|
2387 |
MOV A, d2 ;Quotient becomes this part of the
|
2388 |
;result.
|
2389 |
MOV B, A ;Remainder becomes high-order chunk of
|
2390 |
;next division.
|
2391 |
MOV p1, B ;Next byte becomes low-order chunk.
|
2392 |
DIV q0, A ;Do the third division.
|
2393 |
MOV A, d1 ;Quotient becomes this part of the
|
2394 |
;result.
|
2395 |
MOV B, A ;Remainder becomes high-order chunk of
|
2396 |
;next division.
|
2397 |
MOV p0, B ;Next byte becomes low-order chunk.
|
2398 |
DIV q0, A ;Do the fourth division.
|
2399 |
MOV A, d0 ;Quotient becomes this part of the
|
2400 |
;result.
|
2401 |
MOV B, r0 ;This is the remainder, which could be used
|
2402 |
;for rounding.
|
2403 |
\end{verbatim}
|
2404 |
\caption{TMS370C8 Code Snippet Illustrating Unsigned 32/8
|
2405 |
Division Using Unsigned 16/8
|
2406 |
Machine Instructions (Example \ref{ex:ccil0:sidv0:sldm0:01})}
|
2407 |
\label{fig:ex:ccil0:sidv0:sldm0:01:01}
|
2408 |
\end{figure}
|
2409 |
|
2410 |
\begin{figure}
|
2411 |
\centering
|
2412 |
\includegraphics[width=4.6in]{c_cil0/t370dmp.eps}
|
2413 |
\caption{Block Diagram Of Data Flow Of Figure \ref{fig:ex:ccil0:sidv0:sldm0:01:01}}
|
2414 |
\label{fig:ex:ccil0:sidv0:sldm0:01:02}
|
2415 |
\end{figure}
|
2416 |
|
2417 |
|
2418 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2419 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2420 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2421 |
\section{Miscellaneous Integer Mappings}
|
2422 |
%Section tag: MIM0
|
2423 |
\label{ccil0:smim0}
|
2424 |
|
2425 |
Embedded system work and ROM constraints often inspire a great deal
|
2426 |
of cleverness in the selection of instructions to perform mappings or
|
2427 |
tests. In this section, we discuss integer mappings (i.e. functions)
|
2428 |
for which economical implementations are known; and in the next section
|
2429 |
(Section \ref{ccil0:smit0})
|
2430 |
we discuss integer tests for which economical implementations are known.
|
2431 |
|
2432 |
To the best of our knowledge, there is no way to derive these mappings
|
2433 |
and tests---they have been collected from many software developers and
|
2434 |
come from human intuition and experience.
|
2435 |
|
2436 |
|
2437 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2438 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2439 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2440 |
\subsection{Lowest-Order Bit}
|
2441 |
%Subsection tag: LIB0
|
2442 |
\label{ccil0:smim0:slib0}
|
2443 |
|
2444 |
\index{lowest-order bit}
|
2445 |
\index{least significant bit}
|
2446 |
|
2447 |
The mapping
|
2448 |
|
2449 |
\texttt{mask = x \& -x}
|
2450 |
|
2451 |
\noindent{}is the most economical way known to extract the
|
2452 |
lowest-order bit set in an integer \texttt{x}, or
|
2453 |
0 if no bits are set.\footnote{This mapping was contributed by
|
2454 |
David Baker (\texttt{bakerda@engin.umich.edu})
|
2455 |
and Raul Selgado (\texttt{rselgado@visteon.com}).} Since most processors have an instruction to form the
|
2456 |
two's complement of an integer, this mapping usually requires only
|
2457 |
two arithmetic instructions.
|
2458 |
|
2459 |
When implementing this mapping in assembly-language on processors without a
|
2460 |
two's complement instruction, two other possible implementations are:
|
2461 |
|
2462 |
\begin{itemize}
|
2463 |
\item \texttt{mask = x \& ($\sim$x + 1)}
|
2464 |
\item \texttt{mask = x \& ((x \^{ } -1) + 1)}
|
2465 |
\end{itemize}
|
2466 |
|
2467 |
|
2468 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2469 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2470 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2471 |
\section{Miscellaneous Integer Tests}
|
2472 |
%Section tag: MIT0
|
2473 |
\label{ccil0:smit0}
|
2474 |
|
2475 |
\subsection{Power Of 2}
|
2476 |
%Subsection tag: PTW0
|
2477 |
\label{ccil0:smit0:sptw0}
|
2478 |
|
2479 |
\index{power of two}
|
2480 |
\index{2N@$2^N$}
|
2481 |
|
2482 |
The test
|
2483 |
|
2484 |
\texttt{(x \& (x-1) == 0) \&\& (x != 0)}
|
2485 |
|
2486 |
\noindent{}is the most economical way known to
|
2487 |
test whether an integer is a positive power of two
|
2488 |
(1, 2, 4, 8, 16, etc.).\footnote{The test appeared as part of
|
2489 |
a discussion on
|
2490 |
the GMP mailing list in 2002.}
|
2491 |
|
2492 |
|
2493 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2494 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2495 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2496 |
\section{Exercises}
|
2497 |
|
2498 |
\begin{vworkexercisestatement}
|
2499 |
\label{exe:ccil0:sexe0:01}
|
2500 |
Show that any $m$-bit two's complement integer $u_{[m-1:0]}$ except
|
2501 |
$-2^{m-1}$ can be negated by forming the one's complement, then adding one.
|
2502 |
\end{vworkexercisestatement}
|
2503 |
|
2504 |
|
2505 |
|
2506 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2507 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2508 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2509 |
\vfill
|
2510 |
\noindent\begin{figure}[!b]
|
2511 |
\noindent\rule[-0.25in]{\textwidth}{1pt}
|
2512 |
\begin{tiny}
|
2513 |
\begin{verbatim}
|
2514 |
$RCSfile: c_cil0.tex,v $
|
2515 |
$Source: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_cil0/c_cil0.tex,v $
|
2516 |
$Revision: 1.24 $
|
2517 |
$Author: dtashley $
|
2518 |
$Date: 2003/11/03 02:14:24 $
|
2519 |
\end{verbatim}
|
2520 |
\end{tiny}
|
2521 |
\noindent\rule[0.25in]{\textwidth}{1pt}
|
2522 |
\end{figure}
|
2523 |
|
2524 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2525 |
% $Log: c_cil0.tex,v $
|
2526 |
% Revision 1.24 2003/11/03 02:14:24 dtashley
|
2527 |
% All duplicate labels as flagged by LaTeX removed. Additional files added
|
2528 |
% to Microsoft Visual Studio edit context.
|
2529 |
%
|
2530 |
% Revision 1.23 2002/08/26 17:57:03 dtashley
|
2531 |
% Additional solutions chapter added. Precautionary checkin to be sure
|
2532 |
% that I've captured all changes.
|
2533 |
%
|
2534 |
% Revision 1.22 2002/08/25 13:18:21 dtashley
|
2535 |
% Edits.
|
2536 |
%
|
2537 |
% Revision 1.21 2002/08/22 00:33:33 dtashley
|
2538 |
% Have made aesthetic changes in CFRY0 and CCFR0. Checking in all before
|
2539 |
% rebuild of book.
|
2540 |
%
|
2541 |
% Revision 1.20 2002/08/21 09:12:11 dtashley
|
2542 |
% Safety checkin.
|
2543 |
%
|
2544 |
% Revision 1.19 2002/08/19 05:06:45 dtashley
|
2545 |
% Substantial progress in integer numerics chapter. Preparing to
|
2546 |
% work at home.
|
2547 |
%
|
2548 |
% Revision 1.18 2002/08/10 07:34:48 dtashley
|
2549 |
% Checkin before resuming work on a lemma at home.
|
2550 |
%
|
2551 |
% Revision 1.17 2002/08/09 03:13:42 dtashley
|
2552 |
% Significant lemma proved, and other progress.
|
2553 |
%
|
2554 |
% Revision 1.16 2002/08/06 22:15:24 dtashley
|
2555 |
% Substantial lemma proof progress.
|
2556 |
%
|
2557 |
% Revision 1.15 2002/08/05 01:28:33 dtashley
|
2558 |
% Lemma demonstrating that 0 \leq \hat{q}-q \leq 2 completed.
|
2559 |
%
|
2560 |
% Revision 1.14 2002/08/03 23:04:57 dtashley
|
2561 |
% Safety checkin. Having difficulty: may have solved the wrong
|
2562 |
% problem.
|
2563 |
%
|
2564 |
% Revision 1.13 2002/08/01 01:31:24 dtashley
|
2565 |
% Safety checkin. Having difficulty completing an alternate version of
|
2566 |
% Knuth's proof about the accuracy of quotient estimates based on first
|
2567 |
% digits of dividend and divisor.
|
2568 |
%
|
2569 |
% Revision 1.12 2002/07/31 04:38:31 dtashley
|
2570 |
% Edits to basic integer algorithms chapter, safety checkin.
|
2571 |
%
|
2572 |
% Revision 1.11 2002/07/29 16:30:08 dtashley
|
2573 |
% Safety checkin before moving work back to WSU server Kalman.
|
2574 |
%
|
2575 |
% Revision 1.10 2002/07/26 20:39:43 dtashley
|
2576 |
% Safety checkin.
|
2577 |
%
|
2578 |
% Revision 1.9 2002/07/26 14:58:01 dtashley
|
2579 |
% Safety checkin.
|
2580 |
%
|
2581 |
% Revision 1.8 2002/07/21 16:19:28 dtashley
|
2582 |
% Finalization of material about integer division when dividend is
|
2583 |
% long but divisor is same as data size that machine can use as
|
2584 |
% divisor natively.
|
2585 |
%
|
2586 |
% Revision 1.7 2002/07/20 23:01:45 dtashley
|
2587 |
% Adding material about division with large dividend and machine-native
|
2588 |
% divisor.
|
2589 |
%
|
2590 |
% Revision 1.6 2002/06/11 04:34:19 dtashley
|
2591 |
% Information for David Baker added.
|
2592 |
%
|
2593 |
% Revision 1.5 2002/06/08 05:50:25 dtashley
|
2594 |
% Added missing tilde. Can't get it to be same size as other
|
2595 |
% characters--need to research that.
|
2596 |
%
|
2597 |
% Revision 1.4 2002/06/07 02:08:32 dtashley
|
2598 |
% Section added for integer mappings and tests. Mapping for lowest-order
|
2599 |
% bit set from Raul Selgado and Dave (last name presently unknown)
|
2600 |
% at Visteon added. Test for power of 2 added.
|
2601 |
%
|
2602 |
% Revision 1.3 2001/08/31 23:11:17 dtashley
|
2603 |
% End of August 2001 safety check-in.
|
2604 |
%
|
2605 |
% Revision 1.2 2001/08/27 20:06:08 dtashley
|
2606 |
% Edits and substantial re-organization.
|
2607 |
%
|
2608 |
% Revision 1.1 2001/08/25 22:51:25 dtashley
|
2609 |
% Complex re-organization of book.
|
2610 |
%
|
2611 |
%End of file C_CIL0.TEX
|