Q1.

Figure A.29 (Page A-42) 
- CPI: Cycles Per Instruction
1. Find the average frequencies of astar, gobmk, and sjeng:
Loads:
Stores:
Branches:
Jumps:
ALU operations:
Since 80% of branches are taken and 20% are not taken:
Taken branches:
Not taken branches:
Other instructions:
2. Multiply each frequency by its corresponding CPI:
ALU operations:
Loads:
Stores:
Branches:
Taken:
Not taken:
Jumps:
Other instructions:
3. Sum to get Effective CPI
- On average, each instruction in this processor implementation takes 2.25 clock cycles to complete, given this particular instruction mix and specified CPI values for each instruction type.
Q.2

- A, B, C, D, E, and F reside in memory
- Instruction operation codes are represented in 5 bits
- Memory addresses are 48 bits
- Data size is 32 bits
- Register addresses are 3 bits
a.
Figure A.2 
Stack Architecture
Push A
- 1 memory address
- Operation code: 5 bits
- Memory address A: 48 bits
- Data size: 32 bits
Push B
- 1 memory address
- Operation code: 5 bits
- Data size: 32 bits
Add
- 0 memory addresses
- Operation code: 5 bits
Pop F
- 1 memory address
- Operation code: 5 bits
- Memory address F: 48 bits
- Data size: 32 bits
Total code size for stack architecture:
Accumulator
Load A
- 1 memory address
- Operation code: 5 bits
- Memory address A: 48 bits
- Data size: 32 bits
Add B
- 1 memory address
- Operation code: 5 bits
- Memory address B: 48 bits
- Data size: 32 bits
Store F
- 1 memory address
- Operation code: 5 bits
- Memory address F: 48 bits
- Data size: 32 bits
Total code size for accumulator architecture:
Register (register-memory)
Load R1, A
- 1 memory address
- 1 register address
- Operation code: 5 bits
- Memory address A: 48 bits
- Register address R1: 3 bits
- Data size: 32 bits
Add R3, R1, B
- 1 memory address
- 2 register address
- Operation code: 5 bits
- Memory address B: 48 bits
- Register address R3: 3 bits
- Register address R1: 3 bits
- Data size: 32 bits
Store R3, F
- 1 memory address
- 1 register address
- Operation code: 5 bits
- Memory address F: 48 bits
- Register address R3: 3 bits
- Data size: 32 bits
Total code size for register-memory architecture:
Register (load-store)
Load R1, A
- 1 memory address
- 1 register address
- Operation code: 5 bits
- Memory address A: 48 bits
- Register address R1: 3 bits
- Data size: 32 bits
Load R2, B
- 1 memory address
- 1 register address
- Operation code: 5 bits
- Memory address B: 48 bits
- Register address R2: 3 bits
- Data size: 32 bits
Add R3, R1, R2
- 3 register address
- Operation code: 5 bits
- Register address R1: 3 bits
- Register address R2: 3 bits
- Register address R3: 3 bits
- Data size: 32 bits
Store R3, F
- 1 memory address
- 1 register address
- Operation code: 5 bits
- Memory address F: 48 bits
- Register address R3: 3 bits
- Data size: 32 bits
Total code size for load-store architecture:
b.
Stack Architecture
Push A
Push B
Add ; A and B destroyed
Store F ; Save F to memory, pop result
Push A ; Load A again (overhead)
Push C
Add ; A and C destroyed
Store D ; Save D to memory
Load F ; Push F back onto stack (overhead)
Load D ; Push D onto stack (overhead)
Add ; D and F are destroyed
Store E - Total code size:
Push A → 5 + 48 = 53 bits
Push B → 5 + 48 = 53 bits
Add → 5 bits
Store F → 5 + 48 = 53 bits
Push A → 5 + 48 = 53 bits
Push C → 5 + 48 = 53 bits
Add → 5 bits
Store D → 5 + 48 = 53 bits
Load F → 5 + 48 = 53 bits
Load D → 5 + 48 = 53 bits
Add → 5 bits
Store E → 5 + 48 = 53 bits - Total instruction fetches
Total Instructions: 12
Overhead Instructions: 3
- Push A (2nd time)
- Load F
- Load D
Bytes of instructions and data moved to/from memory:
- Loads
- Stores
- Total data moved:
- Total instruction fetches
- Total memory traffic
- Loads
Overhead data bytes:
Accumulator Architecture
Load A
Add B ; A destroyed
Store F ; Save F to memory
Load A ; Load A again (overhead)
Add C ; A destroyed
Store D ; Save D to memory
Load D ;
Add F ; D is destroyed
Store E - Total code size:
Load A → 5 + 48 = 53 bits
Add B → 5 + 48 = 53 bits
Store F → 5 + 48 = 53 bits
Load A → 5 + 48 = 53 bits
Add C → 5 + 48 = 53 bits
Store D → 5 + 48 = 53 bits
Load D → 5 + 48 = 53 bits
Add F → 5 + 48 = 53 bits
Store E → 5 + 48 = 53 bits Total code size
Total Instructions: 9
Overhead Instructions: 1
- Load A
Bytes of instructions and data moved to/from memory:
- Loads
- Stores
- Total data moved:
- Total instruction fetches
- Total memory traffic
- Loads
Overhead data bytes:
Register (register-memory) Architecture
Load R1, A ; R1 = A
Add R3, R1, B ; R3 = R1 + B
Store R3, F ; Save F
Add R3, R1, C ; R3 = R1 + C
Store R3, D ; Save D
Load R1, D
Add R3, R1, F ; R3 = R1 + F
Store R3, E ; Save E - Total code size:
Load R1, A → 5 + 3 + 48 = 56 bits
Add R3, R1, B → 5 + 3 + 3 + 48 = 59 bits
Store R3, F → 5 + 3 + 48 = 56 bits
Add R3, R1, C → 5 + 3 + 3 + 48 = 59 bits
Store R3, D → 5 + 3 + 48 = 56 bits
Load R1, D → 5 + 3 + 48 = 56 bits
Add R3, R1, F → 5 + 3 + 3 + 48 = 59 bits
Store R3, E → 5 + 3 + 48 = 56 bits Total Instructions: 7
Overhead Instructions: 0
Bytes of instructions and data moved to/from memory:
- Loads
- Stores
- Total data moved:
- Total instruction fetches
- Total memory traffic
- Loads
Overhead data bytes: 0 bytes
Register (load-store) Architecture
Load R1, A ; R1 = A
Load R2, B ; R2 = B
Add R3, R1, R2 ; R3 = R1 + R2
Store R3, F
Load R2, C ; R2 = C
Add R3, R1, R2 ; R3 = R1 + R2
Store R3, D ; Save D
Load R1, D
Load R2, F
Add R3, R1, R2 ; R3 = R1 + R2
Store R3, E ; Save E - Total code size:
Load R1, A → 5 + 3 + 48 = 56 bits
Load R2, B → 5 + 3 + 48 = 56 bits
Add R3, R1, R2 → 5 + 3 + 3 + 3 = 14 bits
Store R3, F → 5 + 3 + 48 = 56 bits
Load R2, C → 5 + 3 + 48 = 56 bits
Add R3, R1, R2 → 5 + 3 + 3 + 3 = 14 bits
Store R3, D → 5 + 3 + 48 = 56 bits
Load R1, D → 5 + 3 + 48 = 56 bits
Load R2, F → 5 + 3 + 48 = 56 bits
Add R3, R1, R2 → 5 + 3 + 3 + 3 = 14 bits
Store R3, E → 5 + 3 + 48 = 56 bits Total Instructions: 11
Overhead Instructions: 0
Bytes of instructions and data moved to/from memory:
- Loads
- Stores
- Total data moved:
- Total instruction fetches
- Total memory traffic
- Loads
Overhead data bytes: 0 bytes