Assignment 8, Solutions
Part of
the homework for 22C:60, Fall 2009
|
This circuit is well documented. The Wikipedia page for it has links to manufacturer's data sheets, which you will need to examine to solve this problem.
A Problem: Give the values of the inputs S0, S1, S2, S3 and M that must be given to make this circuit compute the arithmetic sum of inputs Ai and Bi, assuming that these use positive logic (where high value represent ones and low values represent zeros). (1.0 points)
S3 S2 S1 S0, M = H L L H, L = 1 0 0 1, 0
multlong( ier, icand ) { -- given ier and icand, 32-bit values -- returns prod, a 64-bit value -- internally, prodh is the high half of prod, -- and prodl is the low half of prod, prodh = 0 prodl = ier repeat 32 times { if prodl is odd { prodh = prodh + icand } shift prod one place right } return prod }
Assignment: Write a SMAL Hawk subroutine MULTLONG that implements the above algorithm. It should take the multiplier and multiplicand in R3 and R4 and it should return the low half of the product in R3 and the high half in R4. (1.0 points)
Note: This is not big code. You are not asked for a full working program, no main program, just the subroutine. You are not asked for optimal code. The only really interesting part of the problem is the 64-bit right shift, and that is discussed in the lecture notes for the current chapter, as well as in the Hawk manual, which you should be reasonably familiar with by now.
MULTLONG: ; given R3 = multiplier (ier) ; given R4 = multiplicand (icand) ; returns R3 = low half of unsigned product (prodl) ; returns R4 = high half of unsigned product (prodh) MOVE R5,R4 ; save icand LIS R4,0 ; prodh = 0 -- note, prodl = ier LIS R6,32 MULTLP: ; for (i = 32; i > 0; i--) { BITTEST R3,0 BCR MULTEI ; if prodl is odd { ADD R4,R4,R5 ; prodh = prodh + icand MULTEI: ; } SRU R3,1 SRU R4,1 ADJUST R3,CMSB ; shift prod one place right ADDSI R6,-1 BZR MULTLP ; } JUMPS R1 ; return
; given R3, an integer to multiply by 210 ; note, 210 is 2 * 3 * 5 * 7, straightforward version SL R3,1 ; R3 times 2 ADDSL R3,R3,1 ; R3 times 3 ADDSL R3,R3,2 ; R3 times 5 NEG R1,R3 ; \ R3 times 7 ADDSL R3,R1,3 ; / ; given R3, an integer to multiply by 210 ; note, 210 is 11010010 in binary, straightforward version MOVE R1,R3 ; R1 -- 0 ADDSL R3,R1,1 ; R3 -- 11 ADDSL R3,R1,2 ; R3 -- 1101 ADDSL R3,R1,3 ; R3 -- 1101001 SL R3,1 ; R3 -- 11010010 ; given R3, an integer to multiply by 210 ; note, 210 is 11010010 in binary, optimized -- the winner MOVSL R1,R3,1 ; R1 -- 10 ADDSL R3,R1,2 ; R3 -- 110 ADDSL R3,R1,2 ; R3 -- 11010 ADDSL R3,R1,3 ; R3 -- 11010010