;; -*-asm-*-
TABLE=0x8000
RZ=r63
.macro FAIL
mov r0,#1
trap 3
.endm
.macro PASS
mov r0,#0
trap 3
.endm
.macro VERIFY ra,rb,ref,label
sub \ra,\rb,\ref
beq \label
FAIL
.endm
/*****************************************/
/*INITIALIZING REGISTERS */
/*****************************************/
/*Check that sum is correct*/
START: MOV R0, #TABLE ; //Setting R0 to TABLE
LSL R0,R0,#2 ; //Create 00020000
;; Load r1.63 with 1..63
.irpc num,63
mov r\num,#\num
.endr
;; Sum the registers
.irpc num,62
add r63,r63,r\num
.endr
mov r62,#2016 ;//Correct sum of 1..63 = 63*32 + 63
VERIFY r63,r63,R62,BRANCH1;//CHECK SUM
/*****************************************/
/*BRANCHING */
/*****************************************/
//Check that all condition codes work
BRANCH1: BEQ BRANCH2 ; //taken
FAIL ;
FAIL ;
FAIL ;
FAIL ;
BRANCH2: BNE FAIL_BRANCH ; //not taken
BRANCH3: BGT FAIL_BRANCH ; //not taken
BRANCH4: BGTE BRANCH5 ; //taken
FAIL ;
BRANCH5: BLTE BRANCH6 ; //taken
FAIL ;
BRANCH6: BLT FAIL_BRANCH ; //not taken
BRANCH8: B LONGJUMP ; //taken
FAIL ;
RETURN: bl FUNCTION ; //jump to subroutine
MOV R63,JARLAB ;//REGISTER JUMP
JR R63 ;
FAIL ;
JARLAB: MOV R63,FUNCTION ; //REGISTER CALL
JALR R63 ; //16 bit
B NEXT ; //jump over fail
FAIL ;
FAIL_BRANCH: FAIL ; //fail branch
/*****************************************/
/*LOAD-STORE DISPLACEMENT */
/*****************************************/
//Check max displacement value(0xf)
//Check that offset is correct
//all load/stores are aligned
//this gives greater range(2 more bits)
//offset is shifted by 2x bits
NEXT: STRB R4,[R0,#0x0] ;//Store Byte
LDRB R63,[R0,#0x0] ;//Load Byte
VERIFY R63,R63,R4,STOREB ;
STOREB: STRB R5,[R0,#0xf] ;//Store Byte
LDRB R63,[R0,#0xf] ;//Load Byte
VERIFY R63,R63,R5,STORES ;
STORES: STRH R4,[R0,#0x0] ;//Store Short
LDRH R63,[R0,#0x0] ;//Load Short
VERIFY R63,R63,R4,STORES2 ;
STORES2: STRH R5,[R0,#0xe] ;//Store Short
LDRH R63,[R0,#0xe] ;//Load Short
VERIFY R63,R63,R5,STORE ;
STORE: STR R4,[R0,#0x0] ;//Store Word
LDR R63,[R0,#0x0] ;//Load Word
VERIFY R63,R63,R4,STORE2 ;
STORE2: STR R5,[R0,#0xc] ;//Store Word
LDR R63,[R0,#0xc] ;//Load Word
VERIFY R63,R63,R5,STOREBI ;
/*****************************************/
/*LOAD-STORE INDEX */
/*****************************************/
STOREBI: STRB R4,[R0,R4] ;//Store Word
LDRB R63,[R0,R4] ;//Load Word
VERIFY R63,R63,R4,STORESI ;
STORESI: STRH R5,[R0,R4] ;//Store Word
LDRH R63,[R0,R4] ;//Load Word
VERIFY R63,R63,R5,STOREI ;
STOREI: STR R6,[R0,R4] ;//Store Word
LDR R63,[R0,R4] ;//Load Word
VERIFY R63,R63,R6,PMB ;
/*****************************************/
/*LOAD-STORE POSTMODIFY */
/*****************************************/
PMB: STRB R4,[R0],R4 ;//Store Word
SUB R0,R0,#0x4 ;//restoring R0
LDRB R63,[R0],R4 ;//Load Word
SUB R0,R0,#0x4 ;//restoring R0
VERIFY R63,R63,R4,PMS ;
PMS: STRH R5,[R0],R4 ;//Store Word
SUB R0,R0,#0x4 ;//restoring R0
LDRH R63,[R0],R4 ;//Load Word
VERIFY R63,R63,R5,PM ;
PM: SUB R0,R0,#0x4 ;//restoring R0
STR R6,[R0],R4 ;//Store Word
SUB R0,R0,#0x4 ;//restoring R0
LDR R63,[R0],R4 ;//Load Word
SUB R0,R0,#0x4 ;//restoring R0
VERIFY R63,R63,R6,MOVLAB ;
/*****************************************/
/*IMMEDIATE LOAD */
/*****************************************/
MOVLAB: MOV R63,#0xFF;
MOV R1,#0xFF;
VERIFY R63,R63,R1,ADDLAB ;
/*****************************************/
/*2 REG ADD/SUB PROCESSING */
/*****************************************/
ADDLAB: ADD R63,R2,#3; //2+3=5
VERIFY R63,R63,#5,SUBLAB ;
SUBLAB: SUB R63,R2,#1; //2+1=1
VERIFY R63,R63,#1,LSRLAB ;
/*****************************************/
/*SHIFTS */
/*****************************************/
//Note ASR does not work
//Immediates
LSRLAB: LSR R63,R6,#0x2 ; //6>>2=1
VERIFY R63,R63,#1,LSLLAB ;
LSLLAB: LSL R63,R3,#0x2 ; //3<<2=12
VERIFY R63,R63,#12,LSRILAB ;
//Registers
LSRILAB: LSR R63,R6,R2 ; //6>>2=1
VERIFY R63,R63,#1,LSLILAB ;
LSLILAB: LSL R63,R3,R2 ; //3<<2=12
VERIFY R63,R63,#12,ORRLAB ;
/*****************************************/
/*LOGICAL */
/*****************************************/
ORRLAB: ORR R5,R3,R4 ; //0x3 | 0x4 -->0x7
VERIFY R63,R5,#7,ANDLAB ;
ANDLAB: AND R5,R3,R4 ; //0x3 & 0x4 -->0
VERIFY R63,R5,#0,EORLAB ;
EORLAB: EOR R5,R3,R2 ; //0x3 ^ 0x2 -->1
VERIFY R63,R5,#1,ADD3LAB ;
/****************************************/
/*3-REGISTER ADD/SUB */
/*****************************************/
ADD3LAB: ADD R63,R2,R3 ; //3+2=5
VERIFY R63,R63,#5,SUB3LAB ;
SUB3LAB: SUB R63,R6,R4 ; //6-4=2
VERIFY R63,R63,#2,MOVRLAB ;
/*****************************************/
/*MOVE REGISTER */
/*****************************************/
MOVRLAB: MOV R63,R2 ;
VERIFY R63,R63,#2,NOPLAB ;
/*****************************************/
/*MOVE TO/FROM SPECIAL REGISTER */
/*****************************************/
MOVTFLAB: MOVTS status,R0 ;
MOVFS R63,status ;
VERIFY R63,R63,R0,MOVTFLAB ;
/*****************************************/
/*NOP */
/*****************************************/
NOPLAB: NOP ;
NOP ;
NOP ;
NOP ;
/*****************************************/
/*PASS INDICATOR */
/*****************************************/
PASSED: PASS;
IDLE;
/*****************************************/
/*FAIL INDICATOR */
/*****************************************/
FAILED: FAIL;
IDLE;
/*****************************************/
/*LONG JUMP INDICATOR */
/*****************************************/
LONGJUMP: B RETURN; //jump back to next
/*****************************************/
/*SUBROUTINE */
/*****************************************/
FUNCTION: RTS; //return from subroutine