arithmetic iv cpsc 321 andreas klappenecker. any questions?

31
Arithmetic IV CPSC 321 Andreas Klappenecker

Post on 20-Dec-2015

223 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Arithmetic IVCPSC 321

Andreas Klappenecker

Page 2: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Any Questions?

Page 3: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Today’s Menu

DivisionFloating Point Numbers

Page 4: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Recall: Multiplier

ControltestWrite

32 bits

64 bits

Shift rightProduct

Multiplicand

32-bit ALU

Done

1. TestProduct0

1a. Add multiplicand to the left half ofthe product and place the result inthe left half of the Product register

2. Shift the Product register right 1 bit

32nd repetition?

Start

Product0 = 0Product0 = 1

No: < 32 repetitions

Yes: 32 repetitions

Page 5: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

The Booth Multiplier

Let’s kick it up a notch!

Page 6: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Booth Multiplication

Current and previous bit

00: middle of run of 0s, no action01: end of a run of 1s, add multiplicand10: beginning of a run of 1s, subtract

mcnd11: middle of string of 1s, no action

Page 7: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Negative Numbers

00102 x 11012 = 1111 10102

0) Mcnd 0010 Prod 0000 1101,0

1) Mcnd 0010 Prod 1110 1101,0 sub

1) Mcnd 0010 Prod 1111 0110,1 >>

2) Mcnd 0010 Prod 0001 0110,1 add

2) Mcnd 0010 Prod 0000 1011,0 >>

3) Mcnd 0010 Prod 1110 1011,0 sub

3) Mcnd 0010 Prod 1111 0101,1 >>

4) Mcnd 0010 Prod 1111 0101,1 nop

4) Mcnd 0010 Prod 1111 1010,1 >>

Page 8: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Exercise

• Work through some examples1. Grade school algorithms2. Booth multiplication• Read Chapter 4• Really!

Page 9: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

MIPS Assembly Language

Multiplication of two 32 bit operands

x =

mult $a1, $s1 result is stored inmfhi $v0 special registersmflo $v1 high= 32 MSBs

low = 32 LSBs

high low

Page 10: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

MIPS Assembly Language

Integer division: divide a by b a = q b + r

quotient q = floor(a/b), remainder r = a % b

div $a0, $a1mflo $v0 # quotientmfhi $v1 # remainder

r qa b/ =

Page 11: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Exponentiation

Suppose you want to raise an integer b to the nth power:

(...((b*b)*b)...*b) = bn

Way too slow for large n!

Use square and multiply algorithm.

Page 12: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Square and Multiply

Power(x,n) =

x if n=1

Power(x2,n/2) if n even

x*Power(x2,(n-1)/2) if n odd

x6= (x2)3=x2 (x2)2

Page 13: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Division

Page 14: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Recall Decimal Division

Grammar school algorithm93:7= 137 2321 (trial multiplication, 3*7 works, 4*7

doesn’t)

2

-

-

Page 15: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Binary division

• Dividend = Quotient x Divisor + Remainder

• See how big a number can be subtracted

• Create a quotient bit (0 or 1) in each step

• Binary division is simpler than decimal division

Page 16: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Binary Division

00000111: 0010 = 11

-00100

0011

-0010

0001

7 = 3x2 + 1

Page 17: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Division Hardware (Version 1)

Page 18: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

rem = rem - div

if rem < 0 then

// divisor too big

rem = rem + div

quo <<= 1

LSB(quo) = 0

else

// can divide

quo <<= 1

LSB(quo) = 1

fi

div >>= 1

repeat unless done

Page 19: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

iteration

Step Quot Divisor Remainder

0 initial step 0000 0010 0000 0000 0111

1 rem -= div

rem<0 =>+div, Q<<=1, Q0=0

div >>= 1

0000 0000 0000

0010 0000 0010 0000 0001 0000

1110 0111 0000 0111 0000 0111

2 rem -= div

rem<0 =>+div, Q<<=1, Q0=0

div >>= 1

0000 0000 0000

0001 0000 0001 0000 0000 1000

1111 0111 0000 0111 0000 0111

3 rem -= div

rem<0 =>+div, Q<<=1, Q0=0 div >>= 1

