Home | History | Annotate | Line # | Download | only in mips
      1 # MIPS simulator testsuite utility functions.
      2 # Copyright (C) 2004-2024 Free Software Foundation, Inc.
      3 # Contributed by Chris Demetriou of Broadcom Corporation.
      4 #
      5 # This file is part of the GNU simulators.
      6 #
      7 # This program is free software; you can redistribute it and/or modify
      8 # it under the terms of the GNU General Public License as published by
      9 # the Free Software Foundation; either version 3 of the License, or
     10 # (at your option) any later version.
     11 #
     12 # This program is distributed in the hope that it will be useful,
     13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 # GNU General Public License for more details.
     16 #
     17 # You should have received a copy of the GNU General Public License
     18 # along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 
     21 # $1, $4, $5, %6, are used as temps by the macros defined here.
     22 
     23 	.macro writemsg msg
     24 	la	$5, 901f
     25 	li	$6, 902f - 901f
     26 	.data
     27 901:	.ascii	"\msg\n"
     28 902:
     29 	.previous
     30 	.set push
     31 	.set noreorder
     32 	jal	_dowrite
     33 	li	$4, 0
     34 	.set pop
     35 	.endm
     36 
     37 
     38 	# The MIPS simulator uses "break 0x3ff" as the code to exit,
     39 	# with the return value in $4 (a0).
     40 	.macro exit rc
     41 	li	$4, \rc
     42 	break	0x3ff
     43 	.endm
     44 
     45 
     46 	.macro setup
     47 
     48 	.global _start
     49 	.global __start
     50 	.ent _start
     51 _start:
     52 __start:
     53 	.set push
     54 	.set noreorder
     55 	j	DIAG
     56 	nop
     57 	.set pop
     58 	.end _start
     59 
     60 	.global _fail
     61 	.ent _fail
     62 _fail:
     63 	writemsg "fail"
     64 	exit 1
     65 	.end _fail
     66 
     67 	.global _pass
     68 	.ent _pass
     69 _pass:
     70 	writemsg "pass"
     71 	exit 0
     72 	.end _pass
     73 
     74 	# The MIPS simulator can use multiple different monitor types,
     75 	# so we hard-code the simulator "write" reserved instruction opcode,
     76 	# rather than jumping to a vector that invokes it.  The operation
     77 	# expects RA to point to the location at which to continue
     78 	# after writing.
     79 	.global _dowrite
     80 	.ent _dowrite
     81 _dowrite:
     82 	# Write opcode (reserved instruction).  See sim_monitor and its
     83 	# callers in sim/mips/interp.c.
     84 	.word	0x00000039 | ((8 << 1) << 6)
     85 	.end _dowrite
     86 
     87 	.endm	# setup
     88 
     89 
     90 	.macro pass
     91 	.set push
     92 	.set noreorder
     93 	j	_pass
     94 	nop
     95 	.set pop
     96 	.endm
     97 
     98 
     99 	.macro fail
    100 	.set push
    101 	.set noreorder
    102 	j	_fail
    103 	nop
    104 	.set pop
    105 	.endm
    106 
    107 
    108 	.macro load32 reg, val
    109 	li	\reg, \val
    110 	.endm
    111 
    112 
    113 	.macro load64 reg, val
    114 	dli	\reg, \val
    115 	.endm
    116 
    117 
    118 	.macro loadaddr reg, addr
    119 	la	\reg, \addr
    120 	.endm
    121 
    122 
    123 	.macro checkreg reg, expreg
    124 	.set push
    125 	.set noat
    126 	.set noreorder
    127 	beq	\expreg, \reg, 901f
    128 	nop
    129 	fail
    130 901:
    131 	.set pop
    132 	.endm
    133 
    134 
    135 	.macro check32 reg, val
    136 	.set push
    137 	.set noat
    138 	load32	$1, \val
    139 	checkreg \reg, $1
    140 	.set pop
    141 	.endm
    142 
    143 
    144 	.macro check64 reg, val
    145 	.set push
    146 	.set noat
    147 	load64	$1, \val
    148 	checkreg \reg, $1
    149 	.set pop
    150 	.endm
    151 
    152 
    153 	# Check hi-lo register pair against data stored at base+o1 and base+o2
    154 	# Clobbers $1 - $5
    155 	.macro checkpair lo, hi, base, w, o1, o2
    156 	move  $2, \lo
    157 	move  $3, \hi
    158 	.set noat
    159 	la   $1, \base
    160 	l\w	$4, \o1($1)
    161 	l\w	$5, \o2($1)
    162 	.set at
    163 	checkreg  $2, $4
    164 	checkreg  $3, $5
    165 	.endm
    166 
    167 	.macro checkpair_le_d lo, hi, base
    168 	checkpair \lo, \hi, \base, w, 0, 4
    169 	.endm
    170 
    171 	.macro checkpair_be_d lo, hi, base
    172 	checkpair \lo, \hi, \base, w, 4, 0
    173 	.endm
    174 
    175 	.macro checkpair_le_q lo, hi, base
    176 	checkpair \lo, \hi, \base, d, 0, 8
    177 	.endm
    178 
    179 	.macro checkpair_be_q lo, hi, base
    180 	checkpair \lo, \hi, \base, d, 8, 0
    181 	.endm
    182 
    183 	# Endian-ness for comparison is determined by reading a word at ec
    184 	.macro checkpair_xendian lo, hi, base, ec, w
    185 	.set noat
    186 	lw   $1, \ec
    187 	andi $1, $1, 0x1
    188 	# check endianess
    189 	beqz  $1, 2f
    190 	.set at
    191 1: # big endian
    192 	checkpair_be_\w \lo, \hi, \base
    193 	b 3f
    194 2: # little endian
    195 	checkpair_le_\w \lo, \hi, \base
    196 3:
    197 	.endm
    198 
    199 	.macro checkpair_qword lo, hi, base, oe
    200 	checkpair_xendian \lo, \hi, \base, \oe, q
    201 	.endm
    202 
    203 	.macro checkpair_dword lo, hi, base, oe
    204 	checkpair_xendian \lo, \hi, \base, \oe, d
    205 	.endm
    206