1/* Copyright (C) 2008-2021 Free Software Foundation, Inc. 2 Contributor: Joern Rennecke <joern.rennecke@embecosm.com> 3 on behalf of Synopsys Inc. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17Under Section 7 of GPL version 3, you are granted additional 18permissions described in the GCC Runtime Library Exception, version 193.1, as published by the Free Software Foundation. 20 21You should have received a copy of the GNU General Public License and 22a copy of the GCC Runtime Library Exception along with this program; 23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24<http://www.gnu.org/licenses/>. */ 25 26#include "../arc-ieee-754.h" 27 28#if 0 /* DEBUG */ 29 .global __mulsf3 30 FUNC(__mulsf3) 31 .balign 4 32__mulsf3: 33 push_s blink 34 push_s r1 35 bl.d __mulsf3_c 36 push_s r0 37 ld_s r1,[sp,4] 38 st_s r0,[sp,4] 39 bl.d __mulsf3_asm 40 pop_s r0 41 pop_s r1 42 pop_s blink 43 cmp r0,r1 44 jeq_s [blink] 45 and r12,r0,r1 46 bic.f 0,0x7f800000,r12 47 bne 0f 48 bmsk.f 0,r0,22 49 bmsk.ne.f r1,r1,22 50 jne_s [blink] ; both NaN -> OK 510: bl abort 52 ENDFUNC(__mulsf3) 53#define __mulsf3 __mulsf3_asm 54#endif /* DEBUG */ 55 56 .balign 4 57 .global __mulsf3 58 FUNC(__mulsf3) 59__mulsf3: 60 ld.as r9,[pcl,80]; [pcl,((.L7f800000-.+2)/4)] 61 bmsk r4,r1,22 62 bset r2,r0,23 63 asl_s r2,r2,8 64 bset r3,r4,23 65 mulu64 r2,r3 66 and r11,r0,r9 67 breq.d r11,0,.Ldenorm_dbl0 68 and r12,r1,r9 69 breq.d r12,0,.Ldenorm_dbl1 70 xor_s r0,r0,r1 71 breq.d r11,r9,.Linf_nan_dbl0 72 ld.as r4,[pcl,70]; [pcl,((.L7fffffff-.+2)/4)] 73 breq.d r12,r9,.Linf_nan_dbl1 74.Lpast_denorm: 75 asl.f 0,mhi,8 76 mov r6,mhi 77 mov r7,mlo 78 add.pl r6,r6,r6 79 bclr.pl r6,r6,23 80 add.pl.f r7,r7,r7 81 add.cs r6,r6,1 82 lsr.f 0,r6,1 83 add_s r12,r12,r11 84 adc.f 0,r7,r4 85 add_s r12,r12, \ 86 -0x3f800000 87 adc.f r8,r6,r12 88 tst.pl r8,r9 89 bic r0,r0,r4 90 min r3,r8,r9 91 jpnz.d [blink] 92 add.pnz r0,r0,r3 93; infinity or denormal number 94 add.ne.f r3,r3,r3 95 asr_s r3,r3,23+1 96 bset r6,r6,23 97 bpnz.d .Linfinity 98 sub_s r3,r3,1 99 neg_s r2,r3 100 brhi.d r2,24,.Lret_r0 ; right shift shift > 24 -> return +-0 101 lsr r2,r6,r2 102 asl r9,r6,r3 103 lsr.f 0,r2,1 104 tst r7,r7 105 add_s r0,r0,r2 106 bset.ne r9,r9,0 107 adc.f 0,r9,r4 108 j_s.d [blink] 109 add.cs r0,r0,1 110.Linfinity: 111 j_s.d [blink] 112 add_s r0,r0,r9 113 114.Lret_r0: j_s [blink] 115 116 .balign 4 117.Ldenorm_dbl0: 118 bclr_s r2,r2,31 119 norm.f r4,r2 120 add_s r2,r2,r2 121 asl r2,r2,r4 122 mulu64 r2,r3 123 breq.d r12,r9,.Ldenorm_dbl0_inf_nan_dbl1 124 asl r4,r4,23 125 sub.ne.f r12,r12,r4 126 ld.as r4,[pcl,29]; [pcl,((.L7fffffff-.+2)/4)] 127 bhi.d .Lpast_denorm 128 xor_s r0,r0,r1 129 bmsk r1,r0,30 130 j_s.d [blink] 131 bic_s r0,r0,r1 132 133 .balign 4 134.Ldenorm_dbl0_inf_nan_dbl1: 135 bmsk.f 0,r0,30 136 beq_s .Lretnan 137 xor_s r0,r0,r1 138.Linf_nan_dbl1: 139 xor_s r1,r1,r0 140.Linf_nan_dbl0: 141 bclr_s r1,r1,31 142 cmp_s r1,r9 143 jls.d [blink] 144 xor_s r0,r0,r1 145; r1 NaN -> result NaN 146.Lretnan: 147 j_s.d [blink] 148 mov r0,-1 149 150 .balign 4 151.Ldenorm_dbl1: 152 breq.d r11,r9,.Linf_nan_dbl0_2 153 norm.f r3,r4 154 sub_s r3,r3,7 155 asl r4,r4,r3 156 mulu64 r2,r4 157 sub_s r3,r3,1 158 asl_s r3,r3,23 159 sub.ne.f r11,r11,r3 160 ld.as r4,[pcl,11]; [pcl,((.L7fffffff-.+2)/4)] 161 bhi.d .Lpast_denorm 162 bmsk r8,r0,30 163 j_s.d [blink] 164 bic r0,r0,r8 165 166 .balign 4 167.Linf_nan_dbl0_2: 168 bclr_s r1,r1,31 169 xor_s r0,r0,r1 170 sub.eq r1,r1,1 ; inf/nan * 0 -> nan 171 bic.f 0,r9,r1 172 j_s.d [blink] 173 or.eq r0,r0,r1 ; r1 nan -> result nan 174 175 .balign 4 176.L7f800000: 177 .long 0x7f800000 178.L7fffffff: 179 .long 0x7fffffff 180 ENDFUNC(__mulsf3) 181