OpenCores
URL https://opencores.org/ocsvn/ion/ion/trunk

Subversion Repositories ion

[/] [ion/] [trunk/] [src/] [opcodes/] [opcodes.s] - Diff between revs 152 and 165

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 152 Rev 165
Line 33... Line 33...
    .set TEST_BREAK, 1                  # BREAK instruction
    .set TEST_BREAK, 1                  # BREAK instruction
    # WARNING: the assembler expands div instructions, see 'as' manual
    # WARNING: the assembler expands div instructions, see 'as' manual
    .set TEST_DIV, 1                    # DIV* instructions
    .set TEST_DIV, 1                    # DIV* instructions
    .set TEST_MUL, 1                    # MUL* instructions
    .set TEST_MUL, 1                    # MUL* instructions
    .set USE_CACHE, 1                   # Initialize and enable cache
    .set USE_CACHE, 1                   # Initialize and enable cache
 
    .set EMU_MIPS32, 1                  # Emulates selected MIPS32 opcodes
 
 
    .set ICACHE_NUM_LINES, 256              # no. of lines in the I-Cache
    .set ICACHE_NUM_LINES, 256              # no. of lines in the I-Cache
    .set DCACHE_NUM_LINES, 256              # no. of lines in the D-Cache
    .set DCACHE_NUM_LINES, 256              # no. of lines in the D-Cache
    .set DCACHE_LINE_SIZE, 4                # D-Cache line size in words
    .set DCACHE_LINE_SIZE, 4                # D-Cache line size in words
 
 
Line 80... Line 81...
    bne     $k0,$k1,trap_invalid
    bne     $k0,$k1,trap_invalid
    nop
    nop
 
 
    # Unimplemented instruction
    # Unimplemented instruction
trap_unimplemented:
trap_unimplemented:
 
    .ifgt   EMU_MIPS32
 
    # jump to mips32 opcode emulator with c0_cause in $k0
 
    j       opcode_emu
 
    nop
 
    .else
 
    # just do some simple arith so the opcode tester knows we were here
    j       trap_return
    j       trap_return
    add     $4,$4,4
    add     $4,$4,4
 
    .endif
 
 
    # Break instruction
    # Break instruction
trap_break:
trap_break:
    j       trap_return
    j       trap_return
    add     $4,$4,5
    add     $4,$4,5
 
 
    # Syscall instruction
    # Syscall instruction
trap_syscall:
trap_syscall:
 
    mfc0    $k0,$12             # test behavior of rfe: invert bit IE of SR...
 
    xori    $k0,0x01
 
    mtc0    $k0,$12             # ...and see (in the @log) if rfe recovers it
    j       trap_return
    j       trap_return
    add     $4,$4,6
    add     $4,$4,6
 
 
    # Invalid trap cause code, most likely hardware bug
    # Invalid trap cause code, most likely hardware bug
trap_invalid:
trap_invalid:
Line 110... Line 121...
    jr      $k1
    jr      $k1
    nop
    nop
trap_return_delay_slot:
trap_return_delay_slot:
    addi    $k1,$k1,4           # skip jump instruction too
    addi    $k1,$k1,4           # skip jump instruction too
    jr      $k1                 # (we just added 8 to epc)
    jr      $k1                 # (we just added 8 to epc)
    nop
    rfe
 
 
 
 
StartTest:
StartTest:
    .ifgt   USE_CACHE
    .ifgt   USE_CACHE
    jal     setup_cache
    jal     setup_cache
    nop
    nop
    .else
    .else
    mtc0    $0,$12              # disable interrupts, disable cache
    ori     $k0,$zero,0x1
 
    mtc0    $k0,$12             # disable interrupts and cache, stay in kernel
    .endif
    .endif
 
 
    li      $k0,0x00020000      # enter user mode
    li      $k0,0x00020000      # enter user mode...
    mtc0    $k0,$12
    mtc0    $k0,$12             # ...NOW
 
    mfc0    $k0,$12             # verify COP* in user mode triggers trap (@log)
    ori     $k0,0x01
    ori     $k0,0x01
    mtc0    $k0,$12             # verify COP* in user mode triggers trap (@log)
    mtc0    $k0,$12             # verify COP* in user mode triggers trap (@log)
 
    # The two above COP0s should trigger a trap. The 1st one tests the delay in
 
    # entering user mode.
 
 
 
    # The rest of the tests proceed in user mode (not that there's much
 
    # difference...)
 
 
 
    lui     $20,0x2000          # serial port write address
 
    ori     $21,$0,'\n'         # <CR> character
 
    ori     $22,$0,'X'          # 'X' letter
 
    ori     $23,$0,'\r'
 
    ori     $24,$0,0x0f80       # temp memory
 
 
 
    sb      $23,0($20)          # Write a message to console
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
    lui     $20,0x2000          # serial port write address
 
    ori     $21,$0,'\n'         # <CR> character
 
    ori     $22,$0,'X'          # 'X' letter
 
    ori     $23,$0,'\r'
 
    ori     $24,$0,0x0f80       # temp memory
 
 
 
    sb      $23,0($20)          # test a bunch of byte-wide stores
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    ######################################
    ######################################
    #Arithmetic Instructions
    #Arithmetic Instructions
    ######################################
    ######################################
