345 lines · plain
1//===----------------------Hexagon builtin routine ------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8/* ==================================================================== *9 10fast2_QLDOUBLE fast2_ldadd(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {11 fast2_QLDOUBLE c;12 lint manta = a & MANTMASK;13 int expa = Q6_R_sxth_R(a) ;14 lint mantb = b & MANTMASK;15 int expb = Q6_R_sxth_R(b) ;16 int exp, expdiff, j, k, hi, lo, cn;17 lint mant;18 19 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);20 expdiff = Q6_R_sxth_R(expdiff) ;21 if (expdiff > 63) { expdiff = 62;}22 if (expa > expb) {23 exp = expa + 1;24 expa = 1;25 expb = expdiff + 1;26 } else {27 exp = expb + 1;28 expb = 1;29 expa = expdiff + 1;30 }31 mant = (manta>>expa) + (mantb>>expb);32 33 hi = (int) (mant>>32);34 lo = (int) (mant);35 36 k = Q6_R_normamt_R(hi);37 if(hi == 0 || hi == -1) k = 31+Q6_R_normamt_R(lo);38 39 mant = (mant << k);40 cn = (mant == 0x8000000000000000LL);41 exp = exp - k + cn;42 43 if (mant == 0 || mant == -1) exp = 0x8001;44 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);45 return(c);46 }47 * ==================================================================== */48 .text49 .global fast2_ldadd_asm50 .type fast2_ldadd_asm, @function51fast2_ldadd_asm:52#define manta R1:053#define lmanta R1:054#define mantb R3:255#define lmantb R3:256#define expa R457#define expb R558#define expd R659#define exp R860#define c63 R961#define lmant R1:062#define k R463#define ce P064#define zero R3:265 .falign66 {67 expa = memw(r29+#8)68 expb = memw(r29+#24)69 r7 = r070 }71 {72 expd = sub(expa, expb):sat73 ce = CMP.GT(expa, expb);74 if ( ce.new) exp = add(expa, #1)75 if (!ce.new) exp = add(expb, #1)76 } {77 expd = abs(expd):sat78 if ( ce) expa = #179 if (!ce) expb = #180 c63 = #6281 } {82 expd = MIN(expd, c63)83 manta = memd(r29+#0)84 mantb = memd(r29+#16)85 } {86 if (!ce) expa = add(expd, #1)87 if ( ce) expb = add(expd, #1)88 } {89 lmanta = ASR(lmanta, expa)90 lmantb = ASR(lmantb, expb)91 } {92 lmant = add(lmanta, lmantb)93 zero = #094 } {95 k = clb(lmant)96 c63.L =#0x000197 } {98 exp -= add(k, #-1) //exp = exp - (k-1)99 k = add(k, #-1)100 p0 = cmp.gt(k, #58)101 c63.H =#0x8000102 } {103 if(!p0)memw(r7+#8) = exp104 lmant = ASL(lmant, k)105 if(p0) jump .Ldenorma106 } {107 memd(r7+#0) = lmant108 jumpr r31109 }110.Ldenorma:111 memd(r7+#0) = zero112 {113 memw(r7+#8) = c63114 jumpr r31115 }116/* =================================================================== *117 fast2_QLDOUBLE fast2_ldsub(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {118 fast2_QLDOUBLE c;119 lint manta = a & MANTMASK;120 int expa = Q6_R_sxth_R(a) ;121 lint mantb = b & MANTMASK;122 int expb = Q6_R_sxth_R(b) ;123 int exp, expdiff, j, k;124 lint mant;125 126 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);127 expdiff = Q6_R_sxth_R(expdiff) ;128 if (expdiff > 63) { expdiff = 62;}129 if (expa > expb) {130 exp = expa + 1;131 expa = 1;132 expb = expdiff + 1;133 } else {134 exp = expb + 1;135 expb = 1;136 expa = expdiff + 1;137 }138 mant = (manta>>expa) - (mantb>>expb);139 k = Q6_R_clb_P(mant)-1;140 mant = (mant << k);141 exp = exp - k;142 if (mant == 0 || mant == -1) exp = 0x8001;143 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);144 return(c);145 }146 * ==================================================================== */147 .text148 .global fast2_ldsub_asm149 .type fast2_ldsub_asm, @function150fast2_ldsub_asm:151#define manta R1:0152#define lmanta R1:0153#define mantb R3:2154#define lmantb R3:2155#define expa R4156#define expb R5157#define expd R6158#define exp R8159#define c63 R9160#define lmant R1:0161#define k R4162#define ce P0163#define zero R3:2164 .falign165 {166 expa = memw(r29+#8)167 expb = memw(r29+#24)168 r7 = r0169 }170 {171 expd = sub(expa, expb):sat172 ce = CMP.GT(expa, expb);173 if ( ce.new) exp = add(expa, #1)174 if (!ce.new) exp = add(expb, #1)175 } {176 expd = abs(expd):sat177 if ( ce) expa = #1178 if (!ce) expb = #1179 c63 = #62180 } {181 expd = min(expd, c63)182 manta = memd(r29+#0)183 mantb = memd(r29+#16)184 } {185 if (!ce) expa = add(expd, #1)186 if ( ce) expb = add(expd, #1)187 } {188 lmanta = ASR(lmanta, expa)189 lmantb = ASR(lmantb, expb)190 } {191 lmant = sub(lmanta, lmantb)192 zero = #0193 } {194 k = clb(lmant)195 c63.L =#0x0001196 } {197 exp -= add(k, #-1) //exp = exp - (k+1)198 k = add(k, #-1)199 p0 = cmp.gt(k, #58)200 c63.H =#0x8000201 } {202 if(!p0)memw(r7+#8) = exp203 lmant = asl(lmant, k)204 if(p0) jump .Ldenorma_s205 } {206 memd(r7+#0) = lmant207 jumpr r31208 }209.Ldenorma_s:210 memd(r7+#0) = zero211 {212 memw(r7+#8) = c63213 jumpr r31214 }215 216/* ==================================================================== *217 fast2_QLDOUBLE fast2_ldmpy(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {218 fast2_QLDOUBLE c;219 lint manta = a & MANTMASK;220 int expa = Q6_R_sxth_R(a) ;221 lint mantb = b & MANTMASK;222 int expb = Q6_R_sxth_R(b) ;223 int exp, k;224 lint mant;225 int hia, hib, hi, lo;226 unsigned int loa, lob;227 228 hia = (int)(a >> 32);229 loa = Q6_R_extractu_RII((int)manta, 31, 1);230 hib = (int)(b >> 32);231 lob = Q6_R_extractu_RII((int)mantb, 31, 1);232 233 mant = Q6_P_mpy_RR(hia, lob);234 mant = Q6_P_mpyacc_RR(mant,hib, loa);235 mant = (mant >> 30) + (Q6_P_mpy_RR(hia, hib)<<1);236 237 hi = (int) (mant>>32);238 239 k = Q6_R_normamt_R(hi);240 mant = mant << k;241 exp = expa + expb - k;242 if (mant == 0 || mant == -1) exp = 0x8001;243 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);244 return(c);245 }246 * ==================================================================== */247 .text248 .global fast2_ldmpy_asm249 .type fast2_ldmpy_asm, @function250fast2_ldmpy_asm:251 252#define mantxl_ R9253#define mantxl R14254#define mantxh R15255#define mantx R15:14256#define mantbl R2257#define mantbl_ R8258#define mantbh R3259#define mantb R3:2260#define expa R4261#define expb R5262#define c8001 R8263#define mantd R7:6264#define lmantc R11:10265#define kp R9266#define min R13:12267#define minh R13268#define max R13:12269#define maxh R13270#define ret R0271 272 .falign273 {274 mantx = memd(r29+#0)275 mantb = memd(r29+#16)276 min = #0277 }278 {279 mantbl_= extractu(mantbl, #31, #1)280 mantxl_= extractu(mantxl, #31, #1)281 minh.H = #0x8000282 }283 {284 lmantc = mpy(mantxh, mantbh)285 mantd = mpy(mantxh, mantbl_)286 expa = memw(r29+#8)287 expb = memw(r29+#24)288 }289 {290 lmantc = add(lmantc, lmantc)291 mantd += mpy(mantbh, mantxl_)292 }293 {294 mantd = asr(mantd, #30)295 c8001.L = #0x0001296 p1 = cmp.eq(mantx, mantb)297 }298 {299 mantd = add(mantd, lmantc)300 expa= add(expa, expb)301 p2 = cmp.eq(mantb, min)302 }303 {304 kp = clb(mantd)305 c8001.H = #0x8000306 p1 = and(p1, p2)307 }308 {309 expa-= add(kp, #-1)310 kp = add(kp, #-1)311 if(p1) jump .Lsat312 }313 {314 mantd = asl(mantd, kp)315 memw(ret+#8) = expa316 p0 = cmp.gt(kp, #58)317 if(p0.new) jump:NT .Ldenorm //rarely happens318 }319 {320 memd(ret+#0) = mantd321 jumpr r31322 }323.Lsat:324 {325 max = #0326 expa+= add(kp, #1)327 }328 {329 maxh.H = #0x4000330 memw(ret+#8) = expa331 }332 {333 memd(ret+#0) = max334 jumpr r31335 }336.Ldenorm:337 {338 memw(ret+#8) = c8001339 mantx = #0340 }341 {342 memd(ret+#0) = mantx343 jumpr r31344 }345