1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23 */
24/*
25 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
26 * Use is subject to license terms.
27 */
28
29	.file	"__vlogf.S"
30
31#include "libm.h"
32
33	RO_DATA
34	.align	64
35!! CONST_TBL[2*i]   = 127*log(2) - log(1+i/32), i = [0, 32]
36!! CONST_TBL[2*i+1] = 2**(-23)/(1+i/32),        i = [0, 32]
37
38.CONST_TBL:
39	.word  	0x405601e6, 	0x78fc457b, 	0x3e800000, 	0x00000000,
40	.word  	0x4055ffee, 	0x4f4b5df8,	0x3e7f07c1,	0xf07c1f08,
41	.word	0x4055fe05,	0x32e4434f,	0x3e7e1e1e,	0x1e1e1e1e,
42	.word	0x4055fc2a,	0x44598c21,	0x3e7d41d4,	0x1d41d41d,
43	.word	0x4055fa5c,	0xb720babf,	0x3e7c71c7,	0x1c71c71c,
44	.word	0x4055f89b,	0xcf803581,	0x3e7bacf9,	0x14c1bad0,
45	.word	0x4055f6e6,	0xe0c3f1b1,	0x3e7af286,	0xbca1af28,
46	.word	0x4055f53d,	0x4badcb50,	0x3e7a41a4,	0x1a41a41a,
47	.word	0x4055f39e,	0x7d18782e,	0x3e799999,	0x9999999a,
48	.word	0x4055f209,	0xecc5965c,	0x3e78f9c1,	0x8f9c18fa,
49	.word	0x4055f07f,	0x1c5099d5,	0x3e786186,	0x18618618,
50	.word	0x4055eefd,	0x9641645e,	0x3e77d05f,	0x417d05f4,
51	.word	0x4055ed84,	0xed3a291d,	0x3e7745d1,	0x745d1746,
52	.word	0x4055ec14,	0xbb3ced72,	0x3e76c16c,	0x16c16c17,
53	.word	0x4055eaac,	0xa10589ab,	0x3e7642c8,	0x590b2164,
54	.word	0x4055e94c,	0x45758439,	0x3e75c988,	0x2b931057,
55	.word	0x4055e7f3,	0x550f85e3,	0x3e755555,	0x55555555,
56	.word	0x4055e6a1,	0x818078ec,	0x3e74e5e0,	0xa72f0539,
57	.word	0x4055e556,	0x8134aae1,	0x3e747ae1,	0x47ae147b,
58	.word	0x4055e412,	0x0ef783b7,	0x3e741414,	0x14141414,
59	.word	0x4055e2d3,	0xe99c9674,	0x3e73b13b,	0x13b13b14,
60	.word	0x4055e19b,	0xd3b0f9d9,	0x3e73521c,	0xfb2b78c1,
61	.word	0x4055e069,	0x9333fb26,	0x3e72f684,	0xbda12f68,
62	.word	0x4055df3c,	0xf1565bd0,	0x3e729e41,	0x29e4129e,
63	.word	0x4055de15,	0xba3f64fa,	0x3e724924,	0x92492492,
64	.word	0x4055dcf3,	0xbcd73219,	0x3e71f704,	0x7dc11f70,
65	.word	0x4055dbd6,	0xca95a75a,	0x3e71a7b9,	0x611a7b96,
66	.word	0x4055dabe,	0xb7559927,	0x3e715b1e,	0x5f75270d,
67	.word	0x4055d9ab,	0x592bb896,	0x3e711111,	0x11111111,
68	.word	0x4055d89c,	0x8840e4fe,	0x3e70c971,	0x4fbcda3b,
69	.word	0x4055d792,	0x1eaf8df0,	0x3e708421,	0x08421084,
70	.word	0x4055d68b,	0xf863da3d,	0x3e704104,	0x10410410,
71	.word	0x4055d589,	0xf2fe5107,	0x3e700000,	0x00000000,
72	.word	0xbfcffb16,	0xbfa3db6e,	! K3 = -2.49850123953105416108e-01
73	.word	0x3fd5561b,	0xa4b3110b,	! K2 =  3.33380614127478394992e-01
74	.word	0xbfe00000,	0x0b666d0b,	! K1 = -5.00000021234343492201e-01
75	.word	0x3fefffff,	0xff3fd118,	! K0 =  9.99999998601683029714e-01
76	.word	0x3fe62e42,	0xfefa39ef,	! LN2 = 6.931471805599452862e-01
77	.word	0xbf800000,	0x7f800000,	! MONE = -1.0f ;    INF
78
79! local storage indices
80#define tmp0		STACK_BIAS-0x8
81#define tmp1		STACK_BIAS-0x10
82#define tmp2		STACK_BIAS-0x18
83#define tmp3		STACK_BIAS-0x20
84#define tmp4		STACK_BIAS-0x28
85#define tmp5		STACK_BIAS-0x30
86! sizeof temp storage - must be a multiple of 16 for V9
87#define tmps		0x30
88
89#define ZERO		%f28
90#define K3		%f30
91#define K2		%f32
92#define K1		%f34
93#define K0		%f36
94#define LN2		%f38
95
96#define stridex		%o0
97#define stridex2	%o1
98#define stridey		%o2
99#define x0		%o3
100#define x1		%o4
101#define y		%o5
102
103#define ind0		%i0
104#define ind1		%i1
105#define ind2		%i2
106#define ind3		%i3
107#define MASK_0x007fffff	%i4
108#define MASK_0xfffc0000	%i5
109#define CONST_0x20000	%o7
110#define MASK_0x7f800000	%l3
111
112#define ival0		%l0
113#define iy0		%l1
114#define ival1		%l2
115#define iy1		%l1
116#define ival2		%l4
117#define iy2		%l5
118#define ival3		%l6
119#define iy3		%l2
120#define counter		%l7
121
122#define LOGFTBL		%g5
123#define LOGFTBL_P8	%g1
124
125! register use
126
127! i0  ind0
128! i1  ind1
129! i2  ind2
130! i3  ind3
131! i4  0x007fffff
132! i5  0xfffc0000
133
134! l0  ival0
135! l1  iy0, iy1
136! l2  ival1, iy3
137! l3  0x7f800000
138! l4  ival2
139! l5  iy2
140! l6  ival3
141! l7  cycle counter
142
143! o0  stridex
144! o1  stridex * 2
145! o2  stridey
146! o3  x
147! o4  x
148! o5  y
149! o7  0x20000
150
151! g1  CONST_TBL
152! g5  CONST_TBL + 8
153
154! f2
155! f4
156! f6
157! f8
158! f9
159! f10
160! f12
161! f14
162! f16
163! f18
164! f19
165! f20
166! f22
167! f24
168! f26
169! f28 ZERO = 0
170! f30 K3 = -2.49850123953105416108e-01
171! f32 K2 =  3.33380614127478394992e-01
172! f34 K1 = -5.00000021234343492201e-01
173! f36 K0 =  9.99999998601683029714e-01
174! f38 LN2 = 6.931471805599452862e-01
175! f40
176! f42
177! f44
178! f46
179! f48
180! f50
181! f52
182! f54
183! f56
184! f58
185! f60
186! f62
187
188
189!  !!!!!  Algorithm   !!!!!
190!
191!  double exp, ty, yy, ldtmp0, ldtmp1;
192!  double dtmp0, dtmp1, dtmp2, dtmp3, dtmp4, dtmp5;
193!  float  value;
194!  int    ival, iy, i, ind, iexp;
195!  double K3   = -2.49850123953105416108e-01;
196!  double K2   =  3.33380614127478394992e-01;
197!  double K1   = -5.00000021234343492201e-01;
198!  double K0   =  9.99999998601683029714e-01;
199!  double LN2  =  6.931471805599452862e-01;
200!  double ZERO =  0;
201!  float  INF;
202!
203!  ival = *(int*)(x);
204!  if (ival >= 0x7f800000) goto spec;
205!  if (ival <= 0x7fffff) goto spec;
206!  *(float*)&*(float*)&exp = *(float*)(x);
207!  exp = vis_fpack32(ZERO, exp);
208!  iy = ival & 0x007fffff;
209!  ival = iy + 0x20000;
210!  ival = ival & 0xfffc0000;
211!  i  = ival >> 14;
212!  ind  = i & (-8);
213!  iy = iy - ival;
214!  ty = LN2 * (double)(*(int*)&exp);
215!  ldtmp0 = *(double*)((char*)CONST_TBL+ind);
216!  ldtmp1 = *(double*)((char*)CONST_TBL+ind+8);
217!  ty = ty - ldtmp0;
218!  yy = (double) iy;
219!  yy = yy * ldtmp1;
220!  dtmp0 = K3 * yy;
221!  dtmp1 = dtmp0 + K2;
222!  dtmp2 = dtmp1 * yy;
223!  dtmp3 = dtmp2 + K1;
224!  dtmp4 = dtmp3 * yy;
225!  dtmp5 = dtmp4 + K0;
226!  yy    = dtmp5 * yy;
227!  yy    = yy + ty;
228!  y[0] = (float)(yy);
229!  return;
230!
231!spec:
232!  if ((ival & 0x7fffffff) >= 0x7f800000) { /* X = NaN or Inf */
233!    value = *(float*) &ival;
234!    y[0] = (value < 0.0f? 0.0f : value) * value;
235!    return;
236!  } else if (ival <= 0) {
237!    y[0] = ((ival & 0x7fffffff) == 0) ?
238!      -1.0f / 0f. : 0f. /0f.;      /* X = +-0 : X < 0 */
239!    return;
240!  } else { /* Denom. number */
241!    value = (float) ival;
242!    ival = *(int*) &value;
243!    iexp = (ival >> 23) - 149;
244!    iy = ival & 0x007fffff;
245!    ival = iy + 0x20000;
246!    ival = ival & 0xfffc0000;
247!    i  = ival >> 14;
248!    ind  = i & (-8);
249!    iy = iy - ival;
250!    ty = LN2 * (double)iexp;
251!    ldtmp0 = *(double*)((char*)CONST_TBL+ind);
252!    ldtmp1 = *(double*)((char*)CONST_TBL+ind+8);
253!    ty = ty - ldtmp0;
254!    yy = (double) iy;
255!    yy = yy * ldtmp1;
256!    dtmp0 = K3 * yy;
257!    dtmp1 = dtmp0 + K2;
258!    dtmp2 = dtmp1 * yy;
259!    dtmp3 = dtmp2 + K1;
260!    dtmp4 = dtmp3 * yy;
261!    dtmp5 = dtmp4 + K0;
262!    yy    = dtmp5 * yy;
263!    yy    = yy + ty;
264!    y[0] = (float)(yy);
265!    return;
266!  }
267!--------------------------------------------------------------------
268
269	ENTRY(__vlogf)
270	save	%sp,-SA(MINFRAME)-tmps,%sp
271	PIC_SETUP(l7)
272	PIC_SET(l7,.CONST_TBL,g5)
273	wr	%g0,0,%gsr
274
275	st	%i0,[%fp+tmp0]
276	stx	%i1,[%fp+tmp5]
277
278	sra	%i2,0,%l4
279	ldd	[LOGFTBL+528],K3
280	add	%i3,0,y
281	sllx	%l4,2,stridex
282	sllx	%l4,3,stridex2
283	ldd	[LOGFTBL+536],K2
284	sra	%i4,0,%l3
285	ldd	[LOGFTBL+544],K1
286	sllx	%l3,2,stridey
287	sethi	%hi(0x7ffc00),MASK_0x007fffff
288	add	MASK_0x007fffff,1023,MASK_0x007fffff
289	ldd	[LOGFTBL+552],K0
290	sethi	%hi(0xfffc0000),MASK_0xfffc0000
291	ldd	[LOGFTBL+560],LN2
292	sethi	%hi(0x20000),CONST_0x20000
293	fzero	ZERO
294	sethi	%hi(0x7f800000),MASK_0x7f800000
295	sub	y,stridey,y
296
297.begin:
298	ld	[%fp+tmp0],counter
299	ldx	[%fp+tmp5],x0
300	st	%g0,[%fp+tmp0]
301.begin1:
302	add	x0,stridex2,x1! x += 2*stridex
303	subcc	counter,1,counter
304	bneg,pn	%icc,.end
305	lda	[x0]0x82,ival0			! (Y0_0) ival = *(int*)(x)
306
307	add	LOGFTBL,8,LOGFTBL_P8
308	lda	[stridex+x0]0x82,ival1		! (Y1_0) ival = *(int*)(x)
309
310	cmp	ival0,MASK_0x7f800000		! (Y0_0) if (ival >= 0x7f800000)
311	lda	[x1]0x82,ival2			! (Y2_0) ival = *(int*)(x);
312
313	bge,pn	%icc,.spec			! (Y0_0) if (ival >= 0x7f800000)
314	nop
315
316	cmp	ival0,MASK_0x007fffff		! (Y0_0) if (ival <= 0x7fffff)
317	ble,pn	%icc,.spec			! (Y0_0) if (ival <= 0x7fffff)
318	nop
319
320	cmp	ival1,MASK_0x7f800000		! (Y1_0) if (ival >= 0x7f800000)
321	and	ival0,MASK_0x007fffff,iy0	! (Y0_0) iy = ival & 0x007fffff
322
323
324	add	iy0,CONST_0x20000,ival0		! (Y0_0) ival = iy + 0x20000
325
326	and	ival0,MASK_0xfffc0000,ival0	! (Y0_0) ival = ival & 0xfffc0000
327	bge,pn	%icc,.update2			! (Y1_0) if (ival >= 0x7f800000)
328	nop
329.cont2:
330	sub	iy0,ival0,iy0			! (Y0_0) iy = iy - ival
331	cmp	ival1,MASK_0x007fffff		! (Y1_0) if (ival <= 0x7fffff)
332	lda	[stridex+x1]0x82,ival3		! (Y3_0) ival = *(int*)(x)
333
334	st	iy0,[%fp+tmp1]			! (Y0_0) (double) iy
335	ble,pn	%icc,.update3			! (Y1_0) if (ival <= 0x7fffff)
336	nop
337.cont3:
338	cmp	ival2,MASK_0x7f800000		! (Y2_0) if (ival >= 0x7f800000)
339	and	ival1,MASK_0x007fffff,iy1	! (Y1_0) iy = ival & 0x007fffff
340	bge,pn	%icc,.update4			! (Y2_0) if (ival >= 0x7f800000)
341	nop
342.cont4:
343	cmp	ival2,MASK_0x007fffff		! (Y2_0) if (ival <= 0x7fffff)
344	ble,pn	%icc,.update5			! (Y2_0) if (ival <= 0x7fffff)
345	nop
346.cont5:
347	add	iy1,CONST_0x20000,ival1		! (Y1_0) ival = iy + 0x20000
348	and	ival2,MASK_0x007fffff,iy2	! (Y2_0) iy = ival & 0x007fffff
349
350	and	ival1,MASK_0xfffc0000,ival1	! (Y1_0) ival = ival & 0xfffc0000
351	add	iy2,CONST_0x20000,ival2		! (Y2_0) ival = iy + 0x20000
352
353	sub	iy1,ival1,iy1			! (Y1_0) iy = iy - ival
354	and	ival2,MASK_0xfffc0000,ival2	! (Y2_0) ival = ival & 0xfffc0000
355
356	cmp	ival3,MASK_0x7f800000		! (Y3_0) (ival >= 0x7f800000)
357	sub	iy2,ival2,iy2			! (Y2_0) iy = iy - ival
358	st 	iy1,[%fp+tmp3]			! (Y1_0) (double) iy
359
360	st	iy2,[%fp+tmp2]			! (Y2_0) (double) iy
361	bge,pn	%icc,.update6			! (Y3_0) (ival >= 0x7f800000)
362	nop
363.cont6:
364	cmp	ival3,MASK_0x007fffff		! (Y3_0) if (ival <= 0x7fffff)
365	ld	[%fp+tmp1],%f2			! (Y0_0) (double) iy
366	ble,pn	%icc,.update7			! (Y3_0) if (ival <= 0x7fffff)
367	sra	ival0,14,ival0			! (Y0_0) i  = ival >> 14;
368.cont7:
369	sra	ival1,14,ind1			! (Y1_0) i  = ival >> 14;
370	ld	[%fp+tmp3],%f4			! (Y1_0) (double) iy
371
372	sra	ival2,14,ival2			! (Y2_0) i  = ival >> 14;
373	and	ival0,-8,ind0			! (Y0_0) ind  = i & (-8)
374	lda	[x0]0x82,%f6			! (Y0_0) *(float*)&exp = *(float*)(x)
375
376	and	ind1,-8,ind1			! (Y1_0) ind  = i & (-8)
377	ldd	[LOGFTBL_P8+ind0],%f14		! (Y0_0) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
378	fitod	%f2,%f48			! (Y0_0) yy = (double) iy
379
380	and	ival3,MASK_0x007fffff,iy3	! (Y3_0) iy = ival & 0x007fffff
381	lda	[stridex+x0]0x82,%f8		! (Y1_0) *(float*)&exp = *(float*)(x)
382
383	add	iy3,CONST_0x20000,ival3		! (Y3_0) iy + 0x20000
384	ldd	[LOGFTBL_P8+ind1],%f16		! (Y1_0) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
385	fitod	%f4,%f26			! (Y1_0) yy = (double) iy
386
387	sub	y,stridey,y			! y += stridey
388	and	ival3,MASK_0xfffc0000,ival3	! (Y3_0) ival = ival & 0xfffc0000
389	lda	[x1]0x82,%f10			! (Y2_0) *(float*)&exp = *(float*)(x)
390
391	add	x1,stridex2,x0			! x += 2*stridex
392	sub	iy3,ival3,iy3			! (Y3_0) iy = iy - ival
393	ld	[%fp+tmp2],%f2			! (Y2_0) (double) iy
394	fmuld	%f48,%f14,%f46			! (Y0_0) yy = yy * ldtmp1
395
396	lda	[stridex+x1]0x82,%f12		! (Y3_0) *(float*)&exp = *(float*)(x)
397	fmuld	%f26,%f16,%f62			! (Y1_0) yy = yy * ldtmp1
398
399	sra	ival3,14,ival3			! (Y3_0) i  = ival >> 14;
400	lda	[x0]0x82,ival0			! (Y0_1) ival = *(int*)(x)
401
402	add	x0,stridex2,x1			! x += 2*stridex
403	st	iy3,[%fp+tmp3]			! (Y3_0) (double) iy
404	fmuld	K3,%f46,%f22			! (Y0_0) dtmp0 = K3 * yy
405
406	and	ival2,-8,ind2			! (Y2_0) ind  = i & (-8)
407	lda	[stridex+x0]0x82,ival1		! (Y1_1) ival = *(int*)(x)
408
409	cmp	ival0,MASK_0x7f800000		! (Y0_1) if (ival >= 0x7f800000)
410	lda	[x1]0x82,ival2			! (Y2_1) ival = *(int*)(x);
411	fmuld	K3,%f62,%f50			! (Y1_0) dtmp0 = K3 * yy
412
413	bge,pn  %icc,.update8			! (Y0_1) if (ival >= 0x7f800000)
414	nop
415.cont8:
416	cmp	ival0,MASK_0x007fffff		! (Y0_1) if (ival <= 0x7fffff)
417	ble,pn	%icc,.update9			! (Y0_1) if (ival <= 0x7fffff)
418	faddd	%f22,K2,%f48			! (Y0_0) dtmp1 = dtmp0 + K2
419
420.cont9:
421	cmp	ival1,MASK_0x7f800000		! (Y1_1) if (ival >= 0x7f800000)
422	and	ival0,MASK_0x007fffff,iy0	! (Y0_1) iy = ival & 0x007fffff
423
424	add	iy0,CONST_0x20000,ival0		! (Y0_1) ival = iy + 0x20000
425	ldd	[LOGFTBL_P8+ind2],%f14		! (Y2_0) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8);
426	fpack32	ZERO,%f6,%f6			! (Y0_0) exp = vis_fpack32(ZERO, exp)
427
428	and	ival0,MASK_0xfffc0000,ival0	! (Y0_1) ival = ival & 0xfffc0000
429	faddd	%f50,K2,%f26			! (Y1_0) dtmp1 = dtmp0 + K2
430	bge,pn	%icc,.update10			! (Y1_1) if (ival >= 0x7f800000)
431	nop
432.cont10:
433	sub	iy0,ival0,iy0			! (Y0_1) iy = iy - ival
434	and	ival3,-8,ind3			! (Y3_0) ind  = i & (-8)
435	ld	[%fp+tmp3],%f4			! (Y3_0) (double) iy
436
437	cmp	ival1,MASK_0x007fffff		! (Y1_1) if (ival <= 0x7fffff)
438	lda	[stridex+x1]0x82,ival3		! (Y3_1) ival = *(int*)(x)
439	fmuld	%f48,%f46,%f50			! (Y0_0) dtmp2 = dtmp1 * yy
440	fitod	%f2,%f48			! (Y2_0) yy = (double) iy
441
442	st	iy0,[%fp+tmp1]			! (Y0_1) (double) iy
443	ble,pn	%icc,.update11			! (Y1_1) if (ival <= 0x7fffff)
444	nop
445.cont11:
446	cmp	ival2,MASK_0x7f800000		! (Y2_1) if (ival >= 0x7f800000)
447	and	ival1,MASK_0x007fffff,iy1	! (Y1_1) iy = ival & 0x007fffff
448	bge,pn	%icc,.update12			! (Y2_1) if (ival >= 0x7f800000)
449	fmuld	%f26,%f62,%f42			! (Y1_0) dtmp2 = dtmp1 * yy
450.cont12:
451	cmp	ival2,MASK_0x007fffff		! (Y2_1) if (ival <= 0x7fffff)
452	ldd	[LOGFTBL_P8+ind3],%f16		! (Y3_0) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
453	ble,pn 	%icc,.update13			! (Y2_1) if (ival <= 0x7fffff)
454	fitod	%f4,%f26			! (Y3_0) yy = (double) iy
455.cont13:
456	add	iy1,CONST_0x20000,ival1		! (Y1_1) ival = iy + 0x20000
457	and	ival2,MASK_0x007fffff,iy2	! (Y2_1) iy = ival & 0x007fffff
458
459	and	ival1,MASK_0xfffc0000,ival1	! (Y1_1) ival = ival & 0xfffc0000
460	add	iy2,CONST_0x20000,ival2		! (Y2_1) ival = iy + 0x20000
461	fmuld	%f48,%f14,%f44			! (Y2_0) yy = yy * ldtmp1
462	faddd	%f50,K1,%f50			! (Y0_0) dtmp3 = dtmp2 + K1
463
464	cmp	ival3,MASK_0x7f800000		! (Y3_1) if (ival >= 0x7f800000)
465	sub	iy1,ival1,iy1			! (Y1_1) iy = iy - ival
466	and	ival2,MASK_0xfffc0000,ival2	! (Y2_1) ival = ival & 0xfffc0000
467	fpack32	ZERO,%f8,%f8			! (Y1_0) exp = vis_fpack32(ZERO, exp)
468
469	sub	iy2,ival2,iy2			! (Y2_1) iy = iy - ival
470	st	iy1,[%fp+tmp3]			! (Y1_1) (double) iy
471	fmuld	%f26,%f16,%f60			! (Y3_0) yy = yy * ldtmp1
472	faddd	%f42,K1,%f54			! (Y1_0) dtmp3 = dtmp2 + K1
473
474	st	iy2,[%fp+tmp2]			! (Y2_1) (double) iy
475	fmuld	K3,%f44,%f22			! (Y2_0) dtmp0 = K3 * yy
476	bge,pn	%icc,.update14			! (Y3_1) if (ival >= 0x7f800000)
477	fitod	%f6,%f40			! (Y0_0) (double)(*(int*)&exp)
478.cont14:
479	cmp	ival3,MASK_0x007fffff		! (Y3_1) if (ival <= 0x7fffff)
480	ldd	[LOGFTBL+ind1],%f58		! (Y1_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
481	fmuld	%f50,%f46,%f52			! (Y0_0) dtmp4 = dtmp3 * yy
482	fitod	%f8,%f56			! (Y1_0) (double)(*(int*)&exp)
483
484	ld	[%fp+tmp1],%f2			! (Y0_1) (double) iy
485	fmuld	K3,%f60,%f50			! (Y3_0) dtmp0 = K3 * yy
486	ble,pn	%icc,.update15			! (Y3_1) if (ival <= 0x7fffff)
487	nop
488.cont15:
489	subcc	counter,7,counter
490	fmuld	%f54,%f62,%f54			! (Y1_0) dtmp4 = dtmp3 * yy
491
492	sra	ival0,14,ival0			! (Y0_1) i  = ival >> 14;
493	bneg,pn	%icc,.tail
494	faddd	%f22,K2,%f48			! (Y2_0) dtmp1 = dtmp0 + K2
495
496	ba	.main_loop
497	nop
498
499	.align	16
500.main_loop:
501	sra	ival2,14,ival2			! (Y2_1) i  = ival >> 14;
502	ldd	[LOGFTBL+ind0],%f42		! (Y0_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
503	fmuld	LN2,%f40,%f40			! (Y0_0) ty = LN2 * (double)(*(int*)&exp)
504	faddd	%f52,K0,%f22			! (Y0_0) dtmp5 = dtmp4 + K0
505
506	sra	ival1,14,ind1			! (Y1_1) i  = ival >> 14;
507	ld	[%fp+tmp3],%f4			! (Y1_1) (double) iy
508	fpack32	ZERO,%f10,%f18			! (Y2_0) exp = vis_fpack32(ZERO, exp)
509	faddd	%f50,K2,%f26			! (Y3_0) dtmp1 = dtmp0 + K2
510
511	and	ival0,-8,ind0			! (Y0_1) ind  = i & (-8)
512	lda	[x0]0x82,%f6			! (Y0_1) *(float*)&exp = *(float*)(x)
513	fmuld	LN2,%f56,%f56			! (Y1_0) LN2 * (double)(*(int*)&exp)
514	faddd	%f54,K0,%f24			! (Y1_0) dtmp5 = dtmp4 + K0
515
516	and	ind1,-8,ind1			! (Y1_1) ind  = i & (-8)
517	ldd	[LOGFTBL_P8+ind0],%f14		! (Y0_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
518	fmuld	%f48,%f44,%f50			! (Y2_0) dtmp2 = dtmp1 * yy
519	fitod	%f2,%f48			! (Y0_1) yy = (double) iy
520
521	and	ival3,MASK_0x007fffff,iy3	! (Y3_1) iy = ival & 0x007fffff
522	lda	[stridex+x0]0x82,%f8		! (Y1_1) *(float*)&exp = *(float*)(x)
523	fmuld	%f22,%f46,%f22			! (Y0_0) yy = dtmp5 * yy
524	fsubd	%f40,%f42,%f40			! (Y0_0) ty = ty - ldtmp0
525
526	add	iy3,CONST_0x20000,ival3		! (Y3_1) iy + 0x20000
527	ldd	[LOGFTBL_P8+ind1],%f16		! (Y1_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
528	fmuld	%f26,%f60,%f42			! (Y3_0) dtmp2 = dtmp1 * yy
529	fitod	%f4,%f26			! (Y1_1) yy = (double) iy
530
531	and	ival3,MASK_0xfffc0000,ival3	! (Y3_1) ival = ival & 0xfffc0000
532	lda	[x1]0x82,%f10			! (Y2_1) *(float*)&exp = *(float*)(x)
533	fmuld	%f24,%f62,%f24			! (Y1_0) yy = dtmp5 * yy
534	fsubd	%f56,%f58,%f58			! (Y1_0) ty = ty - ldtmp0
535
536	sub	iy3,ival3,iy3			! (Y3_1) iy = iy - ival
537	ld	[%fp+tmp2],%f2			! (Y2_1) (double) iy
538	fmuld	%f48,%f14,%f46			! (Y0_1) yy = yy * ldtmp1
539	faddd	%f50,K1,%f50			! (Y2_0) dtmp3 = dtmp2 + K1
540
541	add	x1,stridex2,x0			! x += 2*stridex
542	st	iy3,[%fp+tmp3]			! (Y3_1) (double) iy
543	fpack32	ZERO,%f12,%f20			! (Y3_0) exp = vis_fpack32(ZERO, exp)
544	faddd	%f22,%f40,%f48			! (Y0_0) yy = yy + ty
545
546	add	y,stridey,y			! y += stridey
547	lda	[stridex+x1]0x82,%f12		! (Y3_1) *(float*)&exp = *(float*)(x)
548	fmuld	%f26,%f16,%f62			! (Y1_1) yy = yy * ldtmp1
549	faddd	%f42,K1,%f54			! (Y3_0) dtmp3 = dtmp2 + K1
550
551	sra	ival3,14,ival3			! (Y3_1) i  = ival >> 14;
552	add	y,stridey,y			! y += stridey
553	lda	[x0]0x82,ival0			! (Y0_2) ival = *(int*)(x)
554	faddd	%f24,%f58,%f24			! (Y1_0) yy = yy + ty
555
556	add	x0,stridex2,x1			! x += 2*stridex
557	ldd	[LOGFTBL+ind2],%f42		! (Y2_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
558	fmuld	K3,%f46,%f22			! (Y0_1) dtmp0 = K3 * yy
559	fitod	%f18,%f40			! (Y2_0) (double)(*(int*)&exp)
560
561	and	ival2,-8,ind2			! (Y2_1) ind  = i & (-8)
562	lda	[stridex+x0]0x82,ival1		! (Y1_2) ival = *(int*)(x)
563	fmuld	%f50,%f44,%f52			! (Y2_0) dtmp4 = dtmp3 * yy
564	fitod	%f20,%f56			! (Y3_0) (double)(*(int*)&exp)
565
566	cmp	ival0,MASK_0x7f800000		! (Y0_2) if (ival >= 0x7f800000)
567	lda	[x1]0x82,ival2			! (Y2_2) ival = *(int*)(x);
568	fmuld	K3,%f62,%f50			! (Y1_1) dtmp0 = K3 * yy
569	fdtos	%f48,%f4			! (Y0_0) (float)(yy)
570
571	st	%f4,[y]				! (Y0_0) write into memory
572	fmuld	%f54,%f60,%f54			! (Y3_0) dtmp4 = dtmp3 * yy
573	bge,pn 	%icc,.update16			! (Y0_2) if (ival >= 0x7f800000)
574	fdtos	%f24,%f4			! (Y1_0) (float)(yy)
575.cont16:
576	cmp	ival0,MASK_0x007fffff		! (Y0_2) if (ival <= 0x7fffff
577	ldd	[LOGFTBL+ind3],%f58		! (Y3_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
578	ble,pn	%icc,.update17			! (Y0_2) if (ival <= 0x7fffff
579	faddd	%f22,K2,%f48			! (Y0_1) dtmp1 = dtmp0 + K2
580.cont17:
581	cmp	ival1,MASK_0x7f800000		! (Y1_2) if (ival >= 0x7f800000)
582	and	ival0,MASK_0x007fffff,iy0	! (Y0_2) iy = ival & 0x007fffff
583	st	%f4,[stridey+y]			! (Y1_0) write into memory
584	fmuld	LN2,%f40,%f40			! (Y2_0) ty = LN2 * (double)(*(int*)&exp)
585
586	add	iy0,CONST_0x20000,ival0		! (Y0_2) ival = iy + 0x20000
587	ldd	[LOGFTBL_P8+ind2],%f14		! (Y2_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8);
588	faddd	%f52,K0,%f22			! (Y2_0) dtmp5 = dtmp4 + K0
589	fpack32	ZERO,%f6,%f6			! (Y0_1) exp = vis_fpack32(ZERO, exp)
590
591	and	ival0,MASK_0xfffc0000,ival0	! (Y0_2) ival = ival & 0xfffc0000
592	faddd	%f50,K2,%f26			! (Y1_1) dtmp1 = dtmp0 + K2
593	bge,pn	%icc,.update18			! (Y1_2) if (ival >= 0x7f800000)
594	fmuld	LN2,%f56,%f56			! (Y3_0) ty = LN2 * (double)(*(int*)&exp)
595.cont18:
596	sub	iy0,ival0,iy0			! (Y0_2) iy = iy - ival
597	and	ival3,-8,ind3			! (Y3_1) ind  = i & (-8)
598	ld	[%fp+tmp3],%f4			! (Y3_1) (double) iy
599	faddd	%f54,K0,%f24			! (Y3_0) dtmp5 = dtmp4 + K0
600
601	cmp	ival1,MASK_0x007fffff		! (Y1_2) if (ival <= 0x7fffff)
602	lda	[stridex+x1]0x82,ival3		! (Y3_2) ival = *(int*)(x)
603	fmuld	%f48,%f46,%f50			! (Y0_1) dtmp2 = dtmp1 * yy
604	fitod	%f2,%f48			! (Y2_1) yy = (double) iy
605
606	st	iy0,[%fp+tmp1]			! (Y0_2) (double) iy
607	fmuld	%f22,%f44,%f22			! (Y2_0) yy = dtmp5 * yy
608	ble,pn	%icc,.update19			! (Y1_2) if (ival <= 0x7fffff)
609	fsubd	%f40,%f42,%f40			! (Y2_0) ty = ty - ldtmp0
610.cont19:
611	cmp	ival2,MASK_0x7f800000		! (Y2_2) if (ival >= 0x7f800000)
612	and	ival1,MASK_0x007fffff,iy1	! (Y1_2) iy = ival & 0x007fffff
613	bge,pn	%icc,.update20			! (Y2_2) if (ival >= 0x7f800000)
614	fmuld	%f26,%f62,%f42			! (Y1_1) dtmp2 = dtmp1 * yy
615.cont20:
616	cmp	ival2,MASK_0x007fffff		! (Y2_2) if (ival <= 0x7fffff)
617	ldd	[LOGFTBL_P8+ind3],%f16		! (Y3_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
618	ble,pn	%icc,.update21			! (Y2_2) if (ival <= 0x7fffff)
619	fitod	%f4,%f26			! (Y3_1) yy = (double) iy
620.cont21:
621	add	iy1,CONST_0x20000,ival1		! (Y1_2) ival = iy + 0x20000
622	and	ival2,MASK_0x007fffff,iy2	! (Y2_2) iy = ival & 0x007fffff
623	fmuld	%f24,%f60,%f24			! (Y3_0) yy = dtmp5 * yy
624	fsubd	%f56,%f58,%f58			! (Y3_0) ty = ty - ldtmp0
625
626	and	ival1,MASK_0xfffc0000,ival1	! (Y1_2) ival = ival & 0xfffc0000
627	add	iy2,CONST_0x20000,ival2		! (Y2_2) ival = iy + 0x20000
628	fmuld	%f48,%f14,%f44			! (Y2_1) yy = yy * ldtmp1
629	faddd	%f50,K1,%f50			! (Y0_1) dtmp3 = dtmp2 + K1
630
631	sub	iy1,ival1,iy1			! (Y1_2) iy = iy - ival
632	and	ival2,MASK_0xfffc0000,ival2	! (Y2_2) ival = ival & 0xfffc0000
633	fpack32	ZERO,%f8,%f8			! (Y1_1) exp = vis_fpack32(ZERO, exp)
634	faddd	%f22,%f40,%f48			! (Y2_0) yy = yy + ty
635
636	sub	iy2,ival2,iy2			! (Y2_2) iy = iy - ival
637	st	iy1,[%fp+tmp3]			! (Y1_2) (double) iy
638	fmuld	%f26,%f16,%f60			! (Y3_1) yy = yy * ldtmp1
639	faddd	%f42,K1,%f54			! (Y1_1) dtmp3 = dtmp2 + K1
640
641	cmp	ival3,MASK_0x7f800000		! (Y3_2) if (ival >= 0x7f800000)
642	add	y,stridey,y			! y += stridey
643	st	iy2,[%fp+tmp2]			! (Y2_2) (double) iy
644	faddd	%f24,%f58,%f24			! (Y3_0) yy = yy + ty
645
646	add	y,stridey,y			! y += stridey
647	fmuld	K3,%f44,%f22			! (Y2_1) dtmp0 = K3 * yy
648	bge,pn	%icc,.update22			! (Y3_2) if (ival >= 0x7f800000)
649	fitod	%f6,%f40			! (Y0_1)(double)(*(int*)&exp)
650.cont22:
651	cmp	ival3,MASK_0x007fffff		! (Y3_2) if (ival <= 0x7fffff)
652	ldd	[LOGFTBL+ind1],%f58		! (Y1_1) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
653	fmuld	%f50,%f46,%f52			! (Y0_1) dtmp4 = dtmp3 * yy
654	fitod	%f8,%f56			! (Y1_1) (double)(*(int*)&exp)
655
656	ld	[%fp+tmp1],%f2			! (Y0_2) (double) iy
657	fmuld	K3,%f60,%f50			! (Y3_1) dtmp0 = K3 * yy
658	ble,pn	%icc,.update23			! (Y3_2) if (ival <= 0x7fffff)
659	fdtos	%f48,%f4			! (Y2_0) (float)(yy)
660.cont23:
661	subcc	counter,4,counter		! update cycle counter
662	st	%f4,[y]				! (Y2_0) write into memory
663	fmuld	%f54,%f62,%f54			! (Y1_1) dtmp4 = dtmp3 * yy
664	fdtos	%f24,%f4			! (Y3_0)(float)(yy)
665
666	sra	ival0,14,ival0			! (Y0_2) i  = ival >> 14;
667	st	%f4,[stridey+y]			! (Y3_0) write into memory
668	bpos,pt	%icc,.main_loop
669	faddd	%f22,K2,%f48			! (Y2_1) dtmp1 = dtmp0 + K2
670
671.tail:
672	addcc	counter,7,counter
673	add	y,stridey,y			! y += stridey
674	bneg,pn	%icc,.end_loop
675
676	sra	ival2,14,ival2			! (Y2_1) i  = ival >> 14;
677	ldd	[LOGFTBL+ind0],%f42		! (Y0_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
678	fmuld	LN2,%f40,%f40			! (Y0_0) ty = LN2 * (double)(*(int*)&exp)
679	faddd	%f52,K0,%f22			! (Y0_0) dtmp5 = dtmp4 + K0
680
681	sra	ival1,14,ind1			! (Y1_1) i  = ival >> 14;
682	ld	[%fp+tmp3],%f4			! (Y1_1) (double) iy
683	fpack32	ZERO,%f10,%f18			! (Y2_0) exp = vis_fpack32(ZERO, exp)
684	faddd	%f50,K2,%f26			! (Y3_0) dtmp1 = dtmp0 + K2
685
686	and	ival0,-8,ind0			! (Y0_1) ind  = i & (-8)
687	lda	[x0]0x82,%f6			! (Y0_1) *(float*)&exp = *(float*)(x)
688	fmuld	LN2,%f56,%f56			! (Y1_0) LN2 * (double)(*(int*)&exp)
689	faddd	%f54,K0,%f24			! (Y1_0) dtmp5 = dtmp4 + K0
690
691	and	ind1,-8,ind1			! (Y1_1) ind  = i & (-8)
692	ldd	[LOGFTBL_P8+ind0],%f14		! (Y0_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
693	fmuld	%f48,%f44,%f50			! (Y2_0) dtmp2 = dtmp1 * yy
694	fitod	%f2,%f48			! (Y0_1) yy = (double) iy
695
696	and	ival3,MASK_0x007fffff,ival1	! (Y3_1) iy = ival & 0x007fffff
697	lda	[stridex+x0]0x82,%f8		! (Y1_1) *(float*)&exp = *(float*)(x)
698	fmuld	%f22,%f46,%f22			! (Y0_0) yy = dtmp5 * yy
699	fsubd	%f40,%f42,%f40			! (Y0_0) ty = ty - ldtmp0
700
701	add	iy3,CONST_0x20000,ival3		! (Y3_1) iy + 0x20000
702	ldd	[LOGFTBL_P8+ind1],%f16		! (Y1_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
703	fmuld	%f26,%f60,%f42			! (Y3_0) dtmp2 = dtmp1 * yy
704	fitod	%f4,%f26			! (Y1_1) yy = (double) iy
705
706	and	ival3,MASK_0xfffc0000,ival3	! (Y3_1) ival = ival & 0xfffc0000
707	lda	[x1]0x82,%f10			! (Y2_1) *(float*)&exp = *(float*)(x)
708	fmuld	%f24,%f62,%f24			! (Y1_0) yy = dtmp5 * yy
709	fsubd	%f56,%f58,%f58			! (Y1_0) ty = ty - ldtmp0
710
711	sub	iy3,ival3,iy3			! (Y3_1) iy = iy - ival
712	ld	[%fp+tmp2],%f2			! (Y2_1) (double) iy
713	fmuld	%f48,%f14,%f46			! (Y0_1) yy = yy * ldtmp1
714	faddd	%f50,K1,%f50			! (Y2_0) dtmp3 = dtmp2 + K1
715
716	add	x1,stridex2,x0			! x += 2*stridex
717	st	iy3,[%fp+tmp3]			! (Y3_1) (double) iy
718	fpack32	ZERO,%f12,%f20			! (Y3_0) exp = vis_fpack32(ZERO, exp)
719	faddd	%f22,%f40,%f48			! (Y0_0) yy = yy + ty
720
721	lda	[stridex+x1]0x82,%f12		! (Y3_1) *(float*)&exp = *(float*)(x)
722	fmuld	%f26,%f16,%f62			! (Y1_1) yy = yy * ldtmp1
723	faddd	%f42,K1,%f54			! (Y3_0) dtmp3 = dtmp2 + K1
724
725	sra	ival3,14,ival3			! (Y3_1) i  = ival >> 14;
726	add	y,stridey,y			! y += stridey
727	faddd	%f24,%f58,%f24			! (Y1_0) yy = yy + ty
728
729	subcc	counter,1,counter
730	ldd	[LOGFTBL+ind2],%f42		! (Y2_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
731	fmuld	K3,%f46,%f22			! (Y0_1) dtmp0 = K3 * yy
732	fitod	%f18,%f40			! (Y2_0) (double)(*(int*)&exp)
733
734	and	ival2,-8,ind2			! (Y2_1) ind  = i & (-8)
735	fmuld	%f50,%f44,%f52			! (Y2_0) dtmp4 = dtmp3 * yy
736	fitod	%f20,%f56			! (Y3_0) (double)(*(int*)&exp)
737
738	fmuld	K3,%f62,%f50			! (Y1_1) dtmp0 = K3 * yy
739	fdtos	%f48,%f4			! (Y0_0) (float)(yy)
740
741	st	%f4,[y]				! (Y0_0) write into memory
742	fmuld	%f54,%f60,%f54			! (Y3_0) dtmp4 = dtmp3 * yy
743	bneg,pn	%icc,.end_loop
744	fdtos	%f24,%f4			! (Y1_0) (float)(yy)
745
746	add	y,stridey,y			! y += stridey
747	subcc	counter,1,counter
748	ldd	[LOGFTBL+ind3],%f58		! (Y3_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
749	faddd	%f22,K2,%f48			! (Y0_1) dtmp1 = dtmp0 + K2
750
751	st	%f4,[y]				! (Y1_0) write into memory
752	bneg,pn	%icc,.end_loop
753	fmuld	LN2,%f40,%f40			! (Y2_0) ty = LN2 * (double)(*(int*)&exp)
754
755	ldd	[LOGFTBL_P8+ind2],%f14		! (Y2_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8);
756	faddd	%f52,K0,%f22			! (Y2_0) dtmp5 = dtmp4 + K0
757	fpack32	ZERO,%f6,%f6			! (Y0_1) exp = vis_fpack32(ZERO, exp)
758
759	faddd	%f50,K2,%f26			! (Y1_1) dtmp1 = dtmp0 + K2
760	fmuld	LN2,%f56,%f56			! (Y3_0) ty = LN2 * (double)(*(int*)&exp)
761
762	and	ival3,-8,ind3			! (Y3_1) ind  = i & (-8)
763	ld	[%fp+tmp3],%f4			! (Y3_1) (double) iy
764	faddd	%f54,K0,%f24			! (Y3_0) dtmp5 = dtmp4 + K0
765
766	fmuld	%f48,%f46,%f50			! (Y0_1) dtmp2 = dtmp1 * yy
767	fitod	%f2,%f48			! (Y2_1) yy = (double) iy
768
769	fmuld	%f22,%f44,%f22			! (Y2_0) yy = dtmp5 * yy
770	fsubd	%f40,%f42,%f40			! (Y2_0) ty = ty - ldtmp0
771
772	fmuld	%f26,%f62,%f42			! (Y1_1) dtmp2 = dtmp1 * yy
773
774	ldd	[LOGFTBL_P8+ind3],%f16		! (Y3_1) ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
775	fitod	%f4,%f26			! (Y3_1) yy = (double) iy
776
777	fmuld	%f24,%f60,%f24			! (Y3_0) yy = dtmp5 * yy
778	fsubd	%f56,%f58,%f58			! (Y3_0) ty = ty - ldtmp0
779
780	fmuld	%f48,%f14,%f44			! (Y2_1) yy = yy * ldtmp1
781	faddd	%f50,K1,%f50			! (Y0_1) dtmp3 = dtmp2 + K1
782
783	fpack32	ZERO,%f8,%f8			! (Y1_1) exp = vis_fpack32(ZERO, exp)
784	faddd	%f22,%f40,%f48			! (Y2_0) yy = yy + ty
785
786	fmuld	%f26,%f16,%f60			! (Y3_1) yy = yy * ldtmp1
787	faddd	%f42,K1,%f54			! (Y1_1) dtmp3 = dtmp2 + K1
788
789	add	y,stridey,y			! y += stridey
790	faddd	%f24,%f58,%f24			! (Y3_0) yy = yy + ty
791
792	subcc	counter,1,counter
793	fmuld	K3,%f44,%f22			! (Y2_1) dtmp0 = K3 * yy
794	fitod	%f6,%f40			! (Y0_1)(double)(*(int*)&exp)
795
796	ldd	[LOGFTBL+ind1],%f58		! (Y1_1) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
797	fmuld	%f50,%f46,%f52			! (Y0_1) dtmp4 = dtmp3 * yy
798	fitod	%f8,%f56			! (Y1_1) (double)(*(int*)&exp)
799
800	fmuld	K3,%f60,%f50			! (Y3_1) dtmp0 = K3 * yy
801	fdtos	%f48,%f4			! (Y2_0) (float)(yy)
802
803	st	%f4,[y]				! (Y2_0) write into memory
804	fmuld	%f54,%f62,%f54			! (Y1_1) dtmp4 = dtmp3 * yy
805	bneg,pn	%icc,.end_loop
806	fdtos	%f24,%f4			! (Y3_0)(float)(yy)
807
808	subcc	counter,1,counter		! update cycle counter
809	add	y,stridey,y
810
811	st	%f4,[y]				! (Y3_0) write into memory
812	bneg,pn	%icc,.end_loop
813	faddd	%f22,K2,%f48			! (Y2_1) dtmp1 = dtmp0 + K2
814
815	ldd	[LOGFTBL+ind0],%f42		! (Y0_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
816	fmuld	LN2,%f40,%f40			! (Y0_0) ty = LN2 * (double)(*(int*)&exp)
817	faddd	%f52,K0,%f22			! (Y0_0) dtmp5 = dtmp4 + K0
818
819	fpack32	ZERO,%f10,%f18			! (Y2_0) exp = vis_fpack32(ZERO, exp)
820
821	fmuld	LN2,%f56,%f56			! (Y1_0) LN2 * (double)(*(int*)&exp)
822	faddd	%f54,K0,%f24			! (Y1_0) dtmp5 = dtmp4 + K0
823
824	fmuld	%f48,%f44,%f50			! (Y2_0) dtmp2 = dtmp1 * yy
825
826	fmuld	%f22,%f46,%f22			! (Y0_0) yy = dtmp5 * yy
827	fsubd	%f40,%f42,%f40			! (Y0_0) ty = ty - ldtmp0
828
829	fmuld	%f24,%f62,%f24			! (Y1_0) yy = dtmp5 * yy
830	fsubd	%f56,%f58,%f58			! (Y1_0) ty = ty - ldtmp0
831
832	subcc	counter,1,counter
833	faddd	%f50,K1,%f50			! (Y2_0) dtmp3 = dtmp2 + K1
834
835	faddd	%f22,%f40,%f48			! (Y0_0) yy = yy + ty
836
837	add	y,stridey,y			! y += stridey
838	faddd	%f24,%f58,%f24			! (Y1_0) yy = yy + ty
839
840	ldd	[LOGFTBL+ind2],%f42		! (Y2_0) ldtmp0 = *(double*)((char*)CONST_TBL+ind)
841	fitod	%f18,%f40			! (Y2_0) (double)(*(int*)&exp)
842
843	fmuld	%f50,%f44,%f52			! (Y2_0) dtmp4 = dtmp3 * yy
844
845	fdtos	%f48,%f4			! (Y0_0) (float)(yy)
846
847	st	%f4,[y]				! (Y0_0) write into memory
848	bneg,pn	%icc,.end_loop
849	fdtos	%f24,%f4			! (Y1_0) (float)(yy)
850
851	add	y,stridey,y			! y += stridey
852	subcc	counter,1,counter
853	st	%f4,[y]				! (Y1_0) write into memory
854	bneg,pn	%icc,.end_loop
855	fmuld	LN2,%f40,%f40			! (Y2_0) ty = LN2 * (double)(*(int*)&exp)
856
857	faddd	%f52,K0,%f22			! (Y2_0) dtmp5 = dtmp4 + K0
858
859	fmuld	%f22,%f44,%f22			! (Y2_0) yy = dtmp5 * yy
860	fsubd	%f40,%f42,%f40			! (Y2_0) ty = ty - ldtmp0
861
862	add	y,stridey,y			! y += stridey
863	faddd	%f22,%f40,%f48			! (Y2_0) yy = yy + ty
864
865	fdtos	%f48,%f4			! (Y2_0) (float)(yy)
866
867	st	%f4,[y]				! (Y2_0) write into memory
868.end_loop:
869	ba	.begin
870	nop
871
872.end:
873	ret
874	restore	%g0,0,%o0
875
876	.align	16
877.update2:
878	cmp	counter,0
879	ble	.cont2
880	nop
881
882	add	x0,stridex,x0
883	stx	x0,[%fp+tmp5]
884	sub	x0,stridex,x0
885	st	counter,[%fp+tmp0]
886	or	%g0,0,counter
887	ba	.cont2
888	nop
889
890	.align	16
891.update3:
892	cmp	counter,0
893	ble	.cont3
894	nop
895
896	add	x0,stridex,x0
897	stx	x0,[%fp+tmp5]
898	sub	x0,stridex,x0
899	st	counter,[%fp+tmp0]
900	or	%g0,0,counter
901	ba	.cont3
902	nop
903
904	.align	16
905.update4:
906	cmp	counter,1
907	ble	.cont4
908	nop
909
910	stx	x1,[%fp+tmp5]
911	sub	counter,1,counter
912	st	counter,[%fp+tmp0]
913	or	%g0,1,counter
914	ba	.cont4
915	nop
916
917	.align	16
918.update5:
919	cmp	counter,1
920	ble	.cont5
921	nop
922
923	stx	x1,[%fp+tmp5]
924	sub	counter,1,counter
925	st	counter,[%fp+tmp0]
926	or	%g0,1,counter
927	ba	.cont5
928	nop
929
930	.align	16
931.update6:
932	cmp	counter,2
933	ble	.cont6
934	nop
935
936	add	x1,stridex,x1
937	stx	x1,[%fp+tmp5]
938	sub	x1,stridex,x1
939	sub	counter,2,counter
940	st	counter,[%fp+tmp0]
941	or	%g0,2,counter
942	ba	.cont6
943	nop
944
945	.align	16
946.update7:
947	cmp	counter,2
948	ble	.cont7
949	nop
950
951	add	x1,stridex,x1
952	stx	x1,[%fp+tmp5]
953	sub	x1,stridex,x1
954	sub	counter,2,counter
955	st	counter,[%fp+tmp0]
956	or	%g0,2,counter
957	ba	.cont7
958	nop
959
960	.align	16
961.update8:
962	cmp	counter,3
963	ble	.cont8
964	nop
965
966	stx	x0,[%fp+tmp5]
967	sub	counter,3,counter
968	st	counter,[%fp+tmp0]
969	or	%g0,3,counter
970	ba	.cont8
971	nop
972
973	.align	16
974.update9:
975	cmp	counter,3
976	ble	.cont9
977	nop
978
979	stx	x0,[%fp+tmp5]
980	sub	counter,3,counter
981	st	counter,[%fp+tmp0]
982	or	%g0,3,counter
983	ba	.cont9
984	nop
985
986	.align	16
987.update10:
988	cmp	counter,4
989	ble	.cont10
990	nop
991
992	add	x0,stridex,x0
993	stx	x0,[%fp+tmp5]
994	sub	x0, stridex, x0
995	sub	counter,4,counter
996	st	counter,[%fp+tmp0]
997	or	%g0,4,counter
998	ba	.cont10
999	nop
1000
1001	.align	16
1002.update11:
1003	cmp	counter,4
1004	ble	.cont11
1005	nop
1006
1007	add	x0,stridex,x0
1008	stx	x0,[%fp+tmp5]
1009	sub	x0,stridex,x0
1010	sub	counter,4,counter
1011	st	counter,[%fp+tmp0]
1012	or	%g0,4,counter
1013	ba	.cont11
1014	nop
1015
1016	.align	16
1017.update12:
1018	cmp	counter,5
1019	ble	.cont12
1020	nop
1021
1022	stx	x1,[%fp+tmp5]
1023	sub	counter,5,counter
1024	st	counter,[%fp+tmp0]
1025	or	%g0,5,counter
1026	ba	.cont12
1027	nop
1028
1029	.align	16
1030.update13:
1031	cmp	counter,5
1032	ble	.cont13
1033	nop
1034
1035	stx	x1,[%fp+tmp5]
1036	sub	counter,5,counter
1037	st	counter,[%fp+tmp0]
1038	or	%g0,5,counter
1039	ba	.cont13
1040	nop
1041
1042	.align	16
1043.update14:
1044	cmp	counter,6
1045	ble	.cont14
1046	nop
1047
1048	add	x1,stridex,x1
1049	stx	x1,[%fp+tmp5]
1050	sub	x1, stridex, x1
1051	sub	counter,6,counter
1052	st	counter,[%fp+tmp0]
1053	or	%g0,6,counter
1054	ba 	.cont14
1055	nop
1056
1057	.align	16
1058.update15:
1059	cmp	counter,6
1060	ble	.cont15
1061	nop
1062
1063	add	x1,stridex,x1
1064	stx	x1,[%fp+tmp5]
1065	sub	x1, stridex, x1
1066	sub	counter,6,counter
1067	st	counter,[%fp+tmp0]
1068	or	%g0,6,counter
1069	ba	.cont15
1070	nop
1071
1072	.align	16
1073.update16:
1074	cmp	counter,0
1075	ble,pt	%icc, .cont16
1076	nop
1077
1078	stx	x0,[%fp+tmp5]
1079	st	counter,[%fp+tmp0]
1080	or	%g0,0,counter
1081	ba	.cont16
1082	nop
1083
1084	.align	16
1085.update17:
1086	cmp	counter,0
1087	ble,pt	%icc, .cont17
1088	nop
1089
1090	stx	x0,[%fp+tmp5]
1091	st	counter,[%fp+tmp0]
1092	or	%g0,0,counter
1093	ba	.cont17
1094	nop
1095
1096	.align	16
1097.update18:
1098	cmp	counter,1
1099	ble,pt	%icc, .cont18
1100	nop
1101
1102	add	x0,stridex,x0
1103	stx	x0,[%fp+tmp5]
1104	sub	x0,stridex,x0
1105	sub	counter,1,counter
1106	st	counter,[%fp+tmp0]
1107	or	%g0,1,counter
1108	ba	.cont18
1109	nop
1110
1111	.align	16
1112.update19:
1113	cmp	counter,1
1114	ble,pt	%icc, .cont19
1115	nop
1116
1117	add	x0,stridex,x0
1118	sub	counter,1,counter
1119	stx	x0,[%fp+tmp5]
1120	sub	x0, stridex, x0
1121	st	counter,[%fp+tmp0]
1122	or	%g0,1,counter
1123	ba	.cont19
1124	nop
1125
1126	.align	16
1127.update20:
1128	cmp	counter,2
1129	ble,pt	%icc, .cont20
1130	nop
1131
1132	stx	x1,[%fp+tmp5]
1133	sub	counter,2,counter
1134	st	counter,[%fp+tmp0]
1135	or	%g0,2,counter
1136	ba	.cont20
1137	nop
1138
1139	.align	16
1140.update21:
1141	cmp	counter,2
1142	ble,pt	%icc, .cont21
1143	nop
1144
1145	stx x1,[%fp+tmp5]
1146	sub	counter, 2, counter
1147	st	counter,[%fp+tmp0]
1148	or	%g0,2,counter
1149	ba	.cont21
1150	nop
1151
1152	.align	16
1153.update22:
1154	cmp	counter,3
1155	ble,pt	%icc, .cont22
1156	nop
1157
1158	add	x1,stridex,x1
1159	stx	x1,[%fp+tmp5]
1160	sub	x1,stridex,x1
1161	sub	counter,3,counter
1162	st	counter,[%fp+tmp0]
1163	or	%g0,3,counter
1164	ba	.cont22
1165	nop
1166
1167	.align	16
1168.update23:
1169	cmp	counter,3
1170	ble,pt	%icc, .cont23
1171	nop
1172
1173	add	x1,stridex,x1
1174	stx	x1,[%fp+tmp5]
1175	sub	x1,stridex,x1
1176	sub	counter,3,counter
1177	st	counter,[%fp+tmp0]
1178	or	%g0,3,counter
1179	ba	.cont23
1180	nop
1181
1182	.align	16
1183.spec:
1184	or	%g0,1,ind3			! ind3 = 1
1185	sll	ind3,31,ind3			! ind3 = 0x8000000
1186	add	x0,stridex,x0			! x += stridex
1187	sub	ind3,1,ind3			! ind3 = 0x7ffffff
1188	add	y,stridey,y			! y += stridey
1189	and	ival0,ind3,iy0			! ival & 0x7fffffff
1190	cmp	iy0,MASK_0x7f800000		! if ((ival & 0x7fffffff) >= 0x7f800000)
1191	bge,pn	%icc, .spec0			! if ((ival & 0x7fffffff) >= 0x7f800000)
1192	st	ival0,[%fp+tmp1]
1193	cmp	ival0,0				! if (ival <= 0)
1194	ble,pn	%icc,.spec1			! if (ival <= 0)
1195	nop
1196
1197	ld	[%fp+tmp1],%f12
1198	fitos	%f12,%f14			! value = (float) ival
1199	st	%f14,[%fp+tmp2]			! ival = *(int*) &value
1200	ld	[%fp+tmp2],ival0		! ival = *(int*) &value
1201
1202	and	ival0,MASK_0x007fffff,iy0	!  iy = ival & 0x007fffff
1203	sra	ival0,23,ival2			!  iexp = ival >> 23
1204
1205	add	iy0,CONST_0x20000,ival0		!  ival = iy + 0x20000
1206	sub	ival2,149,ival2			!  iexp = iexp - 149
1207
1208	and	ival0,MASK_0xfffc0000,ival0	!  ival = ival & 0xfffc0000
1209	st 	ival2,[%fp+tmp2]		!  (double) iexp
1210
1211	sub	iy0,ival0,iy0			!  iy = iy - ival
1212
1213	sra	ival0,14,ival0			!  i  = ival >> 14;
1214	st	iy0,[%fp+tmp1]			!  (double) iy
1215
1216	and	ival0,-8,ind0			!  ind  = i & (-8)
1217	ld	[%fp+tmp1],%f2			!  (double) iy
1218
1219	ldd	[LOGFTBL_P8+ind0],%f14		!  ldtmp1 = *(double*)((char*)CONST_TBL+ind+8)
1220	fitod	%f2,%f48			!  yy = (double) iy
1221
1222	fmuld	%f48,%f14,%f46			!  yy = yy * ldtmp1
1223
1224	ld	[%fp+tmp2],%f6			!  (double) iexp
1225	fmuld	K3,%f46,%f22			!  dtmp0 = K3 * yy
1226
1227	ldd	[LOGFTBL+ind0],%f42		!  ldtmp0 = *(double*)((char*)CONST_TBL+ind)
1228	faddd	%f22,K2,%f48			!  dtmp1 = dtmp0 + K2
1229
1230	fmuld	%f48,%f46,%f50			!  dtmp2 = dtmp1 * yy
1231
1232	faddd	%f50,K1,%f50			!  dtmp3 = dtmp2 + K1
1233
1234	fitod	%f6,%f40			!  (double) iexp
1235	fmuld	%f50,%f46,%f52			!  dtmp4 = dtmp3 * yy
1236
1237	fmuld	LN2,%f40,%f40			!  ty = LN2 * (double) iexp
1238	faddd	%f52,K0,%f22			!  dtmp5 = dtmp4 + K0
1239
1240	fmuld	%f22,%f46,%f22			!  yy = dtmp5 * yy
1241	fsubd	%f40,%f42,%f40			!  ty = ty - ldtmp0
1242
1243	faddd	%f22,%f40,%f48			!  yy = yy + ty
1244
1245	fdtos	%f48,%f4			!  (float)(yy)
1246
1247	ba	.begin1
1248	st	%f4,[y]				! write into memory
1249
1250	.align	16
1251.spec0:
1252	ld	[%fp+tmp1],%f12			! value = *(float*) &ival
1253	fzeros	%f2				! y[0] = (value < 0.0f?
1254	fcmps	%fcc0,%f12,%f2			!   0.0f : value) * value
1255	fmovsug	%fcc0,%f12,%f2
1256	fmuls	%f12,%f2,%f2
1257	ba	.begin1
1258	st	%f2,[y]				! write into memory
1259
1260	.align	16
1261.spec1:
1262	cmp	iy0,0				! if ((ival & 0x7fffffff) == 0)
1263	bne,pn	%icc,.spec2			! if ((ival & 0x7fffffff) == 0)
1264	nop
1265	ld	[LOGFTBL+568],%f4
1266	fdivs	%f4,ZERO,%f6			! y[0] = -1.0f / 0f
1267	ba	.begin1
1268	st	%f6,[y]				! write into memory
1269
1270	.align	16
1271.spec2:
1272	fdivs	ZERO,ZERO,%f6			! y[0] = 0f / 0f
1273	ba	.begin1
1274	st	%f6,[y]				! write into memory
1275
1276	SET_SIZE(__vlogf)
1277
1278