1 //===----------------------Hexagon builtin routine ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 /* ==================================================================== */
10 /* FUNCTIONS Optimized double floating point operators */
11 /* ==================================================================== */
12 /* c = dadd_asm(a, b) */
13 /* ==================================================================== *
14 fast2_QDOUBLE fast2_dadd(fast2_QDOUBLE a,fast2_QDOUBLE b) {
16 lint manta = a & MANTMASK;
17 int expa = Q6_R_sxth_R(a) ;
18 lint mantb = b & MANTMASK;
19 int expb = Q6_R_sxth_R(b) ;
20 int exp, expdiff, j, k, hi, lo, cn;
23 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);
24 expdiff = Q6_R_sxth_R(expdiff) ;
25 if (expdiff > 63) { expdiff = 62;}
35 mant = (manta>>expa) + (mantb>>expb);
37 hi = (int) (mant>>32);
40 k = Q6_R_normamt_R(hi);
41 if(hi == 0 || hi == -1) k = 31+Q6_R_normamt_R(lo);
44 cn = (mant == 0x8000000000000000LL);
47 if (mant == 0 || mant == -1) exp = 0x8001;
48 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
51 * ==================================================================== */
53 .global fast2_dadd_asm
54 .type fast2_dadd_asm, @function
71 #define minmin R11:10 // exactly 0x000000000000008001LL
77 mantexpd = VABSDIFFH(mantexpa, mantexpb) //represented as 0x08001LL
83 ce = CMP.GT(expa, expb);
84 if ( ce.new) exp = add(expa, #1)
85 if (!ce.new) exp = add(expb, #1)
92 if (!ce) expa = add(expd, #1)
93 if ( ce) expb = add(expd, #1)
97 lmanta = ASR(lmanta, expa)
98 lmantb = ASR(lmantb, expb)
100 lmant = add(lmanta, lmantb)
109 mantexpa = ASL(lmant, k)
111 if(p0) jump .Ldenorma
113 manta = insert(exp, #16, #0)
121 /* =================================================================== *
122 fast2_QDOUBLE fast2_dsub(fast2_QDOUBLE a,fast2_QDOUBLE b) {
124 lint manta = a & MANTMASK;
125 int expa = Q6_R_sxth_R(a) ;
126 lint mantb = b & MANTMASK;
127 int expb = Q6_R_sxth_R(b) ;
128 int exp, expdiff, j, k;
131 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);
132 expdiff = Q6_R_sxth_R(expdiff) ;
133 if (expdiff > 63) { expdiff = 62;}
143 mant = (manta>>expa) - (mantb>>expb);
144 k = Q6_R_clb_P(mant)-1;
147 if (mant == 0 || mant == -1) exp = 0x8001;
148 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
151 * ==================================================================== */
153 .global fast2_dsub_asm
154 .type fast2_dsub_asm, @function
158 #define mantexpa R1:0
161 #define mantexpb R3:2
165 #define mantexpd R7:6
172 #define minmin R11:10 // exactly 0x000000000000008001LL
178 mantexpd = VABSDIFFH(mantexpa, mantexpb) //represented as 0x08001LL
184 ce = CMP.GT(expa, expb);
185 if ( ce.new) exp = add(expa, #1)
186 if (!ce.new) exp = add(expb, #1)
191 expd = MIN(expd, c63)
193 if (!ce) expa = add(expd, #1)
194 if ( ce) expb = add(expd, #1)
198 lmanta = ASR(lmanta, expa)
199 lmantb = ASR(lmantb, expb)
201 lmant = sub(lmanta, lmantb)
210 mantexpa = ASL(lmant, k)
214 manta = insert(exp, #16, #0)
222 /* ==================================================================== *
223 fast2_QDOUBLE fast2_dmpy(fast2_QDOUBLE a,fast2_QDOUBLE b) {
225 lint manta = a & MANTMASK;
226 int expa = Q6_R_sxth_R(a) ;
227 lint mantb = b & MANTMASK;
228 int expb = Q6_R_sxth_R(b) ;
231 int hia, hib, hi, lo;
232 unsigned int loa, lob;
234 hia = (int)(a >> 32);
235 loa = Q6_R_extractu_RII((int)manta, 31, 1);
236 hib = (int)(b >> 32);
237 lob = Q6_R_extractu_RII((int)mantb, 31, 1);
239 mant = Q6_P_mpy_RR(hia, lob);
240 mant = Q6_P_mpyacc_RR(mant,hib, loa);
241 mant = (mant >> 30) + (Q6_P_mpy_RR(hia, hib)<<1);
243 hi = (int) (mant>>32);
245 k = Q6_R_normamt_R(hi);
247 exp = expa + expb - k;
248 if (mant == 0 || mant == -1) exp = 0x8001;
249 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
252 * ==================================================================== */
254 .global fast2_dmpy_asm
255 .type fast2_dmpy_asm, @function
260 #define mantexpa R1:0
263 #define mantexpb R3:2
267 #define mantexpd R7:6
270 #define lmantc R11:10
280 mantbl_= lsr(mantbl, #16)
283 mantal_= lsr(mantal, #16)
286 lmantc = mpy(mantah, mantbh)
287 mantexpd = mpy(mantah, mantbl_)
292 lmantc = add(lmantc, lmantc)
293 mantexpd+= mpy(mantbh, mantal_)
298 mantexpd = asr(mantexpd, #15)
300 p1 = cmp.eq(mantexpa, mantexpb)
303 mantexpd = add(mantexpd, lmantc)
304 exp = add(expa, expb)
305 p2 = cmp.eq(mantexpa, min)
309 mantexpb = abs(mantexpd)
316 p0 = cmp.gt(kb, guard)
320 mantexpa = asl(mantexpd, kb)
321 if(p1) jump .Lsat //rarely happens
324 mantal = insert(exp,#16, #0)
328 mantal = insert(c8001,#16, #0)
336 mantexpa = lsr(mantexpa, #1)
339 mantal = insert(exp,#16, #0)
343 /* ==================================================================== *
344 int fast2_qd2f(fast2_QDOUBLE a) {
350 exp = Q6_R_sxth_R(a) ;
351 ic = 0x80000000 & manta;
352 manta = Q6_R_abs_R_sat(manta);
353 mantb = (manta + rnd)>>7;
356 if((manta & 0xff) == rnd) rnd = 0x00;
357 if((manta & 0x7fffffc0) == 0x7fffffc0) {
360 manta= mantb & 0x007fffff;
362 exp = (exp << 23) & 0x7fffffc0;
363 ic = Q6_R_addacc_RR(ic, exp, manta);
366 * ==================================================================== */
369 .global fast2_qd2f_asm
370 .type fast2_qd2f_asm, @function
386 mant = abs(mantah):sat
392 cff = extractu(mant, #8, #0)
393 p2 = cmp.gt(expo, #126)
394 p3 = cmp.ge(expo, #-126)
398 p1 = cmp.eq(cff,#0x40)
400 expo = add(expo, #126)
404 p0 = bitsset(mant, mask)
406 mantb = add(mant, rnd)
410 if(p0) expo = add(expo, #1)
412 mantb = lsr(mantb, #7)
416 ic = and(c80, mantah)
417 mask &= asl(expo, #23)
418 if(!p0) mant = and(mantb, c07f)
422 ic += add(mask, mant)
439 /* ==================================================================== *
440 fast2_QDOUBLE fast2_f2qd(int ia) {
445 mant = ((ia << 7) | 0x40000000)&0x7fffff80 ;
446 if (ia & 0x80000000) mant = -mant;
447 exp = ((ia >> 23) & 0xFFLL) - 126;
448 c = (mant<<32) | Q6_R_zxth_R(exp);;
451 * ==================================================================== */
453 .global fast2_f2qd_asm
454 .type fast2_f2qd_asm, @function
471 mantr = setbit(mantr, #30)
472 expr= extractu(ia,#8,#23)
477 mantr= extractu(mantr, #31, #0)
478 expr= add(expr, #-126)
484 if(p0) mantr= sub(zero, mantr)