Addition & Subtraction
- 2진수에서 더하기는 Carry(올림수)가 발생
- 빼기는 뒤의 수를 음수취급하여 더함
- MSB(Most Significand Bit)가 1일때, 음수를 취급하는 signed num 때문에 Overflow 발생
Overflow (A + B)
- 두 수가 양수인데 더해서 MSB가 1이 되어 음수가 된 경우 (본래는 결과가 양수)
- A는 양수, B는 음수인데 A - B의 상황이라 MSB가 1이 되어 음수가 된 경우 (본래는 결과가 양수)
- A는 음수, B는 양수인데 A - B의 상황이라 MSB가 0이 되어 양수가 된 경우 (본래는 결과가 음수)
- 두 수가 음수인데 더해서 MSB가 0이 되어 양수가 된 경우 (본래는 결과가 음수)
Multiplication
- Multiplicand(피승수), Multiplier(승수)를 곱해 Product(곱하기결과)
First version of the multiplication HW
원리 설명
1. Multiplier의 LSB(제일 오른쪽)에서 하나를 꺼냄
1-a. 1이면 Multiplicand를 그대로 내려 product와 더함
1-b. 0이면 버림
2. Multiplicand를 왼쪽으로 shift(자리수 올림)
3. Multiplier를 오른쪽으로 shift(아까 1의 과정에서 LSB를 썼으므로 버림)
4. 32번까지 반복했으면 끝
Refind version of the multiplication HW
- 기존은 64-bit ALU, 64bits Multiplicand, 추가적인 Multiplier을 사용했음
- 32-bit ALU, 32bits Multiplicand로 줄이고, Multiplier을 Product 레지스터에 통합
- Multiplier를 Product의 절반인 32bit에 초기화함으로써, 추가적인 레지스터를 낭비하지 않음
Faster versio nof the multiplication HW
원리 설명
- 계산된 결과를 재활용하며 불러오기에 좀 더 빨라짐
- 하지만 ALU가 많이 사용되어 비쌈
- 나눗셈에는 적용할 수가 없음 (숫자를 빌려빼야하는지, 아닌지 구분을 못함)
Multiply in MIPS
- 32bit × 32bit = 64bit이므로 결과를 2개의 레지스터에 나눠 저장 (Hi, Lo 비트)
mult rs, rt
, multu rs, rt
를 하게되면 MSB는 Hi 레지스터에, LSB는 Lo 레지스터에 저장
mfhi rd
를 통해 MSB에 해당하는 레지스터의 값을 가져옴 (move from high)
mflo rd
를 통해 LSB에 해당하는 레지스터의 값을 가져옴 (move from low)
mul rd, rs, rt
를 통해 rs 와 rd를 곱한 값의 LSB 32bit를 rd에 저장
Division
- Dividend(피제수) = Divisor(제수) × Quotient(몫) + Remainder(나머지)
First version of the division HW
원리 설명
초기화: Remainder를 Dividend의 값으로, Quotient를 0으로 초기화, Divisor은 64bit중 절반의 MSB 왼쪽에 32bit저장
1. Remainder에서 Divisor을 뺀다
1-a. Remainder가 양수면 Quotient를 shift left하고 Qoutiont의 LSB에 1을 저장
1-b. Remainder가 음수면 Quotient를 shift left하고 Qoutiont의 LSB에 0을 저장후 다시 Divisor을 더해서 restore
2. Divisor을 shift right
3. 33번 반복했으면 끝
↑ 0000 0111(7) ÷ 0010 (2)의 예시, divisor이 0010 0000인 이유는 절반을 MSB인 왼쪽에 저장하는 규칙을 따랐기 때문
Refind version of the division HW
- 기존은 64-bit ALU, 64bits Divisor, 추가적인 Dividend를 사용했음
- 32-bit ALU, 32bits Divisor 줄이고, Dividend를 Remainder 레지스터에 통합, 또한 Quotient도 Remainder에 통합
- Multiplier를 Product의 절반인 32bit에 초기화함으로써, 추가적인 레지스터를 낭비하지 않음
원리 설명
- First version에서는 Divisor를 shift right하며 계산하지만, 여기서는 Divisor가 유지
- 제일 처음 몫은 0이라 가정하고 Remainder를 shift left 한 번 하고 시작
- Remainder의 MSB방향 32비트에 Dividend를 저장
- Dividend(Remainder)에서 Divisor을 뺀다.
1-a. Remainder가 양수면 Remainder shift left하고 LSB에 1을 저장
1-b. Remainder가 음수면 Reminader에 Divisor을 더해 복구하고, shift left하고 LSB에 0을 저장
- 연산이 진행되는 매 과정마다 Remainder은 shift left가 됨
- 그래서 Dividend가 한자리씩 감소하므로 이는 Divisor가 shift right되는 효과와 같음
- Remainder의 MSB방향 32비트는 처음에 Dividend가 저장되었다가 계속 연산될수록 빼지므로 나머지가 저장
- Remainder의 LSB방향 32비트는 처음에 0이 저장되었다가 계속 연산될수록 Qoutient가 저장되므로 몫이 저장
Faster version of the division HW
- Multiplication은 Faster version이 가능하지만, Division은 이전의 숫자가 무엇이 올지 모르므로 값을 예측할 수 없음
- SRT division으로 Quotient를 한번에 두자리씩 예측하는 알고리즘이 있지만, 이 또한 예측이므로 정확하지 않음
Division in MIPS
- Remainder가 64bit이므로 결과를 2개의 레지스터에 나눠 저장 (Hi, Lo 비트)
div rs, rt
, divu rs, rt
를 하게되면 rs mod rd는 Hi 레지스터에, rs / rt는 Lo 레지스터에 저장
mfhi rd
를 통해 나머지에 해당하는 레지스터의 값을 가져옴 (move from high)
mflo rd
를 통해 몫에 해당하는 레지스터의 값을 가져옴 (move from low)
Instruction 정리