Home | History | Annotate | Line # | Download | only in or1k
      1 /* Tests the set flag (l.sf*) instructions.
      2 
      3    Copyright (C) 2017-2024 Free Software Foundation, Inc.
      4 
      5    This program is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 # mach: or1k
     19 # output: exit(0)\n
     20 
     21 #include "or1k-asm-test-helpers.h"
     22 
     23 #define INT_MAX		2147483647 /* 0x7fffffff  */
     24 #define INT_MAX_MIN1	2147483646 /* 0x7ffffffe  */
     25 #define NEG_INT_MAX	-2147483648 /* 0x80000000  */
     26 #define NEG_INT_MAX_PL1	-2147483647 /* 0x80000001  */
     27 #define MIN1		-1 /* 0xffffffff  */
     28 
     29 #define SHRT_MIN	(-32768)
     30 #define SHRT_MAX	32767
     31 
     32 #define UINT_MAX	4294967295 /* 0xffffffff  */
     33 #define UINT_MAX_MIN1	4294967294 /* 0xfffffffe  */
     34 
     35 #define USHRT_MAX	65535
     36 
     37 	.macro MOVE_TO_R4_R5_AND_REPORT a, b
     38 	LOAD_IMMEDIATE r4, \a
     39 	LOAD_IMMEDIATE r5, \b
     40 
     41 	/* During development, add REPORT_xxx statements here to see the
     42 	   operands.  */
     43 	.endm
     44 
     45 	.macro MOVE_TO_R4_AND_REPORT_I a, b
     46 	LOAD_IMMEDIATE r4, \a
     47 
     48 	/* During development, add REPORT_xxx statements here to see the
     49 	   operands.  */
     50 	.endm
     51 
     52 	.macro SHOULD_BE_SET
     53 	OR1K_DELAYED_NOP (l.bnf  failed)
     54 	.endm
     55 
     56 	.macro SHOULDNT_BE_SET
     57 	OR1K_DELAYED_NOP (l.bf    failed)
     58 	.endm
     59 
     60 	.macro SHOULD_BE_LESS_THAN_SIGNED a, b
     61 	MOVE_TO_R4_R5_AND_REPORT \a , \b
     62 
     63 	l.sfeq  r4, r5
     64 	SHOULDNT_BE_SET
     65 	l.sfne  r4, r5
     66 	SHOULD_BE_SET
     67 	l.sfgts r4, r5
     68 	SHOULDNT_BE_SET
     69 	l.sfges r4, r5
     70 	SHOULDNT_BE_SET
     71 	l.sfles r4, r5
     72 	SHOULD_BE_SET
     73 	l.sflts r4, r5
     74 	SHOULD_BE_SET
     75 	.endm
     76 
     77 	.macro SHOULD_BE_GREATER_THAN_SIGNED a, b
     78 	MOVE_TO_R4_R5_AND_REPORT \a , \b
     79 
     80 	l.sfeq  r4, r5
     81 	SHOULDNT_BE_SET
     82 	l.sfne  r4, r5
     83 	SHOULD_BE_SET
     84 	l.sfgts r4, r5
     85 	SHOULD_BE_SET
     86 	l.sfges r4, r5
     87 	SHOULD_BE_SET
     88 	l.sfles r4, r5
     89 	SHOULDNT_BE_SET
     90 	l.sflts r4, r5
     91 	SHOULDNT_BE_SET
     92 	.endm
     93 
     94 	.macro SHOULD_BE_LESS_THAN_UNSIGNED a, b
     95 	MOVE_TO_R4_R5_AND_REPORT \a , \b
     96 
     97 	l.sfeq  r4, r5
     98 	SHOULDNT_BE_SET
     99 	l.sfne  r4, r5
    100 	SHOULD_BE_SET
    101 	l.sfgtu r4, r5
    102 	SHOULDNT_BE_SET
    103 	l.sfgeu r4, r5
    104 	SHOULDNT_BE_SET
    105 	l.sfleu r4, r5
    106 	SHOULD_BE_SET
    107 	l.sfltu r4, r5
    108 	SHOULD_BE_SET
    109 	.endm
    110 
    111 	.macro SHOULD_BE_GREATER_THAN_UNSIGNED a, b
    112 	MOVE_TO_R4_R5_AND_REPORT \a , \b
    113 
    114 	l.sfeq  r4, r5
    115 	SHOULDNT_BE_SET
    116 	l.sfne  r4, r5
    117 	SHOULD_BE_SET
    118 	l.sfgtu r4, r5
    119 	SHOULD_BE_SET
    120 	l.sfgeu r4, r5
    121 	SHOULD_BE_SET
    122 	l.sfleu r4, r5
    123 	SHOULDNT_BE_SET
    124 	l.sfltu r4, r5
    125 	SHOULDNT_BE_SET
    126 	.endm
    127 
    128 	.macro SHOULD_BE_EQUAL a, b
    129 	MOVE_TO_R4_R5_AND_REPORT \a , \b
    130 
    131 	l.sfeq  r4, r5
    132 	SHOULD_BE_SET
    133 	l.sfne  r4, r5
    134 	SHOULDNT_BE_SET
    135 
    136 	/* Signed tests.  */
    137 	l.sfgts r4, r5
    138 	SHOULDNT_BE_SET
    139 	l.sfges r4, r5
    140 	SHOULD_BE_SET
    141 	l.sfles r4, r5
    142 	SHOULD_BE_SET
    143 	l.sflts r4, r5
    144 	SHOULDNT_BE_SET
    145 
    146 	/* Unsigned tests.  */
    147 	l.sfgtu r4, r5
    148 	SHOULDNT_BE_SET
    149 	l.sfgeu r4, r5
    150 	SHOULD_BE_SET
    151 	l.sfleu r4, r5
    152 	SHOULD_BE_SET
    153 	l.sfltu r4, r5
    154 	SHOULDNT_BE_SET
    155 	.endm
    156 
    157 	.macro SHOULDNT_BE_EQUAL a, b
    158 	MOVE_TO_R4_R5_AND_REPORT \a , \b
    159 
    160 	l.sfeq  r4, r5
    161 	SHOULDNT_BE_SET
    162 	l.sfne  r4, r5
    163 	SHOULD_BE_SET
    164 	.endm
    165 
    166 	.macro SHOULD_BE_EQUAL_I a, b
    167 	MOVE_TO_R4_AND_REPORT_I \a, \b
    168 
    169 	l.sfeqi  r4, \b
    170 	SHOULD_BE_SET
    171 	l.sfnei  r4, \b
    172 	SHOULDNT_BE_SET
    173 
    174 	/* Signed tests.  */
    175 	l.sfgtsi r4, \b
    176 	SHOULDNT_BE_SET
    177 	l.sfgesi r4, \b
    178 	SHOULD_BE_SET
    179 	l.sflesi r4, \b
    180 	SHOULD_BE_SET
    181 	l.sfltsi r4, \b
    182 	SHOULDNT_BE_SET
    183 
    184 	/* Unsigned tests.  */
    185 	l.sfgtui r4, \b
    186 	SHOULDNT_BE_SET
    187 	l.sfgeui r4, \b
    188 	SHOULD_BE_SET
    189 	l.sfleui r4, \b
    190 	SHOULD_BE_SET
    191 	l.sfltui r4, \b
    192 	SHOULDNT_BE_SET
    193 	.endm
    194 
    195 	.macro SHOULDNT_BE_EQUAL_I a, b
    196 	MOVE_TO_R4_AND_REPORT_I \a, \b
    197 
    198 	l.sfeqi  r4, \b
    199 	SHOULDNT_BE_SET
    200 	l.sfnei  r4, \b
    201 	SHOULD_BE_SET
    202 	.endm
    203 
    204 	.macro SHOULD_BE_LESS_THAN_SIGNED_I a, b
    205 	MOVE_TO_R4_AND_REPORT_I \a, \b
    206 
    207 	l.sfeqi  r4, \b
    208 	SHOULDNT_BE_SET
    209 	l.sfnei  r4, \b
    210 	SHOULD_BE_SET
    211 	l.sfgtsi r4, \b
    212 	SHOULDNT_BE_SET
    213 	l.sfgesi r4, \b
    214 	SHOULDNT_BE_SET
    215 	l.sflesi r4, \b
    216 	SHOULD_BE_SET
    217 	l.sfltsi r4, \b
    218 	SHOULD_BE_SET
    219 	.endm
    220 
    221 	.macro SHOULD_BE_GREATER_THAN_SIGNED_I a, b
    222 	MOVE_TO_R4_AND_REPORT_I \a, \b
    223 
    224 	l.sfeqi  r4, \b
    225 	SHOULDNT_BE_SET
    226 	l.sfnei  r4, \b
    227 	SHOULD_BE_SET
    228 	l.sfgtsi r4, \b
    229 	SHOULD_BE_SET
    230 	l.sfgesi r4, \b
    231 	SHOULD_BE_SET
    232 	l.sflesi r4, \b
    233 	SHOULDNT_BE_SET
    234 	l.sfltsi r4, \b
    235 	SHOULDNT_BE_SET
    236 	.endm
    237 
    238 	.macro SHOULD_BE_LESS_THAN_UNSIGNED_I a, b
    239 	MOVE_TO_R4_AND_REPORT_I \a, \b
    240 
    241 	l.sfeqi  r4, \b
    242 	SHOULDNT_BE_SET
    243 	l.sfnei  r4, \b
    244 	SHOULD_BE_SET
    245 	l.sfgtui r4, \b
    246 	SHOULDNT_BE_SET
    247 	l.sfgeui r4, \b
    248 	SHOULDNT_BE_SET
    249 	l.sfleui r4, \b
    250 	SHOULD_BE_SET
    251 	l.sfltui r4, \b
    252 	SHOULD_BE_SET
    253 	.endm
    254 
    255 	.macro SHOULD_BE_GREATER_THAN_UNSIGNED_I a, b
    256 	MOVE_TO_R4_AND_REPORT_I \a, \b
    257 
    258 	l.sfeqi  r4, \b
    259 	SHOULDNT_BE_SET
    260 	l.sfnei  r4, \b
    261 	SHOULD_BE_SET
    262 	l.sfgtui r4, \b
    263 	SHOULD_BE_SET
    264 	l.sfgeui r4, \b
    265 	SHOULD_BE_SET
    266 	l.sfleui r4, \b
    267 	SHOULDNT_BE_SET
    268 	l.sfltui r4, \b
    269 	SHOULDNT_BE_SET
    270 	.endm
    271 
    272 	STANDARD_TEST_ENVIRONMENT
    273 
    274 	.section .text
    275 start_tests:
    276 	PUSH LINK_REGISTER_R9
    277 
    278 	/* Signed tests  */
    279 
    280 	SHOULD_BE_LESS_THAN_SIGNED 0, 1
    281 	SHOULD_BE_LESS_THAN_SIGNED MIN1, 0
    282 	SHOULD_BE_LESS_THAN_SIGNED INT_MAX_MIN1, INT_MAX
    283 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX
    284 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX_MIN1
    285 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX
    286 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX_MIN1
    287 	SHOULD_BE_LESS_THAN_SIGNED -7, -6
    288 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, NEG_INT_MAX_PL1
    289 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, MIN1
    290 	SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, 0
    291 
    292 	SHOULD_BE_GREATER_THAN_SIGNED 1, 0
    293 	SHOULD_BE_GREATER_THAN_SIGNED 0, MIN1
    294 	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, INT_MAX_MIN1
    295 	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX
    296 	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX
    297 	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX_PL1
    298 	SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX_PL1
    299 	SHOULD_BE_GREATER_THAN_SIGNED -6, -7
    300 	SHOULD_BE_GREATER_THAN_SIGNED NEG_INT_MAX_PL1, NEG_INT_MAX
    301 	SHOULD_BE_GREATER_THAN_SIGNED MIN1, NEG_INT_MAX
    302 	SHOULD_BE_GREATER_THAN_SIGNED 0, NEG_INT_MAX
    303 
    304 	/* See the immediate tests below.  */
    305 	SHOULD_BE_LESS_THAN_SIGNED 0xFFFF7FFF, 0xFFFF8000
    306 	/* See the immediate tests below.  */
    307 	SHOULD_BE_GREATER_THAN_SIGNED 0xFFFF8001, 0xFFFF8000
    308 
    309 	/* Signed tests, immediate  */
    310 
    311 	SHOULD_BE_LESS_THAN_SIGNED_I	0,  1
    312 	SHOULD_BE_LESS_THAN_SIGNED_I  -1,  0
    313 	SHOULD_BE_LESS_THAN_SIGNED_I  -7, -6
    314 
    315 	SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x7FFF
    316 	SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFFFFFF, 0x7FFF
    317 	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
    318 	SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFF7FFF, 0x8000
    319 	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
    320 	SHOULD_BE_GREATER_THAN_SIGNED_I 0xFFFF8001, 0x8000
    321 	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
    322 	SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x8000
    323 
    324 	/* Unsigned tests  */
    325 
    326 	SHOULD_BE_LESS_THAN_UNSIGNED 0, 1
    327 	SHOULD_BE_LESS_THAN_UNSIGNED UINT_MAX_MIN1, UINT_MAX
    328 	SHOULD_BE_GREATER_THAN_UNSIGNED 1, 0
    329 	SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, UINT_MAX_MIN1
    330 	SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, 0
    331 	SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000001,  0x80000000
    332 	SHOULD_BE_LESS_THAN_UNSIGNED 0x80000000,  0x80000001
    333 	SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000000, 0x7fffffff
    334 	SHOULD_BE_LESS_THAN_UNSIGNED 0x7fffffff,  0x80000000
    335 	SHOULD_BE_GREATER_THAN_UNSIGNED 0x7fffffff,  0x7ffffffe
    336 	SHOULD_BE_LESS_THAN_UNSIGNED 0x7ffffffe,  0x7fffffff
    337 	SHOULD_BE_LESS_THAN_UNSIGNED 0x2024fae0,  0xfef03220
    338 
    339 	/* Unsigned tests, immediate  */
    340 
    341 	SHOULD_BE_LESS_THAN_UNSIGNED_I 0, 1
    342 	SHOULD_BE_GREATER_THAN_UNSIGNED_I 1, 0
    343 	SHOULD_BE_LESS_THAN_UNSIGNED_I	 SHRT_MAX - 1, SHRT_MAX
    344 	SHOULD_BE_GREATER_THAN_UNSIGNED_I SHRT_MAX	 , SHRT_MAX - 1
    345 
    346 	/* The sign extension produces unexpected results here.  */
    347 
    348 	/* 0xFFFF gets sign-extended to 0xFFFFFFFF.  */
    349 	SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFFFFFF - 1, 0xFFFF
    350 	/* 0x8000 gets sign-extended to 0xFFFF8000.  */
    351 	SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFF7FFF, 0x8000
    352 
    353 	/* Equal tests.  */
    354 
    355 	SHOULD_BE_EQUAL 0, 0
    356 	SHOULD_BE_EQUAL UINT_MAX, UINT_MAX
    357 	SHOULD_BE_EQUAL MIN1, UINT_MAX
    358 	SHOULD_BE_EQUAL INT_MAX, INT_MAX
    359 	SHOULD_BE_EQUAL NEG_INT_MAX, NEG_INT_MAX
    360 
    361 	/* Equal tests, immediate.  Test the 16-to-32-bit sign extension.  */
    362 
    363 	SHOULD_BE_EQUAL_I 0, 0
    364 	SHOULD_BE_EQUAL_I 0x00007FFF, 0x7FFF
    365 	SHOULD_BE_EQUAL_I 0xFFFF8000, 0x8000
    366 	SHOULD_BE_EQUAL_I 0xFFFFFFFF, 0xFFFF
    367 
    368 	/* Non-equal tests.  */
    369 
    370 	SHOULDNT_BE_EQUAL 0, 1
    371 	SHOULDNT_BE_EQUAL UINT_MAX, INT_MAX
    372 	SHOULDNT_BE_EQUAL UINT_MAX, NEG_INT_MAX
    373 	SHOULDNT_BE_EQUAL MIN1, NEG_INT_MAX_PL1
    374 	SHOULDNT_BE_EQUAL INT_MAX, NEG_INT_MAX
    375 	SHOULDNT_BE_EQUAL NEG_INT_MAX_PL1, UINT_MAX_MIN1
    376 
    377 	/* Non-equal tests, immediate.  Test the 16-to-32-bit sign
    378 	   extension.  */
    379 
    380 	SHOULDNT_BE_EQUAL_I 0x00008000, 0x8000
    381 
    382 	POP LINK_REGISTER_R9
    383 	RETURN_TO_LINK_REGISTER_R9
    384 
    385 failed:
    386 	EXIT_SIMULATION_WITH_IMMEDIATE_EXIT_CODE SEC_GENERIC_ERROR
    387