ULM Generator: ALU Interface
ALU Interface
#ifndef ULM0_HDWALU_H
#define ULM0_HDWALU_H
#include <stdbool.h>
#include <stdint.h>
// ALU
typedef uint64_t ulm_Reg;
enum
{
ULM_ZF = 0,
ULM_CF,
ULM_SF,
ULM_OF,
ULM_NUM_STATUS_FLAGS,
};
extern bool ulm_statusReg[ULM_NUM_STATUS_FLAGS];
uint64_t ulm_regVal(ulm_Reg reg);
void ulm_setReg(uint64_t val, ulm_Reg reg);
void ulm_add64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_sub64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_mul64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_mul128(uint64_t a, uint64_t b, ulm_Reg dest0, ulm_Reg dest1);
void ulm_div128(uint64_t a, uint64_t b0, uint64_t b1, ulm_Reg dest0,
ulm_Reg dest1, ulm_Reg dest2);
void ulm_idiv64(int64_t a, int64_t b, ulm_Reg dest);
void ulm_shiftLeft64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_shiftRightSigned64(uint64_t a, int64_t b, ulm_Reg dest);
void ulm_shiftRightUnsigned64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_and64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_or64(uint64_t a, uint64_t b, ulm_Reg dest);
void ulm_not64(uint64_t a, ulm_Reg dest);
#endif // ULM0_HDWALU_H
Register Content
1 | uint64_t ulm_regVal(ulm_Reg reg);
|
For a given pattern \(\text{reg}\) returns \(\%\text{reg}\).
Register Initialization
1 | void ulm_setReg(uint64_t val, ulm_Reg reg);
|
Initializes register: \(u(\text{val}) \to u(\%\text{reg})\)
Integer Addition
1 | void ulm_add64(uint64_t a, uint64_t b, ulm_Reg dest);
|
Computes \(\left(u(\text{a}) + u(\text{b})\right) \bmod 2^{64} \to \%\text{dest}\) and updates the status registers:
Flag |
Condition |
ZF |
\(\left(u(\text{a}) + u(\text{b})\right) \bmod 2^{64} = 0\) |
CF |
\(u(\text{a}) + u(\text{b}) \geq 2^{64}\) |
OF |
\(s(\text{a}) + s(\text{b}) \notin \{-2^{63},\dots,2^{63}-1\}\) |
SF |
\(s(\text{a}) + s(\text{b}) < 0\) |
Integer Subtraction
1 | void ulm_sub64(uint64_t a, uint64_t b, ulm_Reg dest);
|
Computes \(\left(-u(\text{a}) + u(\text{b})\right) \bmod 2^{64} \to \%\text{dest}\) (read as subtract a from b) and updates the status registers:
Flag |
Condition |
ZF |
\(\left(-u(\text{a}) + u(\text{b})\right) \bmod 2^{64} = 0\) |
CF |
\(u(-\text{a}) + u(\text{b}) \geq 2^{64}\) |
OF |
\(s(-\text{a}) + s(\text{b}) \notin \{-2^{63},\dots,2^{63}-1\}\) |
SF |
\(-s(\text{a}) + s(\text{b}) < 0\) |
(Signed) Integer Multiplication
1 | void ulm_mul64(uint64_t a, uint64_t b, ulm_Reg dest);
|
Computes \(\left(u(\text{a}) \cdot u(\text{b})\right) \bmod 2^{64} \to \%\text{dest}\) (read as subtract a from b) and updates the following status registers:
Flag |
Condition |
CF |
\(\left(u(\text{a}) \cdot u(\text{b})\right) \bmod 2^{64} \neq u(\text{a}) \cdot u(\text{b})\) |
OF |
\(\left(s(\text{a}) \cdot s(\text{b})\right) \bmod 2^{64} \neq s(\text{a}) \cdot s(\text{b})\) |
Exercise
The following program is supposed to compute \((42-1) \cdot 13\) and then terminate with the result as exit code:
1 2 3 4 5 6 | 03 00 2A 01
03 00 01 02
06 02 01 02
03 00 0D 01
07 01 02 01
01 01 12 34
|
Use the ULM Generator to build a computer where this program actually does that.
Submit your description isa.txt of the instruction set with submit hpc quiz06 isa.txt.