ArthmeticTest:
ArthmeticTest:
    ori     $2,$0,'A'
    ori     $2,$0,'A'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'r'
    ori     $2,$0,'r'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'t'
    ori     $2,$0,'t'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #a: ADD
    #a: ADD
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $3,$0,5
    ori     $3,$0,5
    ori     $4,$0,60
    ori     $4,$0,60
    add     $2,$3,$4
    add     $2,$3,$4
    sb      $2,0($20)    #A
    sb      $2,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #b: ADDI
    #b: ADDI
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $4,$0,60
    ori     $4,$0,60
    addi    $2,$4,5
    addi    $2,$4,5
    sb      $2,0($20)    #A
    sb      $2,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: ADDIU
    #c: ADDIU
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $4,$0,50
    ori     $4,$0,50
    addiu   $5,$4,15
    addiu   $5,$4,15
    sb      $5,0($20)    #A
    sb      $5,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: ADDU
    #d: ADDU
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $3,$0,5
    ori     $3,$0,5
    ori     $4,$0,60
    ori     $4,$0,60
    add     $2,$3,$4
    add     $2,$3,$4
    sb      $2,0($20)    #A
    sb      $2,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    # DIV tests, skip conditionally
    # DIV tests, skip conditionally
    .ifgt TEST_DIV
    .ifgt TEST_DIV
 
 
    #e: DIV
    #e: DIV
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65*117+41
    ori     $2,$0,65*117+41
    ori     $3,$0,117
    ori     $3,$0,117
    div     $2,$3
    div     $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sb      $4,0($20)    #A
    sb      $4,0($20)    #A
    mfhi    $4
    mfhi    $4
    addi    $4,$4,66-41
    addi    $4,$4,66-41
    sb      $4,0($20)    #B
    sb      $4,0($20)    #B
    li      $2,-67*19
    li      $2,-67*19
    ori     $3,$0,19
    ori     $3,$0,19
    div     $2,$3
    div     $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sub     $4,$0,$4
    sub     $4,$0,$4
    sb      $4,0($20)    #C
    sb      $4,0($20)    #C
    ori     $2,$0,68*23
    ori     $2,$0,68*23
    li      $3,-23
    li      $3,-23
    div     $2,$3
    div     $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sub     $4,$0,$4
    sub     $4,$0,$4
    sb      $4,0($20)    #D
    sb      $4,0($20)    #D
    li      $2,-69*13
    li      $2,-69*13
    li      $3,-13
    li      $3,-13
    div     $2,$3
    div     $2,$3
    mflo    $4
    mflo    $4
    sb      $4,0($20)    #E
    sb      $4,0($20)    #E
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #f: DIVU
    #f: DIVU
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65*13
    ori     $2,$0,65*13
    ori     $3,$0,13
    ori     $3,$0,13
    divu    $2,$3
    divu    $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sb      $4,0($20)    #A
    sb      $4,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
    .endif
    .endif
 
 
    # MUL tests, skip conditionally
    # MUL tests, skip conditionally
    .ifgt   TEST_MUL
    .ifgt   TEST_MUL
 
 
    #g: MULT
    #g: MULT
    ori     $2,$0,'g'
    ori     $2,$0,'g'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,5
    ori     $2,$0,5
    ori     $3,$0,13
    ori     $3,$0,13
    mult    $2,$3
    mult    $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sb      $4,0($20)    #A
    sb      $4,0($20)    #A
    li      $2,-5
    li      $2,-5
    ori     $3,$0,13
    ori     $3,$0,13
    mult    $2,$3
    mult    $2,$3
    mfhi    $5
    mfhi    $5
    mflo    $4
    mflo    $4
    sub     $4,$0,$4
    sub     $4,$0,$4
    addu    $4,$4,$5
    addu    $4,$4,$5
    addi    $4,$4,2
    addi    $4,$4,2
    sb      $4,0($20)    #B
    sb      $4,0($20)    #B
    ori     $2,$0,5
    ori     $2,$0,5
    li      $3,-13
    li      $3,-13
    mult    $2,$3
    mult    $2,$3
    mfhi    $5
    mfhi    $5
    mflo    $4
    mflo    $4
    sub     $4,$0,$4
    sub     $4,$0,$4
    addu    $4,$4,$5
    addu    $4,$4,$5
    addi    $4,$4,3
    addi    $4,$4,3
    sb      $4,0($20)    #C
    sb      $4,0($20)    #C
    li      $2,-5
    li      $2,-5
    li      $3,-13
    li      $3,-13
    mult    $2,$3
    mult    $2,$3
    mfhi    $5
    mfhi    $5
    mflo    $4
    mflo    $4
    addu    $4,$4,$5
    addu    $4,$4,$5
    addi    $4,$4,3
    addi    $4,$4,3
    sb      $4,0($20)    #D
    sb      $4,0($20)    #D
    lui     $4,0xfe98
    lui     $4,0xfe98
    ori     $4,$4,0x62e5
    ori     $4,$4,0x62e5
    lui     $5,0x6
    lui     $5,0x6
    ori     $5,0x8db8
    ori     $5,0x8db8
    mult    $4,$5
    mult    $4,$5
    mfhi    $6
    mfhi    $6
    addiu   $7,$6,2356+1+'E' #E
    addiu   $7,$6,2356+1+'E' #E
    sb      $7,0($20)
    sb      $7,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #h: MULTU
    #h: MULTU
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,5
    ori     $2,$0,5
    ori     $3,$0,13
    ori     $3,$0,13
    multu   $2,$3
    multu   $2,$3
    nop
    nop
    mflo    $4
    mflo    $4
    sb      $4,0($20)    #A
    sb      $4,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
    .endif
    .endif
 
 
    #i: SLT
    #i: SLT
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,10
    ori     $2,$0,10
    ori     $3,$0,12
    ori     $3,$0,12
    slt     $4,$2,$3
    slt     $4,$2,$3
    addi    $5,$4,64
    addi    $5,$4,64
    sb      $5,0($20)    #A
    sb      $5,0($20)    #A
    slt     $4,$3,$2
    slt     $4,$3,$2
    addi    $5,$4,66
    addi    $5,$4,66
    sb      $5,0($20)    #B
    sb      $5,0($20)    #B
    li      $2,0xfffffff0
    li      $2,0xfffffff0
    slt     $4,$2,$3
    slt     $4,$2,$3
    addi    $5,$4,66
    addi    $5,$4,66
    sb      $5,0($20)    #C
    sb      $5,0($20)    #C
    slt     $4,$3,$2
    slt     $4,$3,$2
    addi    $5,$4,68
    addi    $5,$4,68
    sb      $5,0($20)    #D
    sb      $5,0($20)    #D
    li      $3,0xffffffff
    li      $3,0xffffffff
    slt     $4,$2,$3
    slt     $4,$2,$3
    addi    $5,$4,68
    addi    $5,$4,68
    sb      $5,0($20)    #E
    sb      $5,0($20)    #E
    slt     $4,$3,$2
    slt     $4,$3,$2
    addi    $5,$4,70
    addi    $5,$4,70
    sb      $5,0($20)    #F
    sb      $5,0($20)    #F
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #j: SLTI
    #j: SLTI
    ori     $2,$0,'j'
    ori     $2,$0,'j'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,10
    ori     $2,$0,10
    slti    $4,$2,12
    slti    $4,$2,12
    addi    $5,$4,64
    addi    $5,$4,64
    sb      $5,0($20)    #A
    sb      $5,0($20)    #A
    slti    $4,$2,8
    slti    $4,$2,8
    addi    $5,$4,66
    addi    $5,$4,66
    sb      $5,0($20)    #B
    sb      $5,0($20)    #B
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #k: SLTIU
    #k: SLTIU
    ori     $2,$0,'k'
    ori     $2,$0,'k'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,10
    ori     $2,$0,10
    sltiu   $4,$2,12
    sltiu   $4,$2,12
    addi    $5,$4,64
    addi    $5,$4,64
    sb      $5,0($20)    #A
    sb      $5,0($20)    #A
    sltiu   $4,$2,8
    sltiu   $4,$2,8
    addi    $5,$4,66
    addi    $5,$4,66
    sb      $5,0($20)    #B
    sb      $5,0($20)    #B
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #l: SLTU
    #l: SLTU
    ori     $2,$0,'l'
    ori     $2,$0,'l'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,10
    ori     $2,$0,10
    ori     $3,$0,12
    ori     $3,$0,12
    slt     $4,$2,$3
    slt     $4,$2,$3
    addi    $5,$4,64
    addi    $5,$4,64
    sb      $5,0($20)    #A
    sb      $5,0($20)    #A
    slt     $4,$3,$2
    slt     $4,$3,$2
    addi    $5,$4,66
    addi    $5,$4,66
    sb      $5,0($20)    #B
    sb      $5,0($20)    #B
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #m: SUB
    #m: SUB
    ori     $2,$0,'m'
    ori     $2,$0,'m'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $3,$0,70
    ori     $3,$0,70
    ori     $4,$0,5
    ori     $4,$0,5
    sub     $2,$3,$4
    sub     $2,$3,$4
    sb      $2,0($20)    #A
    sb      $2,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #n: SUBU
    #n: SUBU
    ori     $2,$0,'n'
    ori     $2,$0,'n'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $3,$0,70
    ori     $3,$0,70
    ori     $4,$0,5
    ori     $4,$0,5
    sub     $2,$3,$4
    sub     $2,$3,$4
    sb      $2,0($20)    #A
    sb      $2,0($20)    #A
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    ######################################
    ######################################
    #Branch and Jump Instructions
    #Branch and Jump Instructions
    ######################################
    ######################################
