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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [sw/] [tests/] [or1200/] [sim/] [or1200-mac.S] - Diff between revs 425 and 499

Only display areas with differences | Details | Blame | View Log

Rev 425 Rev 499
/*
/*
        OR1200 MAC test
        OR1200 MAC test
        Very basic, testing simple instructions and multiplication,
        Very basic, testing simple instructions and multiplication,
        accumulation values
        accumulation values
        Julius Baxter, julius.baxter@orsoc.se
        Julius Baxter, julius.baxter@orsoc.se
*/
*/
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
//// Copyright (C) 2010 Authors and OPENCORES.ORG                 ////
//// Copyright (C) 2010 Authors and OPENCORES.ORG                 ////
////                                                              ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
//// later version.                                               ////
////                                                              ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
//// details.                                                     ////
////                                                              ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#include "spr-defs.h"
#include "spr-defs.h"
#include "board.h"
#include "board.h"
#include "or1200-defines.h"
#include "or1200-defines.h"
// Check MAC unit is enabled before trying to run this test
// Check MAC unit is enabled before trying to run this test
#ifndef OR1200_MAC_IMPLEMENTED
#ifndef OR1200_MAC_IMPLEMENTED
# error
# error
# error No MAC unit detected. This test requires hardware MAC support
# error No MAC unit detected. This test requires hardware MAC support
# error
# error
#endif
#endif
/* =================================================== [ exceptions ] === */
/* =================================================== [ exceptions ] === */
        .section .vectors, "ax"
        .section .vectors, "ax"
/* ---[ 0x100: RESET exception ]----------------------------------------- */
/* ---[ 0x100: RESET exception ]----------------------------------------- */
        .org 0x100
        .org 0x100
        l.movhi r0, 0
        l.movhi r0, 0
        /* Clear status register */
        /* Clear status register */
        l.ori r1, r0, SPR_SR_SM
        l.ori r1, r0, SPR_SR_SM
        l.mtspr r0, r1, SPR_SR
        l.mtspr r0, r1, SPR_SR
        /* Clear timer  */
        /* Clear timer  */
        l.mtspr r0, r0, SPR_TTMR
        l.mtspr r0, r0, SPR_TTMR
        /* Jump to program initialisation code */
        /* Jump to program initialisation code */
        .global _start
        .global _start
        l.movhi r4, hi(_start)
        l.movhi r4, hi(_start)
        l.ori r4, r4, lo(_start)
        l.ori r4, r4, lo(_start)
        l.jr    r4
        l.jr    r4
        l.nop
        l.nop
/* =================================================== [ text ] === */
/* =================================================== [ text ] === */
        .section .text
        .section .text
/* =================================================== [ start ] === */
/* =================================================== [ start ] === */
        .global _start
        .global _start
_start:
_start:
        /* Instruction cache enable */
        /* Instruction cache enable */
        /* Check if IC present and skip enabling otherwise */
        /* Check if IC present and skip enabling otherwise */
        l.mfspr r24,r0,SPR_UPR
        l.mfspr r24,r0,SPR_UPR
        l.andi  r26,r24,SPR_UPR_ICP
        l.andi  r26,r24,SPR_UPR_ICP
        l.sfeq  r26,r0
        l.sfeq  r26,r0
        l.bf    .L8
        l.bf    .L8
        l.nop
        l.nop
        /* Disable IC */
        /* Disable IC */
        l.mfspr r6,r0,SPR_SR
        l.mfspr r6,r0,SPR_SR
        l.addi  r5,r0,-1
        l.addi  r5,r0,-1
        l.xori  r5,r5,SPR_SR_ICE
        l.xori  r5,r5,SPR_SR_ICE
        l.and   r5,r6,r5
        l.and   r5,r6,r5
        l.mtspr r0,r5,SPR_SR
        l.mtspr r0,r5,SPR_SR
        /* Establish cache block size
        /* Establish cache block size
        If BS=0, 16;
        If BS=0, 16;
        If BS=1, 32;
        If BS=1, 32;
        r14 contain block size
        r14 contain block size
        */
        */
        l.mfspr r24,r0,SPR_ICCFGR
        l.mfspr r24,r0,SPR_ICCFGR
        l.andi  r26,r24,SPR_ICCFGR_CBS
        l.andi  r26,r24,SPR_ICCFGR_CBS
        l.srli  r28,r26,7
        l.srli  r28,r26,7
        l.ori   r30,r0,16
        l.ori   r30,r0,16
        l.sll   r14,r30,r28
        l.sll   r14,r30,r28
        /* Establish number of cache sets
        /* Establish number of cache sets
        r16 contains number of cache sets
        r16 contains number of cache sets
        r28 contains log(# of cache sets)
        r28 contains log(# of cache sets)
        */
        */
        l.andi  r26,r24,SPR_ICCFGR_NCS
        l.andi  r26,r24,SPR_ICCFGR_NCS
        l.srli  r28,r26,3
        l.srli  r28,r26,3
        l.ori   r30,r0,1
        l.ori   r30,r0,1
        l.sll   r16,r30,r28
        l.sll   r16,r30,r28
        /* Invalidate IC */
        /* Invalidate IC */
        l.addi  r6,r0,0
        l.addi  r6,r0,0
        l.sll   r5,r14,r28
        l.sll   r5,r14,r28