0000 0000

0000

0000 1000 0000 1000 0000 0100

1111 1111 0000 0111 0000 0111

4 rem -= div

rem<0 => Q<<=1, Q0=1

div >>= 1

0001 00010001

0000 0100 0000 0100 0000 0010

0000 0011 0000 0011 0000 0011

5 rem -= div

rem<0 => Q<<=1, Q0=1

div >>= 1

0001 0011 0011

0000 0010 0000 0010 0000 0001

0000 0001 0000 0001 0000 0001

Page 20: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

• Half of the bits in divisor always 0• Half of adder and divisor register is wasted

• Instead of shifting divisor to the right, shift remainder to the left• Shift left first to save one iteration

Page 21: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Division hardware (Version 2)

ALU and divisor registers are reduced, remainder shifted left

Page 22: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

3b. Restore the original value by adding the Divisor register to the left half of the Remainder register, &place the sum in the left half of the Remainder register. Also shift the Quotient register to the left, setting the new least significant bit to 0.

Test Remainder

Remainder < 0Remainder > 0

2. Subtract the Divisor register from the left half of the Remainder register, & place the result in the left half of the Remainder register.

3a. Shift the Quotient register to the left setting the new rightmost bit to 1.

1. Shift the Remainder register left 1 bit.

Done

Yes: n repetitions (n = 4 here)

nthrepetition?

No: < n repetitions

Start: Place Dividend in Remainder

Page 23: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Observations (Divide Version 2)

•Eliminate quotient register => combine with remainder register

•Start by shifting the remainder left, as before. •After that, the loop will contain only two steps

(because remainder register shifts both remainder and quotient)

•Remainder will now be shifted left one time too many.•Thus, a final correction step must shift back only the

remainder in the left half of the register

Page 24: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

rem <<= 1

rem -= (div >> 32)

if rem < 0 then

rem += (div >> 32)

rem <<= 1

LSB(rem) = 0

else

rem <<= 1

LSB(rem) = 1

fi

repeat unless done

Correct remainder

Version 3

Page 25: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Floating Point Numbers

Page 26: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

IEEE 754 Floating Point Representation

• Float – 1 sign bit, 8 exponent bits, 23 bits for significand.

seeeeeeeefffffffffffffffffffffffvalue = (-1)s x F x 2E-127

with F= 1 + .ffffffff .... fff

• Double – 1 sign bit, 11 exponent bits, 52 bits for significand

Page 27: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Floating Point Representation: double

• 1 bit sign, 11 bits for exponent, 52 bits for significand

• seeeeeeeeeeeffffffffffffffffffff ffffffffffffffffffffffffffffffff

Range of float: 2.0 x 10-38 … 2.0 x 1038

Range of double: 2.0 x 10-308 … 2.0 x 10308

Page 28: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Integer and Floating Point Arithmetic

instructionmemory

PC

integerregister

file

integerALU

integermultiplier

datamemory

flt ptregister

file

flt ptadder

flt ptmultiplier

HILO

Page 29: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Floating Point Registers in MIPS

• $f0 - $f3 function-returned values• $f4 - $f11 temporary values• $f12 - $f15 function arguments• $f16 - $f19 temporary values• $f20 - $f31 saved valuesInterpretation: 32 registers of 32 bits or

16 registers of 64 bits (even indices)

Page 30: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Floating Point in MIPS

.data

Pi: .double 3.14159

Rad: .double 12.34567

.text

main: l.d $f0, Pi # $f0 = Pi; load double

l.d $f4, Rad # $f4 = radius

mul.d $f12, $f4, $f4 # $f12 = radius squared

mul.d $f12, $f12, $f0 # multiply by Pi

li $v0, 3 # print double $f12

syscall # (= print the area)

li $v0, 10 #

syscall # exit

Page 31: Arithmetic IV CPSC 321 Andreas Klappenecker. Any Questions?

Conclusion

• We learned how to divide• Make sure that you work through some

examples• Read the section on floating point addition and

multiplication in Chapter 4 (What are the challenges here?)• To probe further: Knuth’s “Art of Computer Programming”

contains numerous MIX assembly language programs; you can get involved into the translation to MMIX.