1/* Tests the set flag (l.sf*) instructions. 2 3 Copyright (C) 2017-2023 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 275start_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 385failed: 386 EXIT_SIMULATION_WITH_IMMEDIATE_EXIT_CODE SEC_GENERIC_ERROR 387