.L7:
.L7:
        l.mtspr r0,r6,SPR_ICBIR
        l.mtspr r0,r6,SPR_ICBIR
        l.sfne  r6,r5
        l.sfne  r6,r5
        l.bf    .L7
        l.bf    .L7
        l.add   r6,r6,r14
        l.add   r6,r6,r14
        /* Enable IC */
        /* Enable IC */
        l.mfspr r6,r0,SPR_SR
        l.mfspr r6,r0,SPR_SR
        l.ori   r6,r6,SPR_SR_ICE
        l.ori   r6,r6,SPR_SR_ICE
        l.mtspr r0,r6,SPR_SR
        l.mtspr r0,r6,SPR_SR
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
.L8:
.L8:
        /* Data cache enable */
        /* Data cache enable */
        /* Check if DC present and skip enabling otherwise */
        /* Check if DC present and skip enabling otherwise */
        l.mfspr r24,r0,SPR_UPR
        l.mfspr r24,r0,SPR_UPR
        l.andi  r26,r24,SPR_UPR_DCP
        l.andi  r26,r24,SPR_UPR_DCP
        l.sfeq  r26,r0
        l.sfeq  r26,r0
        l.bf    .L10
        l.bf    .L10
        l.nop
        l.nop
        /* Disable DC */
        /* Disable DC */
        l.mfspr r6,r0,SPR_SR
        l.mfspr r6,r0,SPR_SR
        l.addi  r5,r0,-1
        l.addi  r5,r0,-1
        l.xori  r5,r5,SPR_SR_DCE
        l.xori  r5,r5,SPR_SR_DCE
        l.and   r5,r6,r5
        l.and   r5,r6,r5
        l.mtspr r0,r5,SPR_SR
        l.mtspr r0,r5,SPR_SR
        /* Establish cache block size
        /* Establish cache block size
           If BS=0, 16;
           If BS=0, 16;
           If BS=1, 32;
           If BS=1, 32;
           r14 contain block size
           r14 contain block size
        */
        */
        l.mfspr r24,r0,SPR_DCCFGR
        l.mfspr r24,r0,SPR_DCCFGR
        l.andi  r26,r24,SPR_DCCFGR_CBS
        l.andi  r26,r24,SPR_DCCFGR_CBS
        l.srli  r28,r26,7
        l.srli  r28,r26,7
        l.ori   r30,r0,16
        l.ori   r30,r0,16
        l.sll   r14,r30,r28
        l.sll   r14,r30,r28
        /* Establish number of cache sets
        /* Establish number of cache sets
           r16 contains number of cache sets
           r16 contains number of cache sets
           r28 contains log(# of cache sets)
           r28 contains log(# of cache sets)
        */
        */
        l.andi  r26,r24,SPR_DCCFGR_NCS
        l.andi  r26,r24,SPR_DCCFGR_NCS
        l.srli  r28,r26,3
        l.srli  r28,r26,3
        l.ori   r30,r0,1
        l.ori   r30,r0,1
        l.sll   r16,r30,r28
        l.sll   r16,r30,r28
        /* Invalidate DC */
        /* Invalidate DC */
        l.addi  r6,r0,0
        l.addi  r6,r0,0
        l.sll   r5,r14,r28
        l.sll   r5,r14,r28
.L9:
.L9:
        l.mtspr r0,r6,SPR_DCBIR
        l.mtspr r0,r6,SPR_DCBIR
        l.sfne  r6,r5
        l.sfne  r6,r5
        l.bf    .L9
        l.bf    .L9
        l.add   r6,r6,r14
        l.add   r6,r6,r14
        /* Enable DC */
        /* Enable DC */
        l.mfspr r6,r0,SPR_SR
        l.mfspr r6,r0,SPR_SR
        l.ori   r6,r6,SPR_SR_DCE
        l.ori   r6,r6,SPR_SR_DCE
        l.mtspr r0,r6,SPR_SR
        l.mtspr r0,r6,SPR_SR