BranchTest:
BranchTest:
    ori     $2,$0,'B'
    ori     $2,$0,'B'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'r'
    ori     $2,$0,'r'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'n'
    ori     $2,$0,'n'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #a: B
    #a: B
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    b       $B1
    b       $B1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$B1:
$B1:
    sb      $11,0($20)
    sb      $11,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #b: BAL
    #b: BAL
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    bal     $BAL1
    bal     $BAL1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $13,0($20)
    sb      $13,0($20)
    b       $BAL2
    b       $BAL2
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$BAL1:
$BAL1:
    sb      $11,0($20)
    sb      $11,0($20)
    jr      $31
    jr      $31
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BAL2:
$BAL2:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: BEQ
    #c: BEQ
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $2,$0,100
    ori     $2,$0,100
    ori     $3,$0,123
    ori     $3,$0,123
    ori     $4,$0,123
    ori     $4,$0,123
    beq     $2,$3,$BEQ1
    beq     $2,$3,$BEQ1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    beq     $3,$4,$BEQ1
    beq     $3,$4,$BEQ1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BEQ1:
$BEQ1:
    sb      $13,0($20)
    sb      $13,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: BGEZ
    #d: BGEZ
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    or      $15,$0,'X'
    or      $15,$0,'X'
    ori     $2,$0,100
    ori     $2,$0,100
    li      $3,0xffff1234
    li      $3,0xffff1234
    ori     $4,$0,123
    ori     $4,$0,123
    bgez    $3,$BGEZ1
    bgez    $3,$BGEZ1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    bgez    $2,$BGEZ1
    bgez    $2,$BGEZ1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BGEZ1:
$BGEZ1:
    bgez    $0,$BGEZ2
    bgez    $0,$BGEZ2
    nop
    nop
    sb      $15,0($20)
    sb      $15,0($20)
$BGEZ2:
$BGEZ2:
    sb      $13,0($20)
    sb      $13,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #e: BGEZAL
    #e: BGEZAL
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    li      $3,0xffff1234
    li      $3,0xffff1234
    bgezal  $3,$BGEZAL1
    bgezal  $3,$BGEZAL1
    nop
    nop
    sb      $10,0($20)
    sb      $10,0($20)
    bgezal  $0,$BGEZAL1
    bgezal  $0,$BGEZAL1
    nop
    nop
    sb      $13,0($20)
    sb      $13,0($20)
    b       $BGEZAL2
    b       $BGEZAL2
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$BGEZAL1:
$BGEZAL1:
    sb      $11,0($20)
    sb      $11,0($20)
    jr      $31
    jr      $31
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BGEZAL2:
$BGEZAL2:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #f: BGTZ
    #f: BGTZ
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $2,$0,100
    ori     $2,$0,100
    li      $3,0xffff1234
    li      $3,0xffff1234
    bgtz    $3,$BGTZ1
    bgtz    $3,$BGTZ1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    bgtz    $2,$BGTZ1
    bgtz    $2,$BGTZ1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BGTZ1:
$BGTZ1:
    sb      $13,0($20)
    sb      $13,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #g: BLEZ
    #g: BLEZ
    ori     $2,$0,'g'
    ori     $2,$0,'g'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $2,$0,100
    ori     $2,$0,100
    li      $3,0xffff1234
    li      $3,0xffff1234
    blez    $2,$BLEZ1
    blez    $2,$BLEZ1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    blez    $3,$BLEZ1
    blez    $3,$BLEZ1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BLEZ1:
$BLEZ1:
    blez    $0,$BLEZ2
    blez    $0,$BLEZ2
    nop
    nop
    sb      $22,0($20)
    sb      $22,0($20)
$BLEZ2:
$BLEZ2:
    sb      $13,0($20)
    sb      $13,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #h: BLTZ
    #h: BLTZ
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $2,$0,100
    ori     $2,$0,100
    li      $3,0xffff1234
    li      $3,0xffff1234
    ori     $4,$0,0
    ori     $4,$0,0
    bltz    $2,$BLTZ1
    bltz    $2,$BLTZ1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    bltz    $3,$BLTZ1
    bltz    $3,$BLTZ1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BLTZ1:
$BLTZ1:
    bltz    $4,$BLTZ2
    bltz    $4,$BLTZ2
    nop
    nop
    sb      $13,0($20)
    sb      $13,0($20)
$BLTZ2:
$BLTZ2:
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #i: BLTZAL
    #i: BLTZAL
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    li      $3,0xffff1234
    li      $3,0xffff1234
    bltzal  $0,$BLTZAL1
    bltzal  $0,$BLTZAL1
    nop
    nop
    sb      $10,0($20)
    sb      $10,0($20)
    bltzal  $3,$BLTZAL1
    bltzal  $3,$BLTZAL1
    nop
    nop
    sb      $13,0($20)
    sb      $13,0($20)
    b       $BLTZAL2
    b       $BLTZAL2
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$BLTZAL1:
$BLTZAL1:
    sb      $11,0($20)
    sb      $11,0($20)
    jr      $31
    jr      $31
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BLTZAL2:
$BLTZAL2:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #j: BNE
    #j: BNE
    ori     $2,$0,'j'
    ori     $2,$0,'j'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $2,$0,100
    ori     $2,$0,100
    ori     $3,$0,123
    ori     $3,$0,123
    ori     $4,$0,123
    ori     $4,$0,123
    bne     $3,$4,$BNE1
    bne     $3,$4,$BNE1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $11,0($20)
    sb      $11,0($20)
    bne     $2,$3,$BNE1
    bne     $2,$3,$BNE1
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$BNE1:
$BNE1:
    sb      $13,0($20)
    sb      $13,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #k: J
    #k: J
    ori     $2,$0,'k'
    ori     $2,$0,'k'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    j       $J1
    j       $J1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$J1:
