Komplexne instrukcie sme uz rozoberali, ale teda, aspon vieme, ze to su instrukcie, ktore mozu byt zlozene z viacerych "jendnoduchych" instrukcii.
V tabulke vidime par mikroinstrukcii a jednotlive "ukony", ktore su vykonavane v jednotlivych stage-och pipeline. My uz teda mame navrhnutu nejaku pipeline a vidime, ze instrukcia SW vyzaduje 3 citacie porty v ID a a LW vyzaduje 2 porty vo WB stage. To nasa pipeline neobsahuje. Mame teda dve moznosti, bud upravime pipeline, alebo upravim instrukcie tak, aby boli podporovane nasim HW. 2 riesenie znamena rozbit instrukcie do mikroinstrukcii, ktore budu priamo vykonatelne a pipeline. Vyuzijeme pri tom register R32, ktory je programatorovi nepristupny a je vyzivany mikroinstrukciami. (microarchitecture scratch-pad register). Taketo registre sa vysytuju v CISC architekturach. Vysledne instrukcie bude mozne vykonat v dvoch taktoch.
S vyuzitim R32 rozbijeme instrukcie takto:
SW:
add R32, Rs, Rt Reg(R32) = Reg(Rs) + Reg(Rt)
sw (R32), Rt Mem(Reg(R32)) <= Reg(Rt)
LW:
addi Rs, Rs, Imm Reg(Rs) = Reg(Rs) + Imm
lw Rt, (Rs) Reg(Rt) = Mem(Reg(Rs))
Tieto mikroinstrukcie budu vykonane v dvoch taktoch.
Instrukcia SW stravila v ID faze dva takty a pocas v kazdom takte je emitovana jedna mikroinstrukcia. Dekoder tu uz musi byt sekv. obvod. Vsimnite si toho forwardingu MEM/EX, kde sa forwarduje register R32.
Priamy pipelining komplexnych instr. je v CISC procesoroch dost obtiazny. Nativna CISC pipeline sa vyznacuje viactaktovymi stupni, co znamena, ze pokial to je potreba, tak instrukcia stravi v danom stupni viac taktov. Adresacne mody a dekodovanie v CISC procesoroch su komplexnejsie. Detekcia hazardov, forwarding a presne prerusenie su zlozitejsie. Pouzivane riesenia su nakoniec unikatne pre kazdy CISC procesor. Preto je alternativou rozbitie komplexnych instrukcii do mikroinstr. a implementovat pipelining na urovni mikroinstrukcii, tak ako sme to spravili aj my. Mikroinstrukcie su teda vykonavane pomocou RISC-like pipeline. Takyto pristup sa pouziva u vsetkych x86 PCs.