Computer Architecture Lab/WS2007/ZoWeAySi/Instruction Set II

Instruction Set II

edit

Features

edit
  • 32-bit RISC processor
  • Load/Store architecture
  • Harvard architecture
  • 32 32-bit general purpose registers
  • 32-bit instruction width
  • 4 pipeline stages
  • memory mapped IO

Registers

edit

GP Registers

edit

Our Processor has 32 GP registers:

  • $0 always zero
  • $1..30 arbitrary
  • $31 Stack Pointer

Flags

edit

Our Processor features 4 flags in the flag register:

  • CF .. Carry Flag
  • SF .. Sign Flag
  • ZF .. Zero Flag
  • OF .. Overflow Flag

Instruction Encoding

edit

Instruction Formats

edit

R-Type:

Opcode rt rd rs cc unused
6Bit 5Bit 5Bit 5Bit 4Bit 7Bit

I-Type:


Opcode cc/rt rd immediate
6Bit 5Bit 5Bit 16Bit

Conditions (cc)

edit
Encoding Condition cc Description
0000 (unused) none unused at I-Type, LSB(rt) at R-Type
0001  ZF NZ, NE if ZF is not set, if not Equal
0010  SF NS if SF is not set
0011  OF NO if OF is not set
0100  CF NC, AE if CF is not set, if Above or Equal (unsigned)
0101  (CF   ZF) A if Above (unsigned)
0110  (SF   OF) GE if Greater than or Equal (signed)
0111  ((SF   OF)   ZF) GT if Greater than (signed)
1000 true none true at I-Type, MSB(rt) at R-Type
1001 ZF ZF, EQ if ZF is set, if Equal
1010 SF SF if SF is set
1011 OF OF if OF is set
1100 CF CF, B if CF is set, if Below (unsigned)
1101 CF   ZF BE if Below or Equal (unsigned)
1110 SF   OF LT if Less Than (signed)
1111 (SF   OF)   ZF LE if Less than or Equal (signed)

Processor Instructions

edit

R-Type

edit
Instruction Semantics Flags Opcode rt rd rs cc Description
ADD rd rs rt rd := rs + rt ZF, SF, OF, CF 000000 rt rd rs 0000 Add
SUB rd rs rt rd := rs - rt ZF, SF, OF, CF 000001 rt rd rs 0000 Subtract
ADC rd rs rt rd := rs + rt + CF ZF, SF, OF, CF 000010 rt rd rs 0000 Add with carry
SBB rd rs rt rd := rs - rt - CF ZF, SF, OF, CF 000011 rt rd rs 0000 Subtract with borrow
INSccL rd rs rd := (rs<<1)+ cc ZF, SF, OF, CF 000100 rs rd rs cc Insert condition low
INSLL rd rs rt rd := (rs<<1)+ LSB(rt) ZF, SF, OF, CF 000100 rt rd rs 0000 Insert LSB low
INSML rd rs rt rd := (rs<<1)+ MSB(rt) ZF, SF, OF, CF 000100 rt rd rs 1000 Insert MSB low
INSccH rd rs rd := (rs>>1)+cc*2^31 ZF, SF, OF, CF 000110 $0 rd rs cc Insert condition high
INSLH rd rs rt rd := (rs>>1)+LSB(rt)2^31 ZF, SF, OF, CF 000110 rt rd rs 0000 Insert LSB high
INSMH rd rs rt rd := (rs>>1)+MSB(rt)2^31 ZF, SF, OF, CF 000110 rt rd rs 1000 Insert MSB high
AND rd rs rt rd := rs   rt ZF, SF 001000 rt rd rs 0000 And
ANDN rd rs rt rd := rs    rt ZF, SF 001001 rt rd rs 0000 And Not
XOR rd rs rt rd := rs   rt ZF, SF 001010 rt rd rs 0000 Xor
XORN rd rs rt rd := rs    rt ZF, SF 001011 rt rd rs 0000 Xor Not
OR rd rs rt rd := rs   rt ZF, SF 001100 rt rd rs 0000 Or
ORN rd rs rt rd := rs    rt ZF, SF 001101 rt rd rs 0000 Or Not
LD rd rt rd := [rt] none 010000 rt rd $0 0000 Load from Address
ST rt rs [rt] := rs none 010010 rt $0 rs 0000 Store to Address
MOVcc rd rs rt rd := (cc)? rs: rt none 010100 rt rd rs cc Move on Condition
JMP rs pc := rs none 011100 01000 $0 rs 0000 Jump indirect
Jcc rs pc := (cc)? rs: pc+4 none 011100 cc $0 rs 0000 Jump indirect if cc
JSR rs [sp]:=pc+4; pc:=rs none 011110 sp $0 rs 0000 Jump to Subroutine indirect