$J1:
    sb      $11,0($20)
    sb      $11,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #l: JAL
    #l: JAL
    ori     $2,$0,'l'
    ori     $2,$0,'l'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    jal     $JAL1
    jal     $JAL1
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $13,0($20)
    sb      $13,0($20)
    b       $JAL2
    b       $JAL2
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$JAL1:
$JAL1:
    sb      $11,0($20)
    sb      $11,0($20)
    jr      $31
    jr      $31
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$JAL2:
$JAL2:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #m: JALR
    #m: JALR
    ori     $2,$0,'m'
    ori     $2,$0,'m'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $12,$0,'C'
    ori     $12,$0,'C'
    ori     $13,$0,'D'
    ori     $13,$0,'D'
    ori     $14,$0,'E'
    ori     $14,$0,'E'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    la      $3,$JALR1
    la      $3,$JALR1
    jalr    $3
    jalr    $3
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $13,0($20)
    sb      $13,0($20)
    b       $JALR2
    b       $JALR2
    sb      $14,0($20)
    sb      $14,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$JALR1:
$JALR1:
    sb      $11,0($20)
    sb      $11,0($20)
    jr      $31
    jr      $31
    sb      $12,0($20)
    sb      $12,0($20)
    sb      $22,0($20)
    sb      $22,0($20)
$JALR2:
$JALR2:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #n: JR
    #n: JR
    ori     $2,$0,'n'
    ori     $2,$0,'n'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $10,$0,'A'
    ori     $10,$0,'A'
    ori     $11,$0,'B'
    ori     $11,$0,'B'
    ori     $15,$0,'X'
    ori     $15,$0,'X'
    la      $3,$JR1
    la      $3,$JR1
    jr      $3
    jr      $3
    sb      $10,0($20)
    sb      $10,0($20)
    sb      $15,0($20)
    sb      $15,0($20)
$JR1:
$JR1:
    sb      $11,0($20)
    sb      $11,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #o: NOP
    #o: NOP
    ori     $2,$0,'o'
    ori     $2,$0,'o'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65
    ori     $2,$0,65
    nop
    nop
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
 #   b     LoadTest
 #   b     LoadTest
 
 
 
 
BreakTest:
BreakTest:
    .ifgt TEST_BREAK
    .ifgt TEST_BREAK
    #p: BREAK
    #p: BREAK
    ori     $2,$0,'p'       # check if it jumps to break address and comes back
    ori     $2,$0,'p'       # check if it jumps to break address and comes back
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'z'
    ori     $2,$0,'z'
    ori     $4,$0,59
    ori     $4,$0,59
    break   0
    break   0
    addi    $4,$4,1
    addi    $4,$4,1
    sb      $4,0($20)
    sb      $4,0($20)
 
 
    break   0               # check if load instruction is aborted (@log)
    break   0               # check if load instruction is aborted (@log)
    lb      $2,16($2)
    lb      $2,16($2)
 
 
    break   0               # check if jump instruction is aborted (@log)
    break   0               # check if jump instruction is aborted (@log)
    j       break_jump_test1
    j       break_jump_test1
    add     $4,$4,5
    add     $4,$4,5
 
 
break_jump_test1:
break_jump_test1:
    add     $4,$4,1         # make sure the jump shows in the log (@log)
    add     $4,$4,1         # make sure the jump shows in the log (@log)
 
 
    break   0               # check if store instruction is aborted
    break   0               # check if store instruction is aborted
    sb      $4,0($20)
    sb      $4,0($20)
 
 
    j       break_jump_test2 # check if break works in delay slot of jump
    j       break_jump_test2 # check if break works in delay slot of jump
    break   0
    break   0
    nop
    nop
    j       break_continue
    j       break_continue
    nop
    nop
 
 
break_jump_test2:
 
    add     $4,$4,1
 
 
 
break_continue:
break_jump_test2:
    sb      $23,0($20)
    add     $4,$4,1
    sb      $21,0($20)
 
    .endif
 
 
 
    #q: SYSCALL
break_continue:
    ori     $2,$0,'q'       # check if it jumpts to trap vector and comes back
    sb      $23,0($20)
    sb      $2,0($20)
    sb      $21,0($20)
    ori     $4,$0,61
    .endif
    syscall 0
 
    addi    $4,$4,-1
    #q: SYSCALL
    sb      $4,0($20)
    ori     $2,$0,'q'       # check if it jumpts to trap vector and comes back
 
    sb      $2,0($20)
 
    ori     $4,$0,61
 
    syscall 0
 
    addi    $4,$4,-1
 
    sb      $4,0($20)
 
 
    syscall 0               # check if load instruction is aborted (@log)
    syscall 0               # check if load instruction is aborted (@log)
    lb      $2,16($2)
    lb      $2,16($2)
 
 
    syscall 0               # check if jump instruction is aborted (@log)
    syscall 0               # check if jump instruction is aborted (@log)
    j       syscall_jump_test1
    j       syscall_jump_test1
    add     $4,$4,5
    add     $4,$4,5
 
 
syscall_jump_test1:
syscall_jump_test1:
    add     $4,$4,1         # make sure the jump shows in the log (@log)
    add     $4,$4,1         # make sure the jump shows in the log (@log)
 
 
    j       syscall_jump_test2 # check if syscall works in delay slot of jump
    j       syscall_jump_test2 # check if syscall works in delay slot of jump
    syscall 0
    syscall 0
    nop
    nop
    j       syscall_continue
    j       syscall_continue
    nop
    nop
 
 
syscall_jump_test2:
syscall_jump_test2:
    add     $4,$4,1
    add     $4,$4,1
 
 
syscall_continue:
syscall_continue:
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
 
 
    ######################################
    ######################################
    #Load, Store, and Memory Control Instructions
    #Load, Store, and Memory Control Instructions
    ######################################
    ######################################
