| operation | R-format | I-format | |
|---|---|---|---|
| add | add | addi | |
| subtract | sub | subi | |
| AND | and | andi | andhi |
| OR | or | ori | orhi |
| XOR | xor | xori | xorhi |
| NOR | nor | nori | |
| pseudo-instruction |
The add/subtract instructions assume a sign-extended immediate field. The logic instructions do not use sign-extenstion.
The sign extension operation is described below.
| Move register to register (using add) |
| mov rc, ra # rC <= rA + zero |
| Move signed immediate to register (using addi) |
| movi rb, immed # rB <= zero + se(immed) |
| Move immediate to upper 16-bits (high half) register (using orhi) |
| movhi rb, immed # rB[31:16] <= zero | immed |
| Moving a general 32-bit constant requires two instructions.
For example r2 = 0x2AB_CD87 becomes: |
movhi r2,684 ; 684 is 0x2AC addi r2,r2,-12921 ; -12921 is 0xFFFF_CD87 |
The three mov instructions are implemented by pseudo-instructions.
zero = 16'h0000;
ones = 16'hffff;
immedse = { (immed[15]?ones:zero), immed};
Download: cprog1.zip.
01: // Arithmetic (addition/subtraction) and
02: // Logic Operations
03:
04: int main()
05: {
06: int na, nb, nc, nd, ne;
07:
08: na = 14;
09: nb = na ^ 0x2ABCD87;
10: nc = 0x1234ABCD;
11: nd = na ^ nc;
12: nb = na | nd;
13: ne = (na | 0x3A)&~(nb^0xF);
14: nc = (na + nb) - nc + 21;
15: nd = ~na;
16: /* Event loop never exits. */
17: while (1);
18: }
0000806c <main>:
// Arithmetic (addition/subtraction) and
// Logic Operations
int main()
{
806c: defffa04 addi sp,sp,-24
8070: df000515 stw fp,20(sp)
8074: d839883a mov fp,sp
int na, nb, nc, nd, ne;
na = 14;
8078: 00800384 movi r2,14
807c: e0800015 stw r2,0(fp)
nb = na ^ 0x2ABCD87;
8080: e0c00017 ldw r3,0(fp)
8084: 0080ab34 movhi r2,684
8088: 10b361c4 addi r2,r2,-12921
808c: 1884f03a xor r2,r3,r2
8090: e0800115 stw r2,4(fp)
nc = 0x1234ABCD;
8094: 00848d74 movhi r2,4661
8098: 10aaf344 addi r2,r2,-21555
809c: e0800215 stw r2,8(fp)
nd = na ^ nc;
80a0: e0c00017 ldw r3,0(fp)
80a4: e0800217 ldw r2,8(fp)
80a8: 1884f03a xor r2,r3,r2
80ac: e0800315 stw r2,12(fp)
nb = na | nd;
80b0: e0c00017 ldw r3,0(fp)
80b4: e0800317 ldw r2,12(fp)
80b8: 1884b03a or r2,r3,r2
80bc: e0800115 stw r2,4(fp)
ne = (na | 0x3A)&~(nb^0xF);
80c0: e0800017 ldw r2,0(fp)
80c4: 10c00e94 ori r3,r2,58
80c8: e0800117 ldw r2,4(fp)
80cc: 108003dc xori r2,r2,15
80d0: 0084303a nor r2,zero,r2
80d4: 1884703a and r2,r3,r2
80d8: e0800415 stw r2,16(fp)
nc = (na + nb) - nc + 21;
80dc: e0c00017 ldw r3,0(fp)
80e0: e0800117 ldw r2,4(fp)
80e4: 1887883a add r3,r3,r2
80e8: e0800217 ldw r2,8(fp)
80ec: 1885c83a sub r2,r3,r2
80f0: 10800544 addi r2,r2,21
80f4: e0800215 stw r2,8(fp)
nd = ~na;
80f8: e0800017 ldw r2,0(fp)
80fc: 0084303a nor r2,zero,r2
8100: e0800315 stw r2,12(fp)
/* Event loop never exits. */
while (1);
8104: 003fff06 br 8104 <main+0x98>
Maintained by John Loomis, last updated 28 July 2008