.L10:
.L10:
        // Kick off test
        // Kick off test
        l.jal   _main
        l.jal   _main
        l.nop
        l.nop
/* =================================================== [ main ] === */
/* =================================================== [ main ] === */
        .global _main
        .global _main
_main:
_main:
        // First clear MAC
        // First clear MAC
        l.macrc r3
        l.macrc r3
        l.nop 0x2
        l.nop 0x2
        // Load a constant into r3
        // Load a constant into r3
        l.ori   r4, r0, 0x3     // r4 = 3
        l.ori   r4, r0, 0x3     // r4 = 3
        l.ori   r5, r0, 0x2     // r5 = 2
        l.ori   r5, r0, 0x2     // r5 = 2
        l.ori   r6, r0, 0       // r6 = 0
        l.ori   r6, r0, 0       // r6 = 0
        l.ori   r7, r0, 0x7     // r7 = 7
        l.ori   r7, r0, 0x7     // r7 = 7
        // Test back-to-back l.mac operations
        // Test back-to-back l.mac operations
        l.mac   r4, r5          // Multiply: MAC reg 6
        l.mac   r4, r5          // Multiply: MAC reg 6
        l.mac   r4, r7          // Multiply: MAC reg 27
        l.mac   r4, r7          // Multiply: MAC reg 27
        l.mac   r5, r5          // Multiply: MAC reg 31
        l.mac   r5, r5          // Multiply: MAC reg 31
        l.mac   r4, r0          // Multiply: MAC reg 31
        l.mac   r4, r0          // Multiply: MAC reg 31
        l.mac   r4, r5          // Multiply: MAC reg 37 (0x25)
        l.mac   r4, r5          // Multiply: MAC reg 37 (0x25)
        l.macrc r3
        l.macrc r3
        l.nop 0x2
        l.nop 0x2
        l.sfeqi r3, 0x25
        l.sfeqi r3, 0x25
        l.bnf fail
        l.bnf fail
        l.ori r3, r0, 0x1       // Test 1 failed
        l.ori r3, r0, 0x1       // Test 1 failed
        // Test back-to-back l.maci operations
        // Test back-to-back l.maci operations
        l.maci  r4, 5           // Multiply: MAC reg 15
        l.maci  r4, 5           // Multiply: MAC reg 15
        l.maci  r4, 8           // Multiply: MAC reg 39
        l.maci  r4, 8           // Multiply: MAC reg 39
        l.maci  r5, 1           // Multiply: MAC reg 41
        l.maci  r5, 1           // Multiply: MAC reg 41
        l.maci  r4, 0           // Multiply: MAC reg 41
        l.maci  r4, 0           // Multiply: MAC reg 41
        l.maci  r4, 3           // Multiply: MAC reg 50 (0x32)
        l.maci  r4, 3           // Multiply: MAC reg 50 (0x32)
        l.nop
 
        l.nop
 
        l.macrc r3
        l.macrc r3
        l.nop 0x2
        l.nop 0x2
        l.sfeqi r3, 0x32
        l.sfeqi r3, 0x32
        l.bnf fail
        l.bnf fail
        l.ori r3, r0, 0x2       // Test 2 failed
        l.ori r3, r0, 0x2       // Test 2 failed
#define NUM_MAC_LOOPS 8
#define NUM_MAC_LOOPS 8
macloop:
macloop:
        l.mac   r4, r5          // Multiply: MAC reg 6
        l.mac   r4, r5          // Multiply: MAC reg 6
        l.addi  r6, r6, 1       // Increment counter
        l.addi  r6, r6, 1       // Increment counter
        l.sfltui r6, NUM_MAC_LOOPS
        l.sfltui r6, NUM_MAC_LOOPS
        l.bf    macloop
        l.bf    macloop
        l.nop
        l.nop
        l.macrc r3
        l.macrc r3
        l.nop 0x2
        l.nop 0x2
        l.sfeqi r3, (NUM_MAC_LOOPS*6)
        l.sfeqi r3, (NUM_MAC_LOOPS*6)
        l.bnf   fail
        l.bnf   fail
        l.ori   r3, r0, 0x3     // Test 3 failed
        l.ori   r3, r0, 0x3     // Test 3 failed
        l.movhi r3, 0x8000
        l.movhi r3, 0x8000
        l.ori   r3, r3, 0x000d
        l.ori   r3, r3, 0x000d
        l.nop   0x2
        l.nop   0x2
        l.ori   r3, r0, 0
        l.ori   r3, r0, 0
        l.nop   0x1
        l.nop   0x1
fail:
fail:
        l.nop 0x1
        l.nop 0x1
 
 

powered by: WebSVN 2.1.0

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