URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [orpsocv2/] [sw/] [tests/] [or1200/] [sim/] [or1200-ffl1.S] - Rev 425
Go to most recent revision | Compare with Previous | Blame | View Log
/*OR1200 Find First/Last '1' TestChecks l.ff1 and l.fl1 outputs for every bit positionJulius Baxter, julius.baxter@orsoc.se*/////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2010 Authors and OPENCORES.ORG //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer. //////// //////// This source file is free software; you can redistribute it //////// and/or modify it under the terms of the GNU Lesser General //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any //////// later version. //////// //////// This source is distributed in the hope that it will be //////// useful, but WITHOUT ANY WARRANTY; without even the implied //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //////// PURPOSE. See the GNU Lesser General Public License for more //////// details. //////// //////// You should have received a copy of the GNU Lesser General //////// Public License along with this source; if not, download it //////// from http://www.opencores.org/lgpl.shtml //////// //////////////////////////////////////////////////////////////////////////#include "spr-defs.h"#include "board.h"#include "or1200-defines.h"// Check MAC unit is enabled before trying to run this test#ifndef OR1200_IMPL_ALU_FFL1# error# error Find First/Last '1' isntructions not enabled.# error#endif/* =================================================== [ exceptions ] === */.section .vectors, "ax"/* ---[ 0x100: RESET exception ]----------------------------------------- */.org 0x100l.movhi r0, 0/* Clear status register */l.ori r1, r0, SPR_SR_SMl.mtspr r0, r1, SPR_SR/* Clear timer */l.mtspr r0, r0, SPR_TTMR/* Jump to program initialisation code */.global _startl.movhi r4, hi(_start)l.ori r4, r4, lo(_start)l.jr r4l.nop/* =================================================== [ text ] === */.section .text/* =================================================== [ start ] === */.global _start_start:/* Instruction cache enable *//* Check if IC present and skip enabling otherwise */l.mfspr r24,r0,SPR_UPRl.andi r26,r24,SPR_UPR_ICPl.sfeq r26,r0l.bf .L8l.nop/* Disable IC */l.mfspr r6,r0,SPR_SRl.addi r5,r0,-1l.xori r5,r5,SPR_SR_ICEl.and r5,r6,r5l.mtspr r0,r5,SPR_SR/* Establish cache block sizeIf BS=0, 16;If BS=1, 32;r14 contain block size*/l.mfspr r24,r0,SPR_ICCFGRl.andi r26,r24,SPR_ICCFGR_CBSl.srli r28,r26,7l.ori r30,r0,16l.sll r14,r30,r28/* Establish number of cache setsr16 contains number of cache setsr28 contains log(# of cache sets)*/l.andi r26,r24,SPR_ICCFGR_NCSl.srli r28,r26,3l.ori r30,r0,1l.sll r16,r30,r28/* Invalidate IC */l.addi r6,r0,0l.sll r5,r14,r28.L7:l.mtspr r0,r6,SPR_ICBIRl.sfne r6,r5l.bf .L7l.add r6,r6,r14/* Enable IC */l.mfspr r6,r0,SPR_SRl.ori r6,r6,SPR_SR_ICEl.mtspr r0,r6,SPR_SRl.nopl.nopl.nopl.nopl.nopl.nopl.nopl.nop.L8:/* Data cache enable *//* Check if DC present and skip enabling otherwise */l.mfspr r24,r0,SPR_UPRl.andi r26,r24,SPR_UPR_DCPl.sfeq r26,r0l.bf .L10l.nop/* Disable DC */l.mfspr r6,r0,SPR_SRl.addi r5,r0,-1l.xori r5,r5,SPR_SR_DCEl.and r5,r6,r5l.mtspr r0,r5,SPR_SR/* Establish cache block sizeIf BS=0, 16;If BS=1, 32;r14 contain block size*/l.mfspr r24,r0,SPR_DCCFGRl.andi r26,r24,SPR_DCCFGR_CBSl.srli r28,r26,7l.ori r30,r0,16l.sll r14,r30,r28/* Establish number of cache setsr16 contains number of cache setsr28 contains log(# of cache sets)*/l.andi r26,r24,SPR_DCCFGR_NCSl.srli r28,r26,3l.ori r30,r0,1l.sll r16,r30,r28/* Invalidate DC */l.addi r6,r0,0l.sll r5,r14,r28.L9:l.mtspr r0,r6,SPR_DCBIRl.sfne r6,r5l.bf .L9l.add r6,r6,r14/* Enable DC */l.mfspr r6,r0,SPR_SRl.ori r6,r6,SPR_SR_DCEl.mtspr r0,r6,SPR_SR.L10:// Kick off testl.jal _mainl.nop/* =================================================== [ main ] === */.global _main_main:l.movhi r3, 0l.movhi r4, 0 // Bit we're checking worksl.movhi r5, 0l.ori r6, r0, 32l.movhi r7, 0 // Register we'll put a value in to check with l.ff1#define REPORT(reg) l.or r3, reg, r0 ; \l.nop 0x2ff1_loop:// Set a loop going, creating a register with a '1' in a known position// and checking the output of the l.ff1l.ori r7, r0, 1 // Put 1 in bit 0l.sll r7, r7, r4 // Shift '1' by r4REPORT(r7) // Report valuel.ff1 r5, r7 // Do Find First '1' opl.fl1 r8, r7 // Do Find Last '1' opREPORT(r5) // Report valueREPORT(r8) // Report valuel.addi r4, r4, 1 // Increment bit we're checking (will also be// result from l.ff1)REPORT(r4) // Report valuel.sfne r5, r4 // r5 should = r4l.bf ff1_errorl.sfne r8, r4 // r8 should = r4l.bf fl1_errorl.sfne r6, r4 // Check if loop is finishedl.bf ff1_loop // Keep checkingl.nopl.j ffl1_test2 // All OK, next testl.nopffl1_test2:// Try 3 values - all '0', all '1' and a block of values in betweenl.movhi r4, 0l.movhi r5, 0xffffl.ori r5, r5, 0xffffl.movhi r6, 0x00ffl.ori r6, r6, 0xff00// Test '0'REPORT(r4)l.ff1 r7, r4l.fl1 r8, r4REPORT(r7)REPORT(r8)l.sfnei r7, 0l.bf ff1_errorl.sfnei r8, 0l.bf fl1_error// Test '0xffffffff'REPORT(r5)l.ff1 r7, r5l.fl1 r8, r5REPORT(r7)REPORT(r8)l.sfnei r7, 1l.bf ff1_errorl.sfnei r8, 32l.bf fl1_error// Test '0x00ffff00'REPORT(r6)l.ff1 r7, r6l.fl1 r8, r6REPORT(r7)REPORT(r8)l.sfnei r7, 9l.bf ff1_errorl.sfnei r8, 24l.bf fl1_errorl.nopl.j ffl1_ok // Tests OKff1_error:l.movhi r3, hi(0xbaaadff1)l.ori r3, r3, lo(0xbaaadff1)l.nop 0x1fl1_error:l.movhi r3, hi(0xbaaadf11)l.ori r3, r3, lo(0xbaaadf11)l.nop 0x1ffl1_ok:l.movhi r3, hi(0x8000000d)l.ori r3, r3, lo(0x8000000d)l.nop 0x2 /* Report */l.ori r3, r0, 0 /* Return 0 */l.nop 0x1
Go to most recent revision | Compare with Previous | Blame | View Log
