| /* Tests the set flag (l.sf*) instructions. |
| |
| Copyright (C) 2017-2021 Free Software Foundation, Inc. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| # mach: or1k |
| # output: exit(0)\n |
| |
| #include "or1k-asm-test-helpers.h" |
| |
| #define INT_MAX 2147483647 /* 0x7fffffff */ |
| #define INT_MAX_MIN1 2147483646 /* 0x7ffffffe */ |
| #define NEG_INT_MAX -2147483648 /* 0x80000000 */ |
| #define NEG_INT_MAX_PL1 -2147483647 /* 0x80000001 */ |
| #define MIN1 -1 /* 0xffffffff */ |
| |
| #define SHRT_MIN (-32768) |
| #define SHRT_MAX 32767 |
| |
| #define UINT_MAX 4294967295 /* 0xffffffff */ |
| #define UINT_MAX_MIN1 4294967294 /* 0xfffffffe */ |
| |
| #define USHRT_MAX 65535 |
| |
| .macro MOVE_TO_R4_R5_AND_REPORT a, b |
| LOAD_IMMEDIATE r4, \a |
| LOAD_IMMEDIATE r5, \b |
| |
| /* During development, add REPORT_xxx statements here to see the |
| operands. */ |
| .endm |
| |
| .macro MOVE_TO_R4_AND_REPORT_I a, b |
| LOAD_IMMEDIATE r4, \a |
| |
| /* During development, add REPORT_xxx statements here to see the |
| operands. */ |
| .endm |
| |
| .macro SHOULD_BE_SET |
| OR1K_DELAYED_NOP (l.bnf failed) |
| .endm |
| |
| .macro SHOULDNT_BE_SET |
| OR1K_DELAYED_NOP (l.bf failed) |
| .endm |
| |
| .macro SHOULD_BE_LESS_THAN_SIGNED a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULDNT_BE_SET |
| l.sfne r4, r5 |
| SHOULD_BE_SET |
| l.sfgts r4, r5 |
| SHOULDNT_BE_SET |
| l.sfges r4, r5 |
| SHOULDNT_BE_SET |
| l.sfles r4, r5 |
| SHOULD_BE_SET |
| l.sflts r4, r5 |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_GREATER_THAN_SIGNED a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULDNT_BE_SET |
| l.sfne r4, r5 |
| SHOULD_BE_SET |
| l.sfgts r4, r5 |
| SHOULD_BE_SET |
| l.sfges r4, r5 |
| SHOULD_BE_SET |
| l.sfles r4, r5 |
| SHOULDNT_BE_SET |
| l.sflts r4, r5 |
| SHOULDNT_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_LESS_THAN_UNSIGNED a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULDNT_BE_SET |
| l.sfne r4, r5 |
| SHOULD_BE_SET |
| l.sfgtu r4, r5 |
| SHOULDNT_BE_SET |
| l.sfgeu r4, r5 |
| SHOULDNT_BE_SET |
| l.sfleu r4, r5 |
| SHOULD_BE_SET |
| l.sfltu r4, r5 |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_GREATER_THAN_UNSIGNED a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULDNT_BE_SET |
| l.sfne r4, r5 |
| SHOULD_BE_SET |
| l.sfgtu r4, r5 |
| SHOULD_BE_SET |
| l.sfgeu r4, r5 |
| SHOULD_BE_SET |
| l.sfleu r4, r5 |
| SHOULDNT_BE_SET |
| l.sfltu r4, r5 |
| SHOULDNT_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_EQUAL a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULD_BE_SET |
| l.sfne r4, r5 |
| SHOULDNT_BE_SET |
| |
| /* Signed tests. */ |
| l.sfgts r4, r5 |
| SHOULDNT_BE_SET |
| l.sfges r4, r5 |
| SHOULD_BE_SET |
| l.sfles r4, r5 |
| SHOULD_BE_SET |
| l.sflts r4, r5 |
| SHOULDNT_BE_SET |
| |
| /* Unsigned tests. */ |
| l.sfgtu r4, r5 |
| SHOULDNT_BE_SET |
| l.sfgeu r4, r5 |
| SHOULD_BE_SET |
| l.sfleu r4, r5 |
| SHOULD_BE_SET |
| l.sfltu r4, r5 |
| SHOULDNT_BE_SET |
| .endm |
| |
| .macro SHOULDNT_BE_EQUAL a, b |
| MOVE_TO_R4_R5_AND_REPORT \a , \b |
| |
| l.sfeq r4, r5 |
| SHOULDNT_BE_SET |
| l.sfne r4, r5 |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_EQUAL_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULD_BE_SET |
| l.sfnei r4, \b |
| SHOULDNT_BE_SET |
| |
| /* Signed tests. */ |
| l.sfgtsi r4, \b |
| SHOULDNT_BE_SET |
| l.sfgesi r4, \b |
| SHOULD_BE_SET |
| l.sflesi r4, \b |
| SHOULD_BE_SET |
| l.sfltsi r4, \b |
| SHOULDNT_BE_SET |
| |
| /* Unsigned tests. */ |
| l.sfgtui r4, \b |
| SHOULDNT_BE_SET |
| l.sfgeui r4, \b |
| SHOULD_BE_SET |
| l.sfleui r4, \b |
| SHOULD_BE_SET |
| l.sfltui r4, \b |
| SHOULDNT_BE_SET |
| .endm |
| |
| .macro SHOULDNT_BE_EQUAL_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULDNT_BE_SET |
| l.sfnei r4, \b |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_LESS_THAN_SIGNED_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULDNT_BE_SET |
| l.sfnei r4, \b |
| SHOULD_BE_SET |
| l.sfgtsi r4, \b |
| SHOULDNT_BE_SET |
| l.sfgesi r4, \b |
| SHOULDNT_BE_SET |
| l.sflesi r4, \b |
| SHOULD_BE_SET |
| l.sfltsi r4, \b |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_GREATER_THAN_SIGNED_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULDNT_BE_SET |
| l.sfnei r4, \b |
| SHOULD_BE_SET |
| l.sfgtsi r4, \b |
| SHOULD_BE_SET |
| l.sfgesi r4, \b |
| SHOULD_BE_SET |
| l.sflesi r4, \b |
| SHOULDNT_BE_SET |
| l.sfltsi r4, \b |
| SHOULDNT_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_LESS_THAN_UNSIGNED_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULDNT_BE_SET |
| l.sfnei r4, \b |
| SHOULD_BE_SET |
| l.sfgtui r4, \b |
| SHOULDNT_BE_SET |
| l.sfgeui r4, \b |
| SHOULDNT_BE_SET |
| l.sfleui r4, \b |
| SHOULD_BE_SET |
| l.sfltui r4, \b |
| SHOULD_BE_SET |
| .endm |
| |
| .macro SHOULD_BE_GREATER_THAN_UNSIGNED_I a, b |
| MOVE_TO_R4_AND_REPORT_I \a, \b |
| |
| l.sfeqi r4, \b |
| SHOULDNT_BE_SET |
| l.sfnei r4, \b |
| SHOULD_BE_SET |
| l.sfgtui r4, \b |
| SHOULD_BE_SET |
| l.sfgeui r4, \b |
| SHOULD_BE_SET |
| l.sfleui r4, \b |
| SHOULDNT_BE_SET |
| l.sfltui r4, \b |
| SHOULDNT_BE_SET |
| .endm |
| |
| STANDARD_TEST_ENVIRONMENT |
| |
| .section .text |
| start_tests: |
| PUSH LINK_REGISTER_R9 |
| |
| /* Signed tests */ |
| |
| SHOULD_BE_LESS_THAN_SIGNED 0, 1 |
| SHOULD_BE_LESS_THAN_SIGNED MIN1, 0 |
| SHOULD_BE_LESS_THAN_SIGNED INT_MAX_MIN1, INT_MAX |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, INT_MAX_MIN1 |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX_PL1, INT_MAX_MIN1 |
| SHOULD_BE_LESS_THAN_SIGNED -7, -6 |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, NEG_INT_MAX_PL1 |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, MIN1 |
| SHOULD_BE_LESS_THAN_SIGNED NEG_INT_MAX, 0 |
| |
| SHOULD_BE_GREATER_THAN_SIGNED 1, 0 |
| SHOULD_BE_GREATER_THAN_SIGNED 0, MIN1 |
| SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, INT_MAX_MIN1 |
| SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX |
| SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX |
| SHOULD_BE_GREATER_THAN_SIGNED INT_MAX, NEG_INT_MAX_PL1 |
| SHOULD_BE_GREATER_THAN_SIGNED INT_MAX_MIN1, NEG_INT_MAX_PL1 |
| SHOULD_BE_GREATER_THAN_SIGNED -6, -7 |
| SHOULD_BE_GREATER_THAN_SIGNED NEG_INT_MAX_PL1, NEG_INT_MAX |
| SHOULD_BE_GREATER_THAN_SIGNED MIN1, NEG_INT_MAX |
| SHOULD_BE_GREATER_THAN_SIGNED 0, NEG_INT_MAX |
| |
| /* See the immediate tests below. */ |
| SHOULD_BE_LESS_THAN_SIGNED 0xFFFF7FFF, 0xFFFF8000 |
| /* See the immediate tests below. */ |
| SHOULD_BE_GREATER_THAN_SIGNED 0xFFFF8001, 0xFFFF8000 |
| |
| /* Signed tests, immediate */ |
| |
| SHOULD_BE_LESS_THAN_SIGNED_I 0, 1 |
| SHOULD_BE_LESS_THAN_SIGNED_I -1, 0 |
| SHOULD_BE_LESS_THAN_SIGNED_I -7, -6 |
| |
| SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x7FFF |
| SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFFFFFF, 0x7FFF |
| /* 0x8000 gets sign-extended to 0xFFFF8000. */ |
| SHOULD_BE_LESS_THAN_SIGNED_I 0xFFFF7FFF, 0x8000 |
| /* 0x8000 gets sign-extended to 0xFFFF8000. */ |
| SHOULD_BE_GREATER_THAN_SIGNED_I 0xFFFF8001, 0x8000 |
| /* 0x8000 gets sign-extended to 0xFFFF8000. */ |
| SHOULD_BE_GREATER_THAN_SIGNED_I 0x00008000, 0x8000 |
| |
| /* Unsigned tests */ |
| |
| SHOULD_BE_LESS_THAN_UNSIGNED 0, 1 |
| SHOULD_BE_LESS_THAN_UNSIGNED UINT_MAX_MIN1, UINT_MAX |
| SHOULD_BE_GREATER_THAN_UNSIGNED 1, 0 |
| SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, UINT_MAX_MIN1 |
| SHOULD_BE_GREATER_THAN_UNSIGNED UINT_MAX, 0 |
| SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000001, 0x80000000 |
| SHOULD_BE_LESS_THAN_UNSIGNED 0x80000000, 0x80000001 |
| SHOULD_BE_GREATER_THAN_UNSIGNED 0x80000000, 0x7fffffff |
| SHOULD_BE_LESS_THAN_UNSIGNED 0x7fffffff, 0x80000000 |
| SHOULD_BE_GREATER_THAN_UNSIGNED 0x7fffffff, 0x7ffffffe |
| SHOULD_BE_LESS_THAN_UNSIGNED 0x7ffffffe, 0x7fffffff |
| SHOULD_BE_LESS_THAN_UNSIGNED 0x2024fae0, 0xfef03220 |
| |
| /* Unsigned tests, immediate */ |
| |
| SHOULD_BE_LESS_THAN_UNSIGNED_I 0, 1 |
| SHOULD_BE_GREATER_THAN_UNSIGNED_I 1, 0 |
| SHOULD_BE_LESS_THAN_UNSIGNED_I SHRT_MAX - 1, SHRT_MAX |
| SHOULD_BE_GREATER_THAN_UNSIGNED_I SHRT_MAX , SHRT_MAX - 1 |
| |
| /* The sign extension produces unexpected results here. */ |
| |
| /* 0xFFFF gets sign-extended to 0xFFFFFFFF. */ |
| SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFFFFFF - 1, 0xFFFF |
| /* 0x8000 gets sign-extended to 0xFFFF8000. */ |
| SHOULD_BE_LESS_THAN_UNSIGNED_I 0xFFFF7FFF, 0x8000 |
| |
| /* Equal tests. */ |
| |
| SHOULD_BE_EQUAL 0, 0 |
| SHOULD_BE_EQUAL UINT_MAX, UINT_MAX |
| SHOULD_BE_EQUAL MIN1, UINT_MAX |
| SHOULD_BE_EQUAL INT_MAX, INT_MAX |
| SHOULD_BE_EQUAL NEG_INT_MAX, NEG_INT_MAX |
| |
| /* Equal tests, immediate. Test the 16-to-32-bit sign extension. */ |
| |
| SHOULD_BE_EQUAL_I 0, 0 |
| SHOULD_BE_EQUAL_I 0x00007FFF, 0x7FFF |
| SHOULD_BE_EQUAL_I 0xFFFF8000, 0x8000 |
| SHOULD_BE_EQUAL_I 0xFFFFFFFF, 0xFFFF |
| |
| /* Non-equal tests. */ |
| |
| SHOULDNT_BE_EQUAL 0, 1 |
| SHOULDNT_BE_EQUAL UINT_MAX, INT_MAX |
| SHOULDNT_BE_EQUAL UINT_MAX, NEG_INT_MAX |
| SHOULDNT_BE_EQUAL MIN1, NEG_INT_MAX_PL1 |
| SHOULDNT_BE_EQUAL INT_MAX, NEG_INT_MAX |
| SHOULDNT_BE_EQUAL NEG_INT_MAX_PL1, UINT_MAX_MIN1 |
| |
| /* Non-equal tests, immediate. Test the 16-to-32-bit sign |
| extension. */ |
| |
| SHOULDNT_BE_EQUAL_I 0x00008000, 0x8000 |
| |
| POP LINK_REGISTER_R9 |
| RETURN_TO_LINK_REGISTER_R9 |
| |
| failed: |
| EXIT_SIMULATION_WITH_IMMEDIATE_EXIT_CODE SEC_GENERIC_ERROR |