Home | History | Annotate | Download | only in epiphany
      1 ;; -*-asm-*-
      2 
      3 	TABLE=0x8000
      4 	RZ=r63
      5 
      6 	.macro FAIL
      7 	mov	r0,#1
      8 	trap	3
      9 	.endm
     10 
     11 	.macro PASS
     12 	mov	r0,#0
     13 	trap	3
     14 	.endm
     15 
     16 
     17 	.macro VERIFY ra,rb,ref,label
     18 	sub	\ra,\rb,\ref
     19 	beq	\label
     20 	FAIL
     21 	.endm
     22 
     23 
     24 /*****************************************/
     25 /*INITIALIZING REGISTERS                 */
     26 /*****************************************/
     27 /*Check that sum is correct*/
     28 START:	MOV R0, #TABLE   ; //Setting R0 to TABLE
     29 	LSL R0,R0,#2	 ; //Create 00020000
     30 
     31 	;; Load r1.63 with 1..63
     32 	.irpc num,63
     33 	mov r\num,#\num
     34 	.endr
     35 
     36 
     37 	;; Sum the registers
     38 	.irpc num,62
     39 	add r63,r63,r\num
     40 	.endr
     41 
     42 	mov r62,#2016	 ;//Correct sum of 1..63 = 63*32 + 63
     43 	VERIFY	r63,r63,R62,BRANCH1;//CHECK SUM
     44 
     45 
     46 /*****************************************/
     47 /*BRANCHING                              */
     48 /*****************************************/
     49 //Check that all condition codes work
     50 BRANCH1:	BEQ  BRANCH2     ; //taken
     51 	FAIL	         ;
     52 	FAIL		 ;
     53 	FAIL		 ;
     54 	FAIL             ;
     55 BRANCH2:	BNE  FAIL_BRANCH ; //not taken
     56 BRANCH3:	BGT  FAIL_BRANCH ; //not taken
     57 BRANCH4:	BGTE BRANCH5     ; //taken
     58 	FAIL		;
     59 BRANCH5:	BLTE BRANCH6	; //taken
     60 	FAIL		;
     61 BRANCH6:	BLT  FAIL_BRANCH ; //not taken
     62 BRANCH8:	B    LONGJUMP    ; //taken
     63 	FAIL		 ;
     64 RETURN:	bl  FUNCTION	 ; //jump to subroutine
     65 	MOV R63,JARLAB   ;//REGISTER JUMP
     66 	JR  R63		 ;
     67 	FAIL		 ;
     68 JARLAB:	MOV R63,FUNCTION ; //REGISTER CALL
     69 	JALR R63		 ; //16 bit
     70         B    NEXT	 ; //jump over fail
     71 	FAIL		;
     72 
     73 FAIL_BRANCH:	FAIL	; //fail branch
     74 
     75 /*****************************************/
     76 /*LOAD-STORE DISPLACEMENT                */
     77 /*****************************************/
     78 //Check max displacement value(0xf)
     79 //Check that offset is correct
     80 //all load/stores are aligned
     81 //this gives greater range(2 more bits)
     82 //offset is shifted by 2x bits
     83 
     84 NEXT:	STRB R4,[R0,#0x0] ;//Store Byte
     85 	LDRB R63,[R0,#0x0] ;//Load Byte
     86 	VERIFY	R63,R63,R4,STOREB  ;
     87 
     88 STOREB:	STRB R5,[R0,#0xf] ;//Store Byte
     89 	LDRB R63,[R0,#0xf] ;//Load Byte
     90 	VERIFY	R63,R63,R5,STORES  ;
     91 
     92 STORES:	STRH R4,[R0,#0x0] ;//Store Short
     93 	LDRH R63,[R0,#0x0] ;//Load Short
     94 	VERIFY	R63,R63,R4,STORES2  ;
     95 
     96 STORES2:	STRH R5,[R0,#0xe] ;//Store Short
     97 	LDRH R63,[R0,#0xe] ;//Load Short
     98 	VERIFY	R63,R63,R5,STORE  ;
     99 
    100 STORE:	STR  R4,[R0,#0x0] ;//Store Word
    101 	LDR  R63,[R0,#0x0] ;//Load Word
    102 	VERIFY	R63,R63,R4,STORE2  ;
    103 
    104 STORE2:	STR  R5,[R0,#0xc] ;//Store Word
    105 	LDR  R63,[R0,#0xc] ;//Load Word
    106 	VERIFY	R63,R63,R5,STOREBI ;
    107 
    108 
    109 /*****************************************/
    110 /*LOAD-STORE INDEX                       */
    111 /*****************************************/
    112 
    113 STOREBI:	STRB R4,[R0,R4]	 ;//Store Word
    114 	LDRB R63,[R0,R4]	 ;//Load Word
    115 	VERIFY	R63,R63,R4,STORESI	;
    116 
    117 STORESI:	STRH R5,[R0,R4]	 ;//Store Word
    118 	LDRH R63,[R0,R4]	 ;//Load Word
    119 	VERIFY	R63,R63,R5,STOREI	 ;
    120 
    121 STOREI:	STR  R6,[R0,R4]	 ;//Store Word
    122 	LDR  R63,[R0,R4]	 ;//Load Word
    123 	VERIFY	R63,R63,R6,PMB	 ;
    124 
    125 /*****************************************/
    126 /*LOAD-STORE POSTMODIFY                  */
    127 /*****************************************/
    128 
    129 PMB:	STRB R4,[R0],R4	 ;//Store Word
    130 	SUB  R0,R0,#0x4	 ;//restoring R0
    131 	LDRB R63,[R0],R4	 ;//Load Word
    132 	SUB  R0,R0,#0x4	 ;//restoring R0
    133 	VERIFY	R63,R63,R4,PMS	 ;
    134 
    135 PMS:	STRH R5,[R0],R4	 ;//Store Word
    136 	SUB  R0,R0,#0x4	 ;//restoring R0
    137 	LDRH R63,[R0],R4	 ;//Load Word
    138 	VERIFY	R63,R63,R5,PM	 ;
    139 
    140 PM:	SUB  R0,R0,#0x4	 ;//restoring R0
    141 	STR  R6,[R0],R4	 ;//Store Word
    142 	SUB  R0,R0,#0x4	 ;//restoring R0
    143 	LDR  R63,[R0],R4	 ;//Load Word
    144 	SUB  R0,R0,#0x4	 ;//restoring R0
    145 	VERIFY	R63,R63,R6,MOVLAB	 ;
    146 
    147 
    148 
    149 /*****************************************/
    150 /*IMMEDIATE LOAD                         */
    151 /*****************************************/
    152 MOVLAB:	MOV R63,#0xFF;
    153 	MOV R1,#0xFF;
    154 	VERIFY	R63,R63,R1,ADDLAB	;
    155 
    156 /*****************************************/
    157 /*2 REG ADD/SUB PROCESSING               */
    158 /*****************************************/
    159 ADDLAB:	ADD R63,R2,#3;	//2+3=5
    160 	VERIFY	R63,R63,#5,SUBLAB	;
    161 SUBLAB:	SUB R63,R2,#1;	//2+1=1
    162 	VERIFY	R63,R63,#1,LSRLAB	;
    163 
    164 /*****************************************/
    165 /*SHIFTS                                 */
    166 /*****************************************/
    167 //Note ASR does not work
    168 
    169 	//Immediates
    170 LSRLAB:	LSR R63,R6,#0x2   ; //6>>2=1
    171 	VERIFY	R63,R63,#1,LSLLAB	 ;
    172 LSLLAB:	LSL R63,R3,#0x2   ; //3<<2=12
    173 	VERIFY	R63,R63,#12,LSRILAB	;
    174 	//Registers
    175 LSRILAB:	LSR R63,R6,R2     ; //6>>2=1
    176 	VERIFY	R63,R63,#1,LSLILAB	 ;
    177 LSLILAB:	LSL R63,R3,R2     ; //3<<2=12
    178 	VERIFY	R63,R63,#12,ORRLAB	;
    179 
    180 
    181 /*****************************************/
    182 /*LOGICAL                                */
    183 /*****************************************/
    184 ORRLAB:	ORR R5,R3,R4     ; //0x3 | 0x4 -->0x7
    185 	VERIFY	R63,R5,#7,ANDLAB	 ;
    186 ANDLAB:	AND R5,R3,R4     ; //0x3 & 0x4 -->0
    187 	VERIFY	R63,R5,#0,EORLAB	 ;
    188 EORLAB:	EOR R5,R3,R2     ; //0x3 ^ 0x2 -->1
    189 	VERIFY	R63,R5,#1,ADD3LAB	 ;
    190 
    191 
    192 /****************************************/
    193 /*3-REGISTER ADD/SUB                     */
    194 /*****************************************/
    195 ADD3LAB:	ADD R63,R2,R3    ; //3+2=5
    196 	VERIFY	R63,R63,#5,SUB3LAB	 ;
    197 SUB3LAB:	SUB R63,R6,R4    ; //6-4=2
    198 	VERIFY	R63,R63,#2,MOVRLAB	 ;
    199 
    200 /*****************************************/
    201 /*MOVE REGISTER                          */
    202 /*****************************************/
    203 MOVRLAB:	MOV R63,R2	;
    204 	VERIFY	R63,R63,#2,NOPLAB	 ;
    205 
    206 /*****************************************/
    207 /*MOVE TO/FROM SPECIAL REGISTER          */
    208 /*****************************************/
    209 MOVTFLAB:	MOVTS status,R0	;
    210 	MOVFS R63,status	;
    211 	VERIFY	R63,R63,R0,MOVTFLAB	;
    212 
    213 
    214 /*****************************************/
    215 /*NOP                                    */
    216 /*****************************************/
    217 NOPLAB:	NOP		;
    218 	NOP		;
    219 	NOP		;
    220 	NOP		;
    221 
    222 /*****************************************/
    223 /*PASS INDICATOR                         */
    224 /*****************************************/
    225 PASSED:	PASS;
    226 	IDLE;
    227 /*****************************************/
    228 /*FAIL INDICATOR                         */
    229 /*****************************************/
    230 FAILED:	FAIL;
    231 	IDLE;
    232 
    233 /*****************************************/
    234 /*LONG JUMP INDICATOR                    */
    235 /*****************************************/
    236 LONGJUMP:	B RETURN; //jump back to next
    237 /*****************************************/
    238 /*SUBROUTINE                             */
    239 /*****************************************/
    240 FUNCTION:	RTS;      //return from subroutine
    241