I-Type

edit
Instruction Semantics Flags Opcode rt/cc rd imm Description
IADD rd imm rt rd := imm + rt ZF, SF, OF, CF 100000 rt rd imm Immediate Add
ISUB rd imm rt rd := imm - rt ZF, SF, OF, CF 100001 rt rd imm Immediate Subtract
IADC rd imm rt rd := imm + rt + CF ZF, SF, OF, CF 100010 rt rd imm Immediate Add with carry
ISBB rd imm rt rd := imm - rt - CF ZF, SF, OF, CF 100011 rt rd imm Immediate Subtract with borrow
IAND rd imm rt rd := imm   rt ZF, SF 101000 rt rd imm Immediate And
IANDN rd imm rt rd := imm    rt ZF, SF 101001 rt rd imm Immediate And Not
IXOR rd imm rt rd := imm   rt ZF, SF 101010 rt rd imm Immediate Xor
IXORN rd imm rt rd := imm    rt ZF, SF 101011 rt rd imm Immediate Xor Not
IOR rd imm rt rd := imm   rt ZF, SF 101100 rt rd imm Immediate Or
IORN rd imm rt rd := imm    rt ZF, SF 101101 rt rd imm Immediate Or Not
LDI rd imm rd := [imm] none 110000 $0 rd imm Load from immediate Address
STI imm rt [imm] := rt none 110010 rt $0 imm Store to immediate Address
INSI rd imm rt rd := imm + (rt << 16) none 110100 rt rd imm Insert immediate into register
INSIN rd imm rt rd := imm + (~rt << 16) none 110101 rt rd imm Insert immediate into negated register
RET imm pc := [sp]; sp += imm none 111000 sp sp imm Return (and clean up stack)
JMP label pc := label none 111100 01000 $0 label Jump to target address
JMPcc label pc := (cc)? label: pc+4 none 111100 cc $0 label Jump to target address if cc
JSR label [sp]:=pc+4; pc:=label none 111110 sp $0 label Jump to Subroutine

Instruction Mappings

edit
Instruction Semantics Flags Mapping
CMP rs rt rs - rt ZF, SF, OF, CF SUB $0 rs rt
CMPI rt imm rt - imm ZF, SF, OF, CF IADD $0 -imm rt
ICMP imm rt imm - rt ZF, SF, OF, CF ISUB $0 imm rt
MOV rd rs rd := rs none MOVCF rd rs rs
NEG rd rt rd := -rt ZF, SF, OF, CF SUB rd $0 rt
NOP none MOVCF $1, $1, $1
NOT rd rs rd :=  rs ZF, SF XORN rd rs $0
RCL rd rs ZF, SF, OF, CF ADC rd rs rs
RCR rd rs ZF, SF, OF, CF INSCFH rd rs
RET pc := [sp]; sp += 4; none RET 4
ROL rd rs ZF, SF, OF, CF INSML rd rs rs
ROR rd rs ZF, SF, OF, CF INSLH rd rs rs
SAR rd rs rd := rs >>> 1 ZF, SF, OF, CF INSMH rd rs rs
SETcc rd rd := (cc)? 1: 0 ZF, SF, OF, CF INSccL rd $0
SHL rd rs rd := rs << 1 ZF, SF, OF, CF ADD rd rs rs
SHR rd rs rd := rs >> 1 ZF, SF, OF, CF INSMH rd rs $0
SUBI rd rt imm rd := rs - imm ZF, SF, OF, CF IADD rd -imm rt