LoadTest:
LoadTest:
    ori     $2,$0,'L'
    ori     $2,$0,'L'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'o'
    ori     $2,$0,'o'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #a: LB
    #a: LB
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x414243fc
    li      $3,0x414243fc
    sw      $3,16($2)              # 16($2)    = 0x414243fc
    sw      $3,16($2)              # 16($2)    = 0x414243fc
    lb      $4,16($2)              # $4        = 0x41
    lb      $4,16($2)              # $4        = 0x41
    sb      $4,0($20)              # UART      = 0x41
    sb      $4,0($20)              # UART      = 0x41
    lb      $4,17($2)              # $4        = 0x42
    lb      $4,17($2)              # $4        = 0x42
    nop
    nop
    sb      $4,0($20)              # UART      = 0x42
    sb      $4,0($20)              # UART      = 0x42
    lb      $4,18($2)              # $4        = 0x43
    lb      $4,18($2)              # $4        = 0x43
    nop
    nop
    sb      $4,0($20)              # UART      = 0x43
    sb      $4,0($20)              # UART      = 0x43
    lb      $2,19($2)              # $2        = 0xffff.fffc
    lb      $2,19($2)              # $2        = 0xffff.fffc
    nop
    nop
    sra     $3,$2,8                # $3        = 0xffff.ffff
    sra     $3,$2,8                # $3        = 0xffff.ffff
    addi    $3,$3,0x45             # $3        = 0x44
    addi    $3,$3,0x45             # $3        = 0x44
    sb      $3,0($20)              # UART      = 0x44
    sb      $3,0($20)              # UART      = 0x44
    addi    $2,$2,0x49             # $4        = 0x45, overflow
    addi    $2,$2,0x49             # $4        = 0x45, overflow
    sb      $2,0($20)              # UART      = 0x45
    sb      $2,0($20)              # UART      = 0x45
    sb      $23,0($20)             # UART      = CR
    sb      $23,0($20)             # UART      = CR
    sb      $21,0($20)             # UART      = LF
    sb      $21,0($20)             # UART      = LF
 
 
    #b: LBU
    #b: LBU
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x41424344
    li      $3,0x41424344
    sw      $3,16($2)
    sw      $3,16($2)
    lb      $4,16($2)
    lb      $4,16($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,17($2)
    lb      $4,17($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,18($2)
    lb      $4,18($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $2,19($2)
    lb      $2,19($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: LH
    #c: LH
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x00410042
    li      $3,0x00410042
    sw      $3,16($2)
    sw      $3,16($2)
    lh      $4,16($2)
    lh      $4,16($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lh      $2,18($2)
    lh      $2,18($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: LHU
    #d: LHU
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x00410042
    li      $3,0x00410042
    sw      $3,16($2)
    sw      $3,16($2)
    lh      $4,16($2)
    lh      $4,16($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lh      $2,18($2)
    lh      $2,18($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #e: LW
    #e: LW
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,'A'
    li      $3,'A'
    sw      $3,16($2)
    sw      $3,16($2)
    ori     $3,$0,0
    ori     $3,$0,0
    lw      $2,16($2)
    lw      $2,16($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    .ifgt TEST_UNALIGNED_LOADS
    .ifgt TEST_UNALIGNED_LOADS
    #f: LWL & LWR
    #f: LWL & LWR
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,'A'
    li      $3,'A'
    sw      $3,16($2)
    sw      $3,16($2)
    ori     $3,$0,0
    ori     $3,$0,0
    lwl     $2,16($2)
    lwl     $2,16($2)
    lwr     $2,16($2)
    lwr     $2,16($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
    .endif
    .endif
 
 
    #g: SB
    #g: SB
    ori     $2,$0,'g'
    ori     $2,$0,'g'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'A'
    ori     $2,$0,'A'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #h: SH
    #h: SH
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $4,$0,$24
    or      $4,$0,$24
    ori     $2,$0,0x4142
    ori     $2,$0,0x4142
    sh      $2,16($4)
    sh      $2,16($4)
    lb      $3,16($4)
    lb      $3,16($4)
    sb      $3,0($20)
    sb      $3,0($20)
    lb      $2,17($4)
    lb      $2,17($4)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #i: SW
    #i: SW
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x41424344
    li      $3,0x41424344
    sw      $3,16($2)
    sw      $3,16($2)
    lb      $4,16($2)
    lb      $4,16($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,17($2)
    lb      $4,17($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,18($2)
    lb      $4,18($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $2,19($2)
    lb      $2,19($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    .ifgt  TEST_UNALIGNED_STORES
    .ifgt  TEST_UNALIGNED_STORES
    #j: SWL & SWR
    #j: SWL & SWR
    ori     $2,$0,'j'
    ori     $2,$0,'j'
    sb      $2,0($20)
    sb      $2,0($20)
    or      $2,$0,$24
    or      $2,$0,$24
    li      $3,0x41424344
    li      $3,0x41424344
    swl     $3,16($2)
    swl     $3,16($2)
    swr     $3,16($2)
    swr     $3,16($2)
    lb      $4,16($2)
    lb      $4,16($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,17($2)
    lb      $4,17($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $4,18($2)
    lb      $4,18($2)
    sb      $4,0($20)
    sb      $4,0($20)
    lb      $2,19($2)
    lb      $2,19($2)
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
    .endif
    .endif
 
 
    ######################################
    ######################################
    #Logical Instructions
    #Logical Instructions
    ######################################
    ######################################
LogicalTest:
LogicalTest:
    ori     $2,$0,'L'
    ori     $2,$0,'L'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'o'
    ori     $2,$0,'o'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'g'
    ori     $2,$0,'g'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #a: AND
    #a: AND
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0x0741
    ori     $2,$0,0x0741
    ori     $3,$0,0x60f3
    ori     $3,$0,0x60f3
    and     $4,$2,$3
    and     $4,$2,$3
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #b: ANDI
    #b: ANDI
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0x0741
    ori     $2,$0,0x0741
    andi    $4,$2,0x60f3
    andi    $4,$2,0x60f3
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: LUI
    #c: LUI
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    lui     $2,0x41
    lui     $2,0x41
    srl     $3,$2,16
    srl     $3,$2,16
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: NOR
    #d: NOR
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0xf0fff08e
    li      $2,0xf0fff08e
    li      $3,0x0f0f0f30
    li      $3,0x0f0f0f30
    nor     $4,$2,$3
    nor     $4,$2,$3
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #e: OR
    #e: OR
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0x40
    ori     $2,$0,0x40
    ori     $3,$0,0x01
    ori     $3,$0,0x01
    or      $4,$2,$3
    or      $4,$2,$3
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #f: ORI
    #f: ORI
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0x40
    ori     $2,$0,0x40
    ori     $4,$2,0x01
    ori     $4,$2,0x01
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #g: XOR
    #g: XOR
    ori     $2,$0,'g'
    ori     $2,$0,'g'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0xf043
    ori     $2,$0,0xf043
    ori     $3,$0,0xf002
    ori     $3,$0,0xf002
    xor     $4,$2,$3
    xor     $4,$2,$3
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #h: XORI
    #h: XORI
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,0xf043
    ori     $2,$0,0xf043
    xor     $4,$2,0xf002
    xor     $4,$2,0xf002
    sb      $4,0($20)
    sb      $4,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
 
 
    ######################################
    ######################################
    #Move Instructions
    #Move Instructions
    ######################################
    ######################################
MoveTest:
MoveTest:
    ori     $2,$0,'M'
    ori     $2,$0,'M'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'o'
    ori     $2,$0,'o'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'v'
    ori     $2,$0,'v'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    # HI and LO are only implemented if the mul/div block is
    # HI and LO are only implemented if the mul/div block is
    .ifgt (TEST_DIV + TEST_MUL)
    .ifgt (TEST_DIV + TEST_MUL)
    #a: MFHI
    #a: MFHI
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65
    ori     $2,$0,65
    mthi    $2
    mthi    $2
    mfhi    $3
    mfhi    $3
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #b: MFLO
    #b: MFLO
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65
    ori     $2,$0,65
    mtlo    $2
    mtlo    $2
    mflo    $3
    mflo    $3
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: MTHI
    #c: MTHI
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,65
    ori     $2,$0,65
    mthi    $2
    mthi    $2
    mfhi    $3
    mfhi    $3
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: MTLO
    #d: MTLO
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,66   # use 'B' instead of 'A' to cach change in HI and LO
    ori     $2,$0,66   # use 'B' instead of 'A' to cach change in HI and LO
    mtlo    $2
    mtlo    $2
    mflo    $3
    mflo    $3
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
    .endif
    .endif
 
 
    ######################################
    ######################################
    #Shift Instructions
    #Shift Instructions
    ######################################
    ######################################
ShiftTest:
ShiftTest:
    ori     $2,$0,'S'
    ori     $2,$0,'S'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'h'
    ori     $2,$0,'h'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'i'
    ori     $2,$0,'i'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    ori     $2,$0,'t'
    ori     $2,$0,'t'
    sb      $2,0($20)
    sb      $2,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #a: SLL
    #a: SLL
    ori     $2,$0,'a'
    ori     $2,$0,'a'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    sll     $3,$2,8
    sll     $3,$2,8
    srl     $3,$3,24
    srl     $3,$3,24
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #b: SLLV
    #b: SLLV
    ori     $2,$0,'b'
    ori     $2,$0,'b'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    ori     $3,$0,8
    ori     $3,$0,8
    sllv    $3,$2,$3
    sllv    $3,$2,$3
    srl     $3,$3,24
    srl     $3,$3,24
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #c: SRA
    #c: SRA
    ori     $2,$0,'c'
    ori     $2,$0,'c'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    sra     $3,$2,16
    sra     $3,$2,16
    sb      $3,0($20)
    sb      $3,0($20)
    li      $2,0x84000000
    li      $2,0x84000000
    sra     $3,$2,25
    sra     $3,$2,25
    sub     $3,$3,0x80
    sub     $3,$3,0x80
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #d: SRAV
    #d: SRAV
    ori     $2,$0,'d'
    ori     $2,$0,'d'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    ori     $3,$0,16
    ori     $3,$0,16
    srav    $3,$2,$3
    srav    $3,$2,$3
    sb      $3,0($20)
    sb      $3,0($20)
    ori     $3,$0,25
    ori     $3,$0,25
    li      $2,0x84000000
    li      $2,0x84000000
    srav    $3,$2,$3
    srav    $3,$2,$3
    sub     $3,$3,0x80
    sub     $3,$3,0x80
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #e: SRL
    #e: SRL
    ori     $2,$0,'e'
    ori     $2,$0,'e'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    srl     $3,$2,16
    srl     $3,$2,16
    sb      $3,0($20)
    sb      $3,0($20)
    li      $2,0x84000000
    li      $2,0x84000000
    srl     $3,$2,25
    srl     $3,$2,25
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
    #f: SRLV
    #f: SRLV
    ori     $2,$0,'f'
    ori     $2,$0,'f'
    sb      $2,0($20)
    sb      $2,0($20)
    li      $2,0x40414243
    li      $2,0x40414243
    ori     $3,$0,16
    ori     $3,$0,16
    srlv    $4,$2,$3
    srlv    $4,$2,$3
    sb      $4,0($20)
    sb      $4,0($20)
    ori     $3,$0,25
    ori     $3,$0,25
    li      $2,0x84000000
    li      $2,0x84000000
    srlv    $3,$2,$3
    srlv    $3,$2,$3
    sb      $3,0($20)
    sb      $3,0($20)
    sb      $23,0($20)
    sb      $23,0($20)
    sb      $21,0($20)
    sb      $21,0($20)
 
 
 
 
    ori     $2,$0,'D'
 
    sb      $2,0($20)
 
    ori     $2,$0,'o'
 
    sb      $2,0($20)
 
    ori     $2,$0,'n'
 
    sb      $2,0($20)
 
    ori     $2,$0,'e'
 
    sb      $2,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    # These tests are to be evaluated by matching logs with the software
    ######################################
    # simulator. There is no need to perform any actual tests here, if there is
    #Emulated MIPS32r2 Instructions
    # any error it will show up as a mismatch in the logs.
    ######################################
 
    .ifgt   EMU_MIPS32
 
    ori     $2,$0,'M'
 
    sb      $2,0($20)
 
    ori     $2,$0,'i'
 
    sb      $2,0($20)
 
    ori     $2,$0,'p'
 
    sb      $2,0($20)
 
    ori     $2,$0,'s'
 
    sb      $2,0($20)
 
    ori     $2,$0,'3'
 
    sb      $2,0($20)
 
    ori     $2,$0,'2'
 
    sb      $2,0($20)
 
    ori     $2,$0,'r'
 
    sb      $2,0($20)
 
    ori     $2,$0,'2'
 
    sb      $2,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    #-- EXT ---------------------------
 
    ori     $a1,$zero,'a'
 
    sb      $a1,0($20)
 
    li      $a0,0x01234567
 
    ext     $a1,$a0,12,8
 
    addi    $a1,$a1,'A' - 0x34
 
    sb      $a1,0($20)
 
    ext     $a1,$a0,0,8
 
    addi    $a1,$a1,'B' - 0x67
 
    sb      $a1,0($20)
 
    ext     $a1,$a0,0,4
 
    addi    $a1,$a1,'C' - 0x7
 
    sb      $a1,0($20)
 
    ext     $a2,$a0,20,12
 
    addi    $a2,$a2,'D' - 0x012
 
    sb      $a2,0($20)
 
 
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    #-- INS ---------------------------
 
    ori     $a1,$zero,'b'
 
    sb      $a1,0($20)
 
    li      $a0,0x01234567
 
    ori     $a2,$zero,0xc35a
 
test_ins_1:
 
    move    $a1,$a0
 
    ins     $a1,$a2,0,8
 
    li      $a3,0x0123455a
 
    bne     $a3,$a1,test_ins_2
 
    ori     $a1,$zero,'A'
 
    sb      $a1,0($20)
 
test_ins_2:
 
    move    $a1,$a0
 
    ins     $a1,$a2,4,8
 
    li      $a3,0x012345a7
 
    bne     $a3,$a1,test_ins_3
 
    ori     $a1,$zero,'B'
 
    sb      $a1,0($20)
 
test_ins_3:
 
    move    $a1,$a0
 
    ins     $a1,$a2,24,8
 
    li      $a3,0x5a234567
 
    bne     $a3,$a1,test_ins_4
 
    ori     $a1,$zero,'C'
 
    sb      $a1,0($20)
 
test_ins_4:
 
    move    $a1,$a0
 
    ins     $a1,$a2,30,2
 
    li      $a3,0x81234567
 
    bne     $a3,$a1,test_ins_5
 
    ori     $a1,$zero,'D'
 
    sb      $a1,0($20)
 
test_ins_5:
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    #-- CLZ ---------------------------
 
    ori     $a1,$zero,'c'
 
    sb      $a1,0($20)
 
 
 
    li      $a1,0x00080000
 
    clz     $a1,$a1
 
    addiu   $a1,$a1,'A'-12
 
    sb      $a1,0($20)
 
 
 
    li      $a1,0x40000000
 
    clz     $a1,$a1
 
    addiu   $a1,$a1,'B'-1
 
    sb      $a1,0($20)
 
 
 
    clz     $a1,$zero
 
    addiu   $a1,$a1,'C'-32
 
    sb      $a1,0($20)
 
 
 
    li      $k1,0x80000000
 
    clz     $k0,$k1
 
    addiu   $a1,$k0,'D'-0
 
    sb      $a1,0($20)
 
 
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
 
    #-- CLO ---------------------------
 
    ori     $a1,$zero,'d'
 
    sb      $a1,0($20)
 
 
 
    li      $a1,0xfff7ffff
 
    clo     $a1,$a1
 
    addiu   $a1,$a1,'A'-12
 
    sb      $a1,0($20)
 
 
 
    li      $a1,0xbfffffff
 
    clo     $a1,$a1
 
    addiu   $a1,$a1,'B'-1
 
    sb      $a1,0($20)
 
 
 
    li      $a1,0xffffffff
 
    clo     $a1,$a1
 
    addiu   $a1,$a1,'C'-32
 
    sb      $a1,0($20)
 
 
 
    li      $k1,0x7fffffff
 
    clo     $k0,$k1
 
    addiu   $a1,$k0,'D'-0
 
    sb      $a1,0($20)
 
 
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
    .endif
 
 
 
    # Print 'Done'; the rest of the tests are for log matching only
 
    ori     $2,$0,'D'
 
    sb      $2,0($20)
 
    ori     $2,$0,'o'
 
    sb      $2,0($20)
 
    ori     $2,$0,'n'
 
    sb      $2,0($20)
 
    ori     $2,$0,'e'
 
    sb      $2,0($20)
 
    sb      $23,0($20)
 
    sb      $21,0($20)
 
 
    #-- Arithmetic --------------------------------------------------
 
    ori     $s0,$zero,0xa5a5
 
    ori     $s1,$zero,15
 
    ori     $s2,$zero,1
 
    li      $s3,-1
 
    li      $s4,-1000
 
    li      $s5,0x80000000
 
    li      $s6,0x7fffffff
 
 
 
    #-- ADD ---------------------------
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s1
 
    move    $t0,$s0                     # P + N = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    add     $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    add     $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    add     $t0,$t1,$s5
 
 
 
    #-- ADDI --------------------------
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addi    $t0,$t1,-1
 
    move    $t0,$s0                     # N + P = N
 
    move    $t1,$s5
 
    addi    $t0,$t1,15
 
    move    $t0,$s0                     # N + P = P
 
    move    $t1,$s3
 
    addi    $t0,$t1,2
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addi    $t0,$t1,2
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addi    $t0,$t1,2
 
 
 
    #-- ADDIU -------------------------
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addiu   $t0,$t1,-1
 
    move    $t0,$s0                     # N + P = N
 
    move    $t1,$s5
 
    addiu   $t0,$t1,15
 
    move    $t0,$s0                     # N + P = P
 
    move    $t1,$s3
 
    addiu   $t0,$t1,2
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addiu   $t0,$t1,2
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addiu   $t0,$t1,2
 
 
 
    #-- ADDU --------------------------
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s1
 
    move    $t0,$s0                     # P + N = P
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addu    $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addu    $t0,$t1,$s5
 
 
 
    #-- SUB ---------------------------
 
    move    $t0,$s0                     # P - P = P
 
    move    $t1,$s2
 
    sub     $t0,$t1,$s1
 
    move    $t0,$s0                     # P - N = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    add     $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    add     $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    add     $t0,$t1,$s5
 
 
 
    # SLT, SLTI, SLTIU
 
    ori     $a2,$zero,0xa5a5
 
    ori     $a0,$zero,15
 
    ori     $a1,$zero,1
 
    move    $v0,$a3
 
    slt     $v0,$a0,$a1
 
    move    $v0,$a3
 
    slt     $v0,$a1,$a0
 
    move    $v0,$a3
 
    slti    $v0,$a0,1
 
    move    $v0,$a3
 
    slti    $v0,$a1,15
 
    move    $v0,$a3
 
    sltiu   $v0,$a0,1
 
    move    $v0,$a3
 
    sltiu   $v0,$a1,15
 
    li      $a1,0xa5a5
 
    li      $a0,1029
 
    addiu   $a0,$a0,-2000
 
    sltu    $a1,$a0,1000
 
 
 
 
 
    #-- Relative jumps ----------------------------------------------
 
    li      $s0,0x7fffffff
 
    ori     $s1,1000
 
    ori     $s1,15
 
    ori     $s1,2
 
    li      $s4,0x80000000
 
    li      $s5,-1001
 
    li      $s6,-16
 
    li      $s7,-3
 
 
 
    bgtz    $s1,test_b0
    # These tests are to be evaluated by matching logs with the software
    nop
    # simulator. There is no need to perform any actual tests here, if there is
    ori     $v0,0x5500
    # any error it will show up as a mismatch in the logs.
test_b0:
 
    bgtz    $s7,test_b1
 
    nop
 
    ori     $v0,0x5501
 
test_b1:
 
    bgtz    $s0,test_b2
 
    nop
 
    ori     $v0,0x5502
 
test_b2:
 
    bgtz    $s4,test_b3
 
    nop
 
    ori     $v0,0x5503
 
test_b3:
 
    bgez    $s1,test_b4
 
    nop
 
    ori     $v0,0x5500
 
test_b4:
 
    bgez    $s7,test_b5
 
    nop
 
    ori     $v0,0x5501
 
test_b5:
 
    bgez    $s0,test_b6
 
    nop
 
    ori     $v0,0x5502
 
test_b6:
 
    bgez    $s4,test_b7
 
    nop
 
    ori     $v0,0x5503
 
test_b7:
 
    bltz    $s1,test_b8
 
    nop
 
    ori     $v0,0x5500
 
test_b8:
 
    bltz    $s7,test_b9
 
    nop
 
    ori     $v0,0x5501
 
test_b9:
 
    bltz    $s0,test_b10
 
    nop
 
    ori     $v0,0x5502
 
test_b10:
 
    bltz    $s4,test_b11
 
    nop
 
    ori     $v0,0x5503
 
test_b11:
 
 
 
$DONE:
    #-- Arithmetic --------------------------------------------------
 
    ori     $s0,$zero,0xa5a5
 
    ori     $s1,$zero,15
 
    ori     $s2,$zero,1
 
    li      $s3,-1
 
    li      $s4,-1000
 
    li      $s5,0x80000000
 
    li      $s6,0x7fffffff
 
 
 
    #-- ADD ---------------------------
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s1
 
    move    $t0,$s0                     # P + N = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    add     $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    add     $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    add     $t0,$t1,$s5
 
 
 
    #-- ADDI --------------------------
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addi    $t0,$t1,-1
 
    move    $t0,$s0                     # N + P = N
 
    move    $t1,$s5
 
    addi    $t0,$t1,15
 
    move    $t0,$s0                     # N + P = P
 
    move    $t1,$s3
 
    addi    $t0,$t1,2
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addi    $t0,$t1,2
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addi    $t0,$t1,2
 
 
 
    #-- ADDIU -------------------------
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addiu   $t0,$t1,-1
 
    move    $t0,$s0                     # N + P = N
 
    move    $t1,$s5
 
    addiu   $t0,$t1,15
 
    move    $t0,$s0                     # N + P = P
 
    move    $t1,$s3
 
    addiu   $t0,$t1,2
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addiu   $t0,$t1,2
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addiu   $t0,$t1,2
 
 
 
    #-- ADDU --------------------------
 
    move    $t0,$s0                     # P + P = P
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s1
 
    move    $t0,$s0                     # P + N = P
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    addu    $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    addu    $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    addu    $t0,$t1,$s5
 
 
 
    #-- SUB ---------------------------
 
    move    $t0,$s0                     # P - P = P
 
    move    $t1,$s2
 
    sub     $t0,$t1,$s1
 
    move    $t0,$s0                     # P - N = P
 
    move    $t1,$s1
 
    add     $t0,$t1,$s3
 
    move    $t0,$s0                     # P + N = N
 
    move    $t1,$s1
 
    add     $t0,$t1,$s4
 
    move    $t0,$s0                     # P + P = N (overflow)
 
    move    $t1,$s6
 
    add     $t0,$t1,$s6
 
    move    $t0,$s0                     # N + N = P (overflow)
 
    move    $t1,$s5
 
    add     $t0,$t1,$s5
 
 
 
    # SLT, SLTI, SLTIU
 
    ori     $a2,$zero,0xa5a5
 
    ori     $a0,$zero,15
 
    ori     $a1,$zero,1
 
    move    $v0,$a3
 
    slt     $v0,$a0,$a1
 
    move    $v0,$a3
 
    slt     $v0,$a1,$a0
 
    move    $v0,$a3
 
    slti    $v0,$a0,1
 
    move    $v0,$a3
 
    slti    $v0,$a1,15
 
    move    $v0,$a3
 
    sltiu   $v0,$a0,1
 
    move    $v0,$a3
 
    sltiu   $v0,$a1,15
 
    li      $a1,0xa5a5
 
    li      $a0,1029
 
    addiu   $a0,$a0,-2000
 
    sltu    $a1,$a0,1000
 
 
 
 
 
    #-- Relative jumps ----------------------------------------------
 
    li      $s0,0x7fffffff
 
    ori     $s1,1000
 
    ori     $s1,15
 
    ori     $s1,2
 
    li      $s4,0x80000000
 
    li      $s5,-1001
 
    li      $s6,-16
 
    li      $s7,-3
 
 
 
    bgtz    $s1,test_b0
 
    nop
 
    ori     $v0,0x5500
 
test_b0:
 
    bgtz    $s7,test_b1
 
    nop
 
    ori     $v0,0x5501
 
test_b1:
 
    bgtz    $s0,test_b2
 
    nop
 
    ori     $v0,0x5502
 
test_b2:
 
    bgtz    $s4,test_b3
 
    nop
 
    ori     $v0,0x5503
 
test_b3:
 
    bgez    $s1,test_b4
 
    nop
 
    ori     $v0,0x5500
 
test_b4:
 
    bgez    $s7,test_b5
 
    nop
 
    ori     $v0,0x5501
 
test_b5:
 
    bgez    $s0,test_b6
 
    nop
 
    ori     $v0,0x5502
 
test_b6:
 
    bgez    $s4,test_b7
 
    nop
 
    ori     $v0,0x5503
 
test_b7:
 
    bltz    $s1,test_b8
 
    nop
 
    ori     $v0,0x5500
 
test_b8:
 
    bltz    $s7,test_b9
 
    nop
 
    ori     $v0,0x5501
 
test_b9:
 
    bltz    $s0,test_b10
 
    nop
 
    ori     $v0,0x5502
 
test_b10:
 
    bltz    $s4,test_b11
 
    nop
 
    ori     $v0,0x5503
 
test_b11:
 
 
 
$DONE:
    j       $DONE
    j       $DONE
    nop
    nop
 
 
# void setup_cache(void) -- invalidates all I- and D-Cache lines (uses no RAM)
# void setup_cache(void) -- invalidates all I- and D-Cache lines (uses no RAM)
setup_cache:
setup_cache:
    li      $a0,0x00010002      # Enable I-cache line invalidation
    li      $a0,0x00010002      # Enable I-cache line invalidation
    mtc0    $a0,$12
    mtc0    $a0,$12
 
 
    # In order to invalidate a I-Cache line we have to write its tag number to
    # In order to invalidate a I-Cache line we have to write its tag number to
    # any address while bits CP0[12].17:16=01. The write will be executed as a
    # any address while bits CP0[12].17:16=01. The write will be executed as a
    # regular write too, as a side effect, so we need to choose a harmless
    # regular write too, as a side effect, so we need to choose a harmless
    # target address. The BSS will do -- it will be cleared later.
    # target address. The BSS will do -- it will be cleared later.
    # We'll cover all ICACHE_NUM_LINES lines no matter what the starting
    # We'll cover all ICACHE_NUM_LINES lines no matter what the starting
    # address is, anyway.
    # address is, anyway.
 
 
    la      $a0,__bss_start
    la      $a0,__bss_start
    li      $a2,0
    li      $a2,0
    li      $a1,ICACHE_NUM_LINES-1
    li      $a1,ICACHE_NUM_LINES-1
 
 
inv_i_cache_loop:
inv_i_cache_loop:
    sw      $a2,0($a0)
    sw      $a2,0($a0)
    blt     $a2,$a1,inv_i_cache_loop
    blt     $a2,$a1,inv_i_cache_loop
    addi    $a2,1
    addi    $a2,1
 
 
    # Now, the D-Cache is different. To invalidate a D-Cache line you just
    # Now, the D-Cache is different. To invalidate a D-Cache line you just
    # read from it (by proper selection of a dummy target address)  while bits
    # read from it (by proper selection of a dummy target address)  while bits
    # CP0[12].17:16=01. The data read is undefined and should be discarded.
    # CP0[12].17:16=01. The data read is undefined and should be discarded.
 
 
    li      $a0,0               # Use any base address that is mapped
    li      $a0,0               # Use any base address that is mapped
    li      $a2,0
    li      $a2,0
    li      $a1,DCACHE_NUM_LINES-1
    li      $a1,DCACHE_NUM_LINES-1
 
 
inv_d_cache_loop:
inv_d_cache_loop:
    lw      $zero,0($a0)
    lw      $zero,0($a0)
    addi    $a0,DCACHE_LINE_SIZE*4
    addi    $a0,DCACHE_LINE_SIZE*4
    blt     $a2,$a1,inv_d_cache_loop
    blt     $a2,$a1,inv_d_cache_loop
    addi    $a2,1
    addi    $a2,1
 
 
    li      $a1,0x00020002      # Leave with cache enabled
    li      $a1,0x00020002      # Leave with cache enabled
    jr      $ra
    jr      $ra
    mtc0    $a1,$12
    mtc0    $a1,$12
    .set    reorder
    .set    reorder
    .end    entry
    .end    entry
 
 
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.