int max(int s[], int size) { int max=0; for (i=0; imax) max = s[i]; return max; }
max: add $v0,$zero,$zero # max = 0 add $t0,$zero,$zero # i = 0 max_L: slt $t1,$t0,$a1 # $t1 = (i < size) beq $t1,$zero,max_exit # if (!$t1) goto max_exit sll $t1,$t1,2 # $t1 = 4*i add $t1,$t1,$a0 # $t1 = adres van s[i] lw $t1,0($t1) # $t1 = s[i] slt $t2,$v0,$t1 # $t2 = (max < s[i]) beq $t2,$zero,fi # if (!$t2) goto fi add $v0,$t1,$zero # max = s[i] fi: addi $t0,$t0,1 # i++ j max_L # goto max_L max_exit: jr $ra # return (resultaat in $v0)
lwu $t0,8($t1) /* $t0 = memory[8+$t1], $t0=$t0+8 */
Het I formaat kan gebruikt worden (6-bits opcode, 2x 5-bits register-ids, 16-bit signed immediate veld). Merk op dat beide register-ids nu ook als destination dienen, dit heeft consequenties voor het datapad en de controle.
Er is een extra write pport nodig op de registerfile; de data-ingang van deze poort
is verbonden met de ALU uitgang (deze berekent immers 8+$t1); het adres van deze
poort wordt gevormd door instructieregister[25..21].
Een veel gemaakte fout is dat men een extra adder toevoegt voor de update berekening.
Echter, deze berekening wordt reeds uitgevoerd voor alle load en store
instructies.
Een extra regwrite2 signaal, dat write van de 2e-writepoort op de registerfile enabled in het geval van een 'lwu' instructie.
De extra writeback naar de registerfile van 8+$t1 in register $t1 kan gecombineerd worden met de memory access, in cycle 4. In cycle 5 vindt dan de writeback van $t0 plaats (zoals gewoonlijk). Gevolg: extra multiplexer nodig voor write register address met ingang instructieregister[25..21]. Immers, er zijn nu 3 potentiele destination velden in het instructieformaat, bits 25..21, bits 20..16, of bits 15..11.
In het geval van een 'lwu' instructie wordt naar een nieuwe toestand 3' gesprongen. Deze toestand is identiek aan toestand 3, met de aanvullingen dat 1) de nieuwe multiplexer correct geactiveerd moet worden, zodat bits 25..21 van het instructieregister als destination-id gebruikt worden, en 2) regwrite ge-enabled wordt. Na 3' wordt naar 4 gesprongen.