Home | History | Annotate | Line # | Download | only in or1k
      1 /* Tests some basic unordered fpu compare instructions.
      2 
      3    Copyright (C) 2019-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: report(0x40490fd0);\n
     20 # output: report(0x402df84d);\n
     21 # output: report(0x7fc00000);\n
     22 # output: \n
     23 # output: report(0x00000001);\n
     24 # output: \n
     25 # output: report(0x00000000);\n
     26 # output: \n
     27 # output: report(0x00000001);\n
     28 # output: \n
     29 # output: report(0x00000001);\n
     30 # output: \n
     31 # output: exit(0)\n
     32 
     33 #include "or1k-asm-test-helpers.h"
     34 
     35 	STANDARD_TEST_ENVIRONMENT
     36 
     37 	.section .data
     38 	.align 4
     39 	.type   pi, @object
     40 	.size   pi, 4
     41 anchor:
     42 pi:
     43 	.float  3.14159
     44 
     45 	.type   e, @object
     46 	.size   e, 4
     47 e:
     48 	.float  2.71828
     49 
     50 	.section .text
     51 start_tests:
     52 	PUSH LINK_REGISTER_R9
     53 
     54 	/* Test unordered float comparisons.  Setting up:
     55 	 *  r11      pointer to data
     56 	 *  r12  pi  as float
     57 	 *  r13  e   as float
     58 	 *  r16  nan as float
     59 	 */
     60 	l.movhi	r11, ha(anchor)
     61 	l.addi	r11, r11, lo(anchor)
     62 	l.lwz	r12, 0(r11)
     63 
     64 	l.lwz	r13, 4(r11)
     65 
     66 	/* Make a NaN.  */
     67 	lf.sub.s r16, r13, r13
     68 	lf.div.s r16, r16, r16
     69 
     70 	/* Output to ensure we loaded it correctly.  */
     71 	REPORT_REG_TO_CONSOLE r12
     72 	REPORT_REG_TO_CONSOLE r13
     73 	REPORT_REG_TO_CONSOLE r16
     74 	PRINT_NEWLINE_TO_CONSOLE
     75 
     76 	lf.sfuge.s r12, r13
     77 	MOVE_FROM_SPR r2, SPR_SR
     78 	REPORT_BIT_TO_CONSOLE r2, SPR_SR_F
     79 	PRINT_NEWLINE_TO_CONSOLE
     80 
     81 	lf.sfun.s r12, r13
     82 	MOVE_FROM_SPR r2, SPR_SR
     83 	REPORT_BIT_TO_CONSOLE r2, SPR_SR_F
     84 	PRINT_NEWLINE_TO_CONSOLE
     85 
     86 	lf.sfun.s r12, r16
     87 	MOVE_FROM_SPR r2, SPR_SR
     88 	REPORT_BIT_TO_CONSOLE r2, SPR_SR_F
     89 	PRINT_NEWLINE_TO_CONSOLE
     90 
     91 	lf.sfueq.s r12, r12
     92 	MOVE_FROM_SPR r2, SPR_SR
     93 	REPORT_BIT_TO_CONSOLE r2, SPR_SR_F
     94 	PRINT_NEWLINE_TO_CONSOLE
     95 
     96 	POP LINK_REGISTER_R9
     97 	RETURN_TO_LINK_REGISTER_R9
     98