Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2258 lines
66 KiB

; Copyright (C) 1985-2000 Intel Corporation.
;
; The information and source code contained herein is the exclusive property
; of Intel Corporation and may not be disclosed, examined, or reproduced in
; whole or in part without explicit written authorization from the Company.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; pow_p4.asm
;
; double pow(double,double);
;
; Initial version: 01/10/2001
; Update (bug fixes): 02/26/2001
; Updated the underflow/overflow path
; to restore edi, esi in the correct order: 03/07/2001
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; x=2^k*1.b1 b2...b6 b7 .. b52 x1=1.b1..b52
;; f1=(b1 b2 ..b7 +1)/2
;; x2=x1*rcp_t1[f1]=b'0.b'1 b'2 ... b'52 b'53 (b'53=0 if b'0=1)
;; f2=(b'7 ..b'14 +1)/2
;; x3=x2*rcp_t2[f2]=b"0.b"1 b"2 ... b"52 b"53 (b"53=0 if b"0=1)
;; f3=(b"13 ..b"21+1)/2
;; R=x3*rcp_t3[f3]
;; rcp=rcp_t1[f1]*rcp_t2[f2]*rcp_t3[f3] (exact multiplication)
;; E=exact_mul(rcp*x1)-R
;; R'=RN(R+E)
;;
;; H=RN(RN(k+T1[f1]+T2[f2]+T3[f3]+R)+E) (high part of log2(x) approximation)
;; Rl+El=exact(k+T1[f1]+T2[f2]+T3[f3]+R+E)-H
;;
;; Exponential evaluation started with approximate argument yH*HH (exact
;; product of the most significant 26 bits of y and H)
;; Correction added to exponential reduced argument:
;; yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+El)+Pl14),
;; where Pl14=cl1*R'+...+cl4*R'^4
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.686P
.387
.XMM
.MODEL FLAT,C
EXTRN C __libm_error_support : NEAR
CONST SEGMENT PARA PUBLIC USE32 'CONST'
ALIGN 16
rcp_t1 DQ 03ff0000000000000H, 03fefc08000000000H
DQ 03fef820000000000H, 03fef448000000000H
DQ 03fef07c000000000H, 03feecc0000000000H
DQ 03fee914000000000H, 03fee574000000000H
DQ 03fee1e0000000000H, 03fede5c000000000H
DQ 03fedae8000000000H, 03fed77c000000000H
DQ 03fed41c000000000H, 03fed0cc000000000H
DQ 03fecd84000000000H, 03feca4c000000000H
DQ 03fec71c000000000H, 03fec3f8000000000H
DQ 03fec0e0000000000H, 03febdd4000000000H
DQ 03febad0000000000H, 03feb7d8000000000H
DQ 03feb4e8000000000H, 03feb204000000000H
DQ 03feaf28000000000H, 03feac58000000000H
DQ 03fea990000000000H, 03fea6d0000000000H
DQ 03fea41c000000000H, 03fea16c000000000H
DQ 03fe9ec8000000000H, 03fe9c2c000000000H
DQ 03fe9998000000000H, 03fe9710000000000H
DQ 03fe948c000000000H, 03fe9210000000000H
DQ 03fe8f9c000000000H, 03fe8d30000000000H
DQ 03fe8acc000000000H, 03fe8870000000000H
DQ 03fe8618000000000H, 03fe83c8000000000H
DQ 03fe8180000000000H, 03fe7f40000000000H
DQ 03fe7d04000000000H, 03fe7ad4000000000H
DQ 03fe78a4000000000H, 03fe767c000000000H
DQ 03fe745c000000000H, 03fe7244000000000H
DQ 03fe7030000000000H, 03fe6e20000000000H
DQ 03fe6c18000000000H, 03fe6a14000000000H
DQ 03fe6818000000000H, 03fe6620000000000H
DQ 03fe642c000000000H, 03fe6240000000000H
DQ 03fe6058000000000H, 03fe5e74000000000H
DQ 03fe5c98000000000H, 03fe5ac0000000000H
DQ 03fe58ec000000000H, 03fe5720000000000H
DQ 03fe5554000000000H, 03fe5390000000000H
DQ 03fe51d0000000000H, 03fe5014000000000H
DQ 03fe4e60000000000H, 03fe4cac000000000H
DQ 03fe4afc000000000H, 03fe4954000000000H
DQ 03fe47b0000000000H, 03fe460c000000000H
DQ 03fe4470000000000H, 03fe42d8000000000H
DQ 03fe4140000000000H, 03fe3fb0000000000H
DQ 03fe3e24000000000H, 03fe3c98000000000H
DQ 03fe3b14000000000H, 03fe3990000000000H
DQ 03fe3814000000000H, 03fe3698000000000H
DQ 03fe3520000000000H, 03fe33b0000000000H
DQ 03fe3240000000000H, 03fe30d0000000000H
DQ 03fe2f68000000000H, 03fe2e04000000000H
DQ 03fe2ca0000000000H, 03fe2b40000000000H
DQ 03fe29e4000000000H, 03fe288c000000000H
DQ 03fe2734000000000H, 03fe25e4000000000H
DQ 03fe2494000000000H, 03fe2344000000000H
DQ 03fe21fc000000000H, 03fe20b4000000000H
DQ 03fe1f70000000000H, 03fe1e30000000000H
DQ 03fe1cf0000000000H, 03fe1bb4000000000H
DQ 03fe1a7c000000000H, 03fe1944000000000H
DQ 03fe1810000000000H, 03fe16e0000000000H
DQ 03fe15b0000000000H, 03fe1484000000000H
DQ 03fe135c000000000H, 03fe1234000000000H
DQ 03fe1110000000000H, 03fe0ff0000000000H
DQ 03fe0ed0000000000H, 03fe0db4000000000H
DQ 03fe0c98000000000H, 03fe0b80000000000H
DQ 03fe0a68000000000H, 03fe0954000000000H
DQ 03fe0844000000000H, 03fe0734000000000H
DQ 03fe0624000000000H, 03fe0518000000000H
DQ 03fe0410000000000H, 03fe0308000000000H
DQ 03fe0204000000000H, 03fe0100000000000H
DQ 03fe0000000000000H, 0
log2_t1 DQ 0, 0
DQ 03f86fdf461d20000H, 03d3c9efc46d9f6f7H
DQ 03f96e625317a0000H, 03d453f0e645614dbH
DQ 03fa11a6297920000H, 03d4d925cd7d436d6H
DQ 03fa6bb01a01f0000H, 03d3c995e7439db70H
DQ 03fac4eb3635c8000H, 03d4a8192bdcad609H
DQ 03fb0ea8b80338000H, 03d4e1797942f1be5H
DQ 03fb3a9f062a90000H, 03d3011ef2e155a44H
DQ 03fb665684ff80000H, 03d3084f28da93fafH
DQ 03fb919bc335d0000H, 03d246082ed03fe7fH
DQ 03fbbc6b9d7c04000H, 03d45b7e842652658H
DQ 03fbe7272e1dc8000H, 03d4a2ea92333a25cH
DQ 03fc08cd7820ec000H, 03d3543c511b40206H
DQ 03fc1dc8f3a33c000H, 03d45598cab6d744cH
DQ 03fc32b7a27af4000H, 03d07aba1fd6522b1H
DQ 03fc476564c740000H, 03d4dc39f249b8f70H
DQ 03fc5c04864906000H, 03d28c5d47e5f3668H
DQ 03fc707a4ef786000H, 03d4f86ea591de6f8H
DQ 03fc84c59fac38000H, 03d435cd351b14a77H
DQ 03fc98e556aacc000H, 03d341c88d156ee10H
DQ 03fcacf30032be000H, 03d2e3733debf9165H
DQ 03fcc0d3213ae6000H, 03d4b15bcb18be2edH
DQ 03fcd49f9d6d66000H, 03d30b557c2a12d29H
DQ 03fce83c98a2d0000H, 03d442af5d10d18f2H
DQ 03fcfbc44e396e000H, 03d47b3f928665437H
DQ 03fd078d40936e000H, 03d38f1f608125902H
DQ 03fd112ce25b29000H, 03d3c851c0f45bae5H
DQ 03fd1ac0b77e3f000H, 03d3f97100b047ea3H
DQ 03fd243a590d2b000H, 03d3c9b75e8e9d45dH
DQ 03fd2db57ad935000H, 03cf934f5238ac23eH
DQ 03fd37158be940000H, 03d4a16d142e3f4deH
DQ 03fd40684445fb000H, 03d469ba14bfbfc6dH
DQ 03fd49ad4a118d000H, 03d45cd377302cca5H
DQ 03fd52d5be2114000H, 03d3a83640f883e4bH
DQ 03fd5bfe367828000H, 03d49755c3dea7d5aH
DQ 03fd6517e94738000H, 03d4e8a28223a67c4H
DQ 03fd6e22792ef1000H, 03d314f240e7e9039H
DQ 03fd771d87fd10000H, 03d258aaf31d36edbH
DQ 03fd8008b6b297000H, 03d1605b88ccad976H
DQ 03fd88e3a58a56000H, 03d2097ff572e71dfH
DQ 03fd91bd19e695000H, 03d4dbb3ee4f6c667H
DQ 03fd9a85babbe1000H, 03d4d889a0a61b2d6H
DQ 03fda33d25fcb1000H, 03d4f5875d92c8dd6H
DQ 03fdabe2f8ec96000H, 03d3c773190e2cc83H
DQ 03fdb4865273ed000H, 03d4ab54a099e1f60H
DQ 03fdbd07e0e781000H, 03d268ac21c0dcf20H
DQ 03fdc5960ba6e1000H, 03d43b4bd96cb81feH
DQ 03fdce1168b913000H, 03d2fada3055d19e2H
DQ 03fdd679920231000H, 03d18ed5096e87504H
DQ 03fddece20dffc000H, 03d43e26c2ced8aaaH
DQ 03fde71ebad35f000H, 03d011609e08e95e1H
DQ 03fdef6b3d3444000H, 03d40b35b2d1614faH
DQ 03fdf7a349e747000H, 03d4a6e7081d99120H
DQ 03fdffd6c9e8cc000H, 03cfa67452e86699dH
DQ 03fe03fa97e79f000H, 03d275e12e74f8beeH
DQ 03fe080748d542800H, 03d3b8c3b78ce0adbH
DQ 03fe0c11650cf0000H, 03d461752eb1152a5H
DQ 03fe1010826b18000H, 03d4ea3c98a07d258H
DQ 03fe140ccdd4ae800H, 03d1fcada197ed2c1H
DQ 03fe180633d744800H, 03d22551707e07a41H
DQ 03fe1bf426e8e9800H, 03d376aff6c055f55H
DQ 03fe1fdef5db3a000H, 03d4442de8501d871H
DQ 03fe23c68c8201000H, 03d270c749129a57aH
DQ 03fe27a23a05a8000H, 03d4cb0ea30b214a6H
DQ 0bfda8f9d1c354000H, 0bd4604f54f4f9853H
DQ 0bfda1506aee3b000H, 0bd44ff93dbb28c80H
DQ 0bfd99ae48aa53000H, 0bd0e6ed7003dfdf5H
DQ 0bfd9213957df2000H, 0bd3e186ac01b3f7fH
DQ 0bfd8a9228a043000H, 0bd49bc20cf8dd883H
DQ 0bfd8306ebf51c000H, 0bd45c8266e480596H
DQ 0bfd7b83a057f9000H, 0bd35f4f79f443745H
DQ 0bfd741a637fca000H, 0bd4025f49ff0180dH
DQ 0bfd6cb99e7aa4000H, 0bd412b5ad5a7002aH
DQ 0bfd654f5e853d000H, 0bd44c7008c4a72a7H
DQ 0bfd5dfff91d34000H, 0bd3f544ed390ba95H
DQ 0bfd56b9933779000H, 0bd391dc031bae772H
DQ 0bfd4f69f5d830000H, 0bd38f36dd24bae46H
DQ 0bfd483602143d000H, 0bce09c599a327931H
DQ 0bfd410b98a0d4000H, 0bd156a3c28e8042aH
DQ 0bfd39d83e4060000H, 0bd447f1643c10456H
DQ 0bfd32c15f8b57000H, 0bd0d6ee2e01d9231H
DQ 0bfd2ba1c0891f000H, 0bd3795076c3da632H
DQ 0bfd249f2ada03000H, 0bd2a7809feb5964fH
DQ 0bfd1d9406c900000H, 0bd4546d73ea7c032H
DQ 0bfd16935d34fb000H, 0bd2151c6348d84a4H
DQ 0bfd0fb093a3fd000H, 0bd2bacac000943a5H
DQ 0bfd08c588cda7000H, 0bd43c72c4f78dfa1H
DQ 0bfd01d228cf40000H, 0bd3c6972c813e541H
DQ 0bfcf5faa7e71a000H, 0bd3d157620c552c1H
DQ 0bfce867e093dc000H, 0bd366fa6f3fffcc0H
DQ 0bfcdac50fe6d4000H, 0bd2b6484bb8f2009H
DQ 0bfccd398e83e8000H, 0bd05f5cde492c839H
DQ 0bfcbfc5c1d5be000H, 0bd2784900e42b538H
DQ 0bfcb26a0fb83e000H, 0bd4a5b99e91f69b7H
DQ 0bfca4fed5abba000H, 0bd45976e8062c61fH
DQ 0bfc97d45e2448000H, 0bd401c636755cd02H
DQ 0bfc8a9ad0948a000H, 0bd4c89ba64f25a55H
DQ 0bfc7d520a4220000H, 0bd216a44d008a53dH
DQ 0bfc704b6c17f0000H, 0bd413a806d56d6eeH
DQ 0bfc633609cb64000H, 0bd33f125177ec11cH
DQ 0bfc563adff6b0000H, 0bd4d0837079422c3H
DQ 0bfc495a582ff2000H, 0bd3ebd9313709ef4H
DQ 0bfc3c6b62529a000H, 0bd42d2b08296bf5cH
DQ 0bfc2f9786ad2e000H, 0bd3b5188c2483623H
DQ 0bfc22df302746000H, 0bd3048e3c2505d3dH
DQ 0bfc1618c543b8000H, 0bd45b8d6a3b61bd1H
DQ 0bfc096e5a2260000H, 0bd4bde98232d61f6H
DQ 0bfbf9c0b5c568000H, 0bd4d3483b7a56256H
DQ 0bfbe089492ee4000H, 0bd405589fcd57f86H
DQ 0bfbc78bae5580000H, 0bd35351d0387c197H
DQ 0bfbaec8bfaf64000H, 0bd3d13cbabea0e44H
DQ 0bfb95eb24969c000H, 0bd3727fab299d747H
DQ 0bfb7d49341a08000H, 0bd4eeef8bcf7aa55H
DQ 0bfb64e3caa930000H, 0bd31aad2031e3ecaH
DQ 0bfb4c647d2ea8000H, 0bceb43c4115c4fb7H
DQ 0bfb3422b94a24000H, 0bd421b493a67e318H
DQ 0bfb1bc75cf5a4000H, 0bd4d7db2139e8397H
DQ 0bfb03aa8f8dc8000H, 0bd153121e9af5428H
DQ 0bfad6e8ef48f8000H, 0bd38293c51765dbcH
DQ 0bfaa6fbed7680000H, 0bd2b1c66db7cd724H
DQ 0bfa778fdc1828000H, 0bd34378af2af5332H
DQ 0bfa47f2e22550000H, 0bd2a424693c56dcdH
DQ 0bfa18249a5368000H, 0bd441b0d5fdf534bH
DQ 0bf9d1b35ee200000H, 0bd431fb72db4f24dH
DQ 0bf97427d317a0000H, 0bd4700f14b03b093H
DQ 0bf9163d20d100000H, 0bd46e8b9664fe33fH
DQ 0bf872c1f4cf00000H, 0bd2b4934580fe573H
DQ 0bf7709c46d780000H, 0bd4563ba56cde924H
DQ 0H, 0H
rcp_t2 DQ 03ff0000000000000H, 03fefff4000000000H
DQ 03feffe4000000000H, 03feffd4000000000H
DQ 03feffc4000000000H, 03feffb4000000000H
DQ 03feffa4000000000H, 03feff94000000000H
DQ 03feff84000000000H, 03feff74000000000H
DQ 03feff64000000000H, 03feff54000000000H
DQ 03feff44000000000H, 03feff34000000000H
DQ 03feff24000000000H, 03feff14000000000H
DQ 03feff04000000000H, 03fefef4000000000H
DQ 03fefee4000000000H, 03fefed4000000000H
DQ 03fefec4000000000H, 03fefeb4000000000H
DQ 03fefea4000000000H, 03fefe94000000000H
DQ 03fefe84000000000H, 03fefe74000000000H
DQ 03fefe64000000000H, 03fefe54000000000H
DQ 03fefe44000000000H, 03fefe34000000000H
DQ 03fefe24000000000H, 03fefe14000000000H
DQ 03fefe04000000000H, 03fefdf4000000000H
DQ 03fefde4000000000H, 03fefdd4000000000H
DQ 03fefdc4000000000H, 03fefdb4000000000H
DQ 03fefda4000000000H, 03fefd94000000000H
DQ 03fefd84000000000H, 03fefd74000000000H
DQ 03fefd64000000000H, 03fefd54000000000H
DQ 03fefd44000000000H, 03fefd34000000000H
DQ 03fefd28000000000H, 03fefd18000000000H
DQ 03fefd08000000000H, 03fefcf8000000000H
DQ 03fefce8000000000H, 03fefcd8000000000H
DQ 03fefcc8000000000H, 03fefcb8000000000H
DQ 03fefca8000000000H, 03fefc98000000000H
DQ 03fefc88000000000H, 03fefc78000000000H
DQ 03fefc68000000000H, 03fefc58000000000H
DQ 03fefc48000000000H, 03fefc38000000000H
DQ 03fefc28000000000H, 03fefc18000000000H
DQ 03ff0100000000000H, 03ff00fc000000000H
DQ 03ff00f8000000000H, 03ff00f4000000000H
DQ 03ff00f0000000000H, 03ff00ec000000000H
DQ 03ff00e8000000000H, 03ff00e4000000000H
DQ 03ff00e0000000000H, 03ff00dc000000000H
DQ 03ff00d8000000000H, 03ff00d4000000000H
DQ 03ff00d0000000000H, 03ff00cc000000000H
DQ 03ff00c8000000000H, 03ff00c4000000000H
DQ 03ff00c0000000000H, 03ff00bc000000000H
DQ 03ff00b8000000000H, 03ff00b4000000000H
DQ 03ff00b0000000000H, 03ff00ac000000000H
DQ 03ff00a8000000000H, 03ff00a4000000000H
DQ 03ff00a0000000000H, 03ff009c000000000H
DQ 03ff0098000000000H, 03ff0094000000000H
DQ 03ff0090000000000H, 03ff008c000000000H
DQ 03ff0088000000000H, 03ff0084000000000H
DQ 03ff0080000000000H, 03ff007c000000000H
DQ 03ff0078000000000H, 03ff0074000000000H
DQ 03ff0070000000000H, 03ff006c000000000H
DQ 03ff0068000000000H, 03ff0064000000000H
DQ 03ff0060000000000H, 03ff005c000000000H
DQ 03ff0058000000000H, 03ff0054000000000H
DQ 03ff0050000000000H, 03ff004c000000000H
DQ 03ff0048000000000H, 03ff0044000000000H
DQ 03ff0040000000000H, 03ff003c000000000H
DQ 03ff0038000000000H, 03ff0034000000000H
DQ 03ff0030000000000H, 03ff002c000000000H
DQ 03ff0028000000000H, 03ff0024000000000H
DQ 03ff0020000000000H, 03ff001c000000000H
DQ 03ff0018000000000H, 03ff0014000000000H
DQ 03ff0010000000000H, 03ff000c000000000H
DQ 03ff0008000000000H, 03ff0004000000000H
DQ 03ff0000000000000H, 0
log2_t2 DQ 0, 0
DQ 03f2150297c800000H, 03d210909f6306155H
DQ 03f34332be0000000H, 03d09518ce032f41dH
DQ 03f3fbe9f60c00000H, 03d4ac9bc570c3b37H
DQ 03f45a537a3600000H, 03d4325006127af86H
DQ 03f4b6b4dcbc00000H, 03d3c621fbc9e2ad6H
DQ 03f5098c916300000H, 03d3f7aec2cad082aH
DQ 03f537c0264100000H, 03d4bdf2754a94bbeH
DQ 03f565f52d1000000H, 03d46f089976214ecH
DQ 03f5942ba5e700000H, 03d2645f4fefad48aH
DQ 03f5c26390dc00000H, 03d394ecb87dff47fH
DQ 03f5f09cee0700000H, 03d415d326245addfH
DQ 03f60f6bdebf80000H, 03d492366d5b7121cH
DQ 03f62689ffae00000H, 03d3360481790324fH
DQ 03f63da8d9da00000H, 03d31fe61b7973265H
DQ 03f654c86d4f00000H, 03d4d5202bf82be32H
DQ 03f66be8ba1980000H, 03d3a5f8d1a33f641H
DQ 03f68309c04400000H, 03d4f65693283bc5bH
DQ 03f69a2b7fdb00000H, 03d4b05a072311cdeH
DQ 03f6b14df8ea00000H, 03d2da3ce84a38084H
DQ 03f6c8712b7c00000H, 03d385b88ccf9e4bcH
DQ 03f6df95179d00000H, 03d4138577c1eb13eH
DQ 03f6f6b9bd5880000H, 03d4eb2dd71123ec2H
DQ 03f706ef8e5d40000H, 03d4d0d7b6d01207aH
DQ 03f712829ae740000H, 03d44fe53f52c6d10H
DQ 03f71e16045000000H, 03d3f031f657d9491H
DQ 03f729a9ca9d40000H, 03d45d9663a7e7da0H
DQ 03f7353dedd500000H, 03d418e26d5dfd1bfH
DQ 03f740d26dfd00000H, 03d38dc829af0262cH
DQ 03f74c674b1b00000H, 03d408e4eb4d165e5H
DQ 03f757fc853500000H, 03d3092346f3f705eH
DQ 03f763921c5080000H, 03d4e3fa9e85711eeH
DQ 03f76f281073c0000H, 03d4d59479023862bH
DQ 03f77abe61a480000H, 03d40c38980430771H
DQ 03f786550fe880000H, 03d1f92db260b1230H
DQ 03f791ec1b4580000H, 03d150038c4b502c5H
DQ 03f79d8383c140000H, 03d48cd3d7b281721H
DQ 03f7a91b496200000H, 03d42c11f472c64baH
DQ 03f7b4b36c2d40000H, 03d4d0945eaf29dd2H
DQ 03f7c04bec2940000H, 03d21e7318833be77H
DQ 03f7cbe4c95b40000H, 03d462d58105ef8bfH
DQ 03f7d77e03c980000H, 03d4f85219e901c30H
DQ 03f7e3179b7a00000H, 03d3c51fbafc4227cH
DQ 03f7eeb1907240000H, 03d400766896bf3baH
DQ 03f7fa4be2b840000H, 03d43558362ba179cH
DQ 03f802f3492900000H, 03d2a3ccb5f4b8d2aH
DQ 03f8074d69a3c0000H, 03d490b788dcc06d5H
DQ 03f80d1b1320e0000H, 03d2b412556cf5977H
DQ 03f812e8eb4fc0000H, 03d45c237732b1f78H
DQ 03f818b6f23380000H, 03d45669defd365c1H
DQ 03f81e8527cf00000H, 03d4589b8de73054bH
DQ 03f824538c2540000H, 03d28fab914103d9cH
DQ 03f82a221f3900000H, 03d47df970829f58aH
DQ 03f82ff0e10d60000H, 03d4b0d87d80e4623H
DQ 03f835bfd1a560000H, 03cf61343d497e17fH
DQ 03f83b8ef103a0000H, 03d49f7f4ef56f96bH
DQ 03f8415e3f2b60000H, 03d4859d5f817f2faH
DQ 03f8472dbc1f80000H, 03d3b2734e7bf7114H
DQ 03f84cfd67e2e0000H, 03d3753903d1eeba1H
DQ 03f852cd427880000H, 03d23a058a8f8ba37H
DQ 03f8589d4be340000H, 03d37c2ec6bdcca43H
DQ 03f85e6d842620000H, 03d43701d45acf2c4H
DQ 03f8643deb4420000H, 03d3d6b197832ab27H
DQ 03f86a0e814020000H, 03d411a9b5557b8ccH
DQ 0bf7709c46d780000H, 0bd4563ba56cde924H
DQ 0bf76adca91cc0000H, 0bd37a1a05bc6b74bH
DQ 0bf7651cf479c0000H, 0bd461bfa6c8b2465H
DQ 0bf75f5d28ee00000H, 0bd48fc8fd49e79d0H
DQ 0bf7599d4678c0000H, 0bd4925a3c7b88c7cH
DQ 0bf753dd4d1940000H, 0bd4b4606033fb2beH
DQ 0bf74e1d3ccf00000H, 0bd20210971a52753H
DQ 0bf7485d1598c0000H, 0bd4812a07c384c12H
DQ 0bf7429cd77640000H, 0bd4c07239b769baaH
DQ 0bf73cdc8266c0000H, 0bd44838a3ea90181H
DQ 0bf7371c166980000H, 0bd288537c7f77e67H
DQ 0bf7315b937d80000H, 0bd4575a30536968cH
DQ 0bf72b9af9a280000H, 0bd2c45e11e2e7675H
DQ 0bf725da48d740000H, 0bd4f8176c38b4ce6H
DQ 0bf72019811bc0000H, 0bd1a700bd79ac8a3H
DQ 0bf71a58a26e80000H, 0bd46fb3522850043H
DQ 0bf71497accf40000H, 0bd4f08e7ddd3e76fH
DQ 0bf70ed6a03d40000H, 0bd4ff2a8fb0fa804H
DQ 0bf709157cb7c0000H, 0bd4e2fc0aec80d04H
DQ 0bf70354423e00000H, 0bd4e332fcfabff4fH
DQ 0bf6fb25e19f00000H, 0bd21aebe490c8214H
DQ 0bf6efa310d600000H, 0bd4543b144a21404H
DQ 0bf6e420122080000H, 0bd45215e0a197589H
DQ 0bf6d89ce57d00000H, 0bd30cd2d2dbef9ddH
DQ 0bf6cd198ae980000H, 0bd4370f2ebb44e84H
DQ 0bf6c196026500000H, 0bd4a99c21180f792H
DQ 0bf6b6124bee80000H, 0bd11b04ea788b3a9H
DQ 0bf6aa8e678380000H, 0bd3d2d0d040e5bb2H
DQ 0bf69f0a552380000H, 0bd201eaa7eae8a79H
DQ 0bf6938614cc80000H, 0bd2b467aacd98f5bH
DQ 0bf68801a67d00000H, 0bd4b3840d3f33c6bH
DQ 0bf67c7d0a3480000H, 0bd25ec92da83377dH
DQ 0bf670f83ff080000H, 0bd33ab2631d4676dH
DQ 0bf6657347b000000H, 0bd38fd1349b69dfeH
DQ 0bf659ee217180000H, 0bd41a8baa44fb97dH
DQ 0bf64e68cd3380000H, 0bd4d828cbc5c5ff3H
DQ 0bf642e34af500000H, 0bd44361aa8b3c316H
DQ 0bf6375d9ab400000H, 0bd49e932f704de99H
DQ 0bf62bd7bc6f80000H, 0bd42bd57c254b5e3H
DQ 0bf62051b02600000H, 0bd167df372942ee0H
DQ 0bf614cb75d580000H, 0bd3c729ec54d36cdH
DQ 0bf609450d7d00000H, 0bd490ea5c63bcdf1H
DQ 0bf5fb7cee3700000H, 0bd2d803cea0e76a9H
DQ 0bf5e46f655d00000H, 0bd4d398b96b4f4d5H
DQ 0bf5cd61806b00000H, 0bd4ea2cca3058bbdH
DQ 0bf5b6533f5e00000H, 0bd3f3e6ba7bbdd88H
DQ 0bf59f44a23200000H, 0bd442ddc05082614H
DQ 0bf58835a8e500000H, 0bd40498534d8fe6dH
DQ 0bf57126537400000H, 0bd2fa2a0fd4fca1cH
DQ 0bf55a16a1db00000H, 0bd4efd6c9949b49bH
DQ 0bf54306941900000H, 0bd4975aa0b715781H
DQ 0bf52bf62a2a00000H, 0bd4b3ae86d7c16e7H
DQ 0bf514e5640c00000H, 0bd3064bec2477c3fH
DQ 0bf4fba8837600000H, 0bd20f3d834ceb438H
DQ 0bf4cd85866800000H, 0bd433742d88c7aa2H
DQ 0bf49f61d0ea00000H, 0bd48f98b25223470H
DQ 0bf4713d62f600000H, 0bd4957c30af53ad3H
DQ 0bf443183c8600000H, 0bd48218d1305b92fH
DQ 0bf414f25d9400000H, 0bd492239f241b9b9H
DQ 0bf3cd978c3800000H, 0bcd0642236ea2a75H
DQ 0bf37148ec2800000H, 0bd40dfe447087803H
DQ 0bf314f8daf400000H, 0bd3e3bcf284f9cb2H
DQ 0bf2714eb11800000H, 0bd4e94d8dd523885H
DQ 0bf1715193b000000H, 0bd17d35d328b2afeH
DQ 0, 0
rcp_t3 DQ 03ff7154740000000H, 03ff71545c0000000H
DQ 03ff7154440000000H, 03ff7154300000000H
DQ 03ff7154180000000H, 03ff7154000000000H
DQ 03ff7153e80000000H, 03ff7153d40000000H
DQ 03ff7153bc0000000H, 03ff7153a40000000H
DQ 03ff71538c0000000H, 03ff7153780000000H
DQ 03ff7153600000000H, 03ff7153480000000H
DQ 03ff7153300000000H, 03ff7153180000000H
DQ 03ff7153040000000H, 03ff7152ec0000000H
DQ 03ff7152d40000000H, 03ff7152bc0000000H
DQ 03ff7152a80000000H, 03ff7152900000000H
DQ 03ff7152780000000H, 03ff7152600000000H
DQ 03ff71524c0000000H, 03ff7152340000000H
DQ 03ff71521c0000000H, 03ff7152040000000H
DQ 03ff7151ec0000000H, 03ff7151d80000000H
DQ 03ff7151c00000000H, 03ff7151a80000000H
DQ 03ff7151900000000H, 03ff71517c0000000H
DQ 03ff7151640000000H, 03ff71514c0000000H
DQ 03ff7151340000000H, 03ff71511c0000000H
DQ 03ff7151080000000H, 03ff7150f00000000H
DQ 03ff7150d80000000H, 03ff7150c00000000H
DQ 03ff7150ac0000000H, 03ff7150940000000H
DQ 03ff71507c0000000H, 03ff7150640000000H
DQ 03ff7150500000000H, 03ff7150380000000H
DQ 03ff7150200000000H, 03ff7150080000000H
DQ 03ff714ff00000000H, 03ff714fdc0000000H
DQ 03ff714fc40000000H, 03ff714fac0000000H
DQ 03ff714f940000000H, 03ff714f800000000H
DQ 03ff714f680000000H, 03ff714f500000000H
DQ 03ff714f380000000H, 03ff714f240000000H
DQ 03ff714f0c0000000H, 03ff714ef40000000H
DQ 03ff714edc0000000H, 03ff714ec40000000H
DQ 03ff714eb00000000H, 03ff714e980000000H
DQ 03ff714e800000000H, 03ff714e680000000H
DQ 03ff714e540000000H, 03ff714e3c0000000H
DQ 03ff714e240000000H, 03ff714e0c0000000H
DQ 03ff714df80000000H, 03ff714de00000000H
DQ 03ff714dc80000000H, 03ff714db00000000H
DQ 03ff714d980000000H, 03ff714d840000000H
DQ 03ff714d6c0000000H, 03ff714d540000000H
DQ 03ff714d3c0000000H, 03ff714d280000000H
DQ 03ff714d100000000H, 03ff714cf80000000H
DQ 03ff714ce00000000H, 03ff714ccc0000000H
DQ 03ff714cb40000000H, 03ff714c9c0000000H
DQ 03ff714c840000000H, 03ff714c6c0000000H
DQ 03ff714c580000000H, 03ff714c400000000H
DQ 03ff714c280000000H, 03ff714c100000000H
DQ 03ff714bfc0000000H, 03ff714be40000000H
DQ 03ff714bcc0000000H, 03ff714bb40000000H
DQ 03ff714ba00000000H, 03ff714b880000000H
DQ 03ff714b700000000H, 03ff714b580000000H
DQ 03ff714b400000000H, 03ff714b2c0000000H
DQ 03ff714b140000000H, 03ff714afc0000000H
DQ 03ff714ae40000000H, 03ff714ad00000000H
DQ 03ff714ab80000000H, 03ff714aa00000000H
DQ 03ff714a880000000H, 03ff714a740000000H
DQ 03ff714a5c0000000H, 03ff714a440000000H
DQ 03ff714a2c0000000H, 03ff714a140000000H
DQ 03ff714a000000000H, 03ff7149e80000000H
DQ 03ff7149d00000000H, 03ff7149b80000000H
DQ 03ff7149a40000000H, 03ff71498c0000000H
DQ 03ff7149740000000H, 03ff71495c0000000H
DQ 03ff7149480000000H, 03ff7149300000000H
DQ 03ff7149180000000H, 03ff7149000000000H
DQ 03ff715a380000000H, 03ff715a2c0000000H
DQ 03ff715a240000000H, 03ff715a180000000H
DQ 03ff715a0c0000000H, 03ff715a000000000H
DQ 03ff7159f40000000H, 03ff7159e80000000H
DQ 03ff7159dc0000000H, 03ff7159d00000000H
DQ 03ff7159c40000000H, 03ff7159bc0000000H
DQ 03ff7159b00000000H, 03ff7159a40000000H
DQ 03ff7159980000000H, 03ff71598c0000000H
DQ 03ff7159800000000H, 03ff7159740000000H
DQ 03ff7159680000000H, 03ff7159600000000H
DQ 03ff7159540000000H, 03ff7159480000000H
DQ 03ff71593c0000000H, 03ff7159300000000H
DQ 03ff7159240000000H, 03ff7159180000000H
DQ 03ff71590c0000000H, 03ff7159000000000H
DQ 03ff7158f80000000H, 03ff7158ec0000000H
DQ 03ff7158e00000000H, 03ff7158d40000000H
DQ 03ff7158c80000000H, 03ff7158bc0000000H
DQ 03ff7158b00000000H, 03ff7158a40000000H
DQ 03ff7158980000000H, 03ff7158900000000H
DQ 03ff7158840000000H, 03ff7158780000000H
DQ 03ff71586c0000000H, 03ff7158600000000H
DQ 03ff7158540000000H, 03ff7158480000000H
DQ 03ff71583c0000000H, 03ff7158300000000H
DQ 03ff7158280000000H, 03ff71581c0000000H
DQ 03ff7158100000000H, 03ff7158040000000H
DQ 03ff7157f80000000H, 03ff7157ec0000000H
DQ 03ff7157e00000000H, 03ff7157d40000000H
DQ 03ff7157cc0000000H, 03ff7157c00000000H
DQ 03ff7157b40000000H, 03ff7157a80000000H
DQ 03ff71579c0000000H, 03ff7157900000000H
DQ 03ff7157840000000H, 03ff7157780000000H
DQ 03ff71576c0000000H, 03ff7157640000000H
DQ 03ff7157580000000H, 03ff71574c0000000H
DQ 03ff7157400000000H, 03ff7157340000000H
DQ 03ff7157280000000H, 03ff71571c0000000H
DQ 03ff7157100000000H, 03ff7157040000000H
DQ 03ff7156fc0000000H, 03ff7156f00000000H
DQ 03ff7156e40000000H, 03ff7156d80000000H
DQ 03ff7156cc0000000H, 03ff7156c00000000H
DQ 03ff7156b40000000H, 03ff7156a80000000H
DQ 03ff7156a00000000H, 03ff7156940000000H
DQ 03ff7156880000000H, 03ff71567c0000000H
DQ 03ff7156700000000H, 03ff7156640000000H
DQ 03ff7156580000000H, 03ff71564c0000000H
DQ 03ff7156400000000H, 03ff7156380000000H
DQ 03ff71562c0000000H, 03ff7156200000000H
DQ 03ff7156140000000H, 03ff7156080000000H
DQ 03ff7155fc0000000H, 03ff7155f00000000H
DQ 03ff7155e40000000H, 03ff7155d80000000H
DQ 03ff7155d00000000H, 03ff7155c40000000H
DQ 03ff7155b80000000H, 03ff7155ac0000000H
DQ 03ff7155a00000000H, 03ff7155940000000H
DQ 03ff7155880000000H, 03ff71557c0000000H
DQ 03ff7155700000000H, 03ff7155680000000H
DQ 03ff71555c0000000H, 03ff7155500000000H
DQ 03ff7155440000000H, 03ff7155380000000H
DQ 03ff71552c0000000H, 03ff7155200000000H
DQ 03ff7155140000000H, 03ff71550c0000000H
DQ 03ff7155000000000H, 03ff7154f40000000H
DQ 03ff7154e80000000H, 03ff7154dc0000000H
DQ 03ff7154d00000000H, 03ff7154c40000000H
DQ 03ff7154b80000000H, 03ff7154ac0000000H
DQ 03ff7154a40000000H, 03ff7154980000000H
DQ 03ff71548c0000000H, 03ff7154800000000H
DQ 03ff7154740000000H, 0
log2_t3 DQ 0, 0
DQ 03eb80000c0000000H, 03d4722f0009be959H
DQ 03ec80001a0000000H, 03d45e6576cb6dc2eH
DQ 03ed10001a0000000H, 03d480762a98bdb6aH
DQ 03ed7000300000000H, 03d231a4c495ec799H
DQ 03edd0004b0000000H, 03d4926846928cda3H
DQ 03ee1800368000000H, 03d4527509fdde667H
DQ 03ee4000470000000H, 03d44fbd1292ae6daH
DQ 03ee70005d8000000H, 03d4ef91cb226fd03H
DQ 03eea000778000000H, 03d40978c9dc43b2eH
DQ 03eed000948000000H, 03d33ae75bbe97951H
DQ 03eef800af0000000H, 03d2d81b9a1639c05H
DQ 03ef140068c000000H, 03d3d3aa4a1dd8452H
DQ 03ef2c007b8000000H, 03d4d7bbe110bfb09H
DQ 03ef4400900000000H, 03d43fbcb9ab61086H
DQ 03ef5c00a60000000H, 03d421d94dff79062H
DQ 03ef7000b98000000H, 03d43b8e9647408a2H
DQ 03ef8800d24000000H, 03d4fd8ce39e1fdd4H
DQ 03efa000ecc000000H, 03d439ab84e20bc42H
DQ 03efb80108c000000H, 03d3dfd83269c6ac2H
DQ 03efcc01214000000H, 03d3ca32ecd8004e0H
DQ 03efe401400000000H, 03d47b472936c6005H
DQ 03effc01608000000H, 03d31736ce8ef8e21H
DQ 03f00a00c14000000H, 03d0617cfc138ccabH
DQ 03f01400cfe000000H, 03d4e6d11d620108aH
DQ 03f02000e26000000H, 03d2451827455b88dH
DQ 03f02c00f58000000H, 03d435e7b8e426950H
DQ 03f03801098000000H, 03d3296f937d77647H
DQ 03f044011e4000000H, 03d2b6df6e16cae71H
DQ 03f04e01302000000H, 03d2ff9376a2ea421H
DQ 03f05a01464000000H, 03d438ebd204c10d2H
DQ 03f066015d4000000H, 03d2b09d7e2fc6debH
DQ 03f07201750000000H, 03d099925641f4f35H
DQ 03f07c01896000000H, 03cedfbf4f07288e3H
DQ 03f08801a28000000H, 03d32a0616748ca2aH
DQ 03f09401bc6000000H, 03d49cc1e9cba43abH
DQ 03f0a001d72000000H, 03d41ebd38173f5dbH
DQ 03f0ac01f2a000000H, 03d41af6954471a92H
DQ 03f0b6020a2000000H, 03d44a88bd59f4b89H
DQ 03f0c202272000000H, 03d137160b27044e6H
DQ 03f0ce0244c000000H, 03d47d7f6c97ef2fcH
DQ 03f0da02634000000H, 03d44e605e1bb0db2H
DQ 03f0e4027d4000000H, 03d459d8417d4ebcfH
DQ 03f0f0029d4000000H, 03cf5ca7f05f05027H
DQ 03f0fc02bde000000H, 03d4363b1c234f566H
DQ 03f104016fb000000H, 03d3b7b6ed1035771H
DQ 03f109017df000000H, 03d38699e204367efH
DQ 03f10f018f6000000H, 03d44924bd9581118H
DQ 03f11501a14000000H, 03d2252e80eb13b47H
DQ 03f11b01b37000000H, 03d4c3c3381ce38a0H
DQ 03f12101c61000000H, 03d4b88d24672a90dH
DQ 03f12601d5e000000H, 03d4e1fc955055fefH
DQ 03f12c01e94000000H, 03d36e18a547f3bc2H
DQ 03f13201fd0000000H, 03ce9cbf2c6119ad4H
DQ 03f13802111000000H, 03d4d03232a579871H
DQ 03f13d02222000000H, 03d4d5c820ab96aa1H
DQ 03f14302370000000H, 03d2ff6235a37497cH
DQ 03f149024c3000000H, 03d4a4461e61bb95eH
DQ 03f14f0261d000000H, 03d4431272c3ec2f0H
DQ 03f15402742000000H, 03d424e2b9e3a8113H
DQ 03f15a028a7000000H, 03d4a40baad7a3180H
DQ 03f16002a13000000H, 03d33b2fef1b1988bH
DQ 03f16602b85000000H, 03d01893f34559377H
DQ 03f16c02cfc000000H, 03d4ffe120fb3ef44H
DQ 03f17102e3b000000H, 03d120082c162d124H
DQ 03f17702fbe000000H, 03d3e587c5b282967H
DQ 03f17d03148000000H, 03d1df8f956673eacH
DQ 03f183032d7000000H, 03d4ff8cd42de4f13H
DQ 03f1880342a000000H, 03c83f84104915062H
DQ 03f18e035c5000000H, 03d3484a765ad0e81H
DQ 03f19403766000000H, 03d4c2a7e827b5b7cH
DQ 03f19a0390e000000H, 03d45b9d9e619a5feH
DQ 03f19f03a74000000H, 03d4389fde2d65d47H
DQ 03f1a503c27000000H, 03d4b2175bb6d7bccH
DQ 03f1ab03de1000000H, 03d34c0cf5c760a80H
DQ 03f1b103fa1000000H, 03d046edae6d3e9a5H
DQ 03f1b704166000000H, 03d4fd521af377bfcH
DQ 03f1bc042e6000000H, 03d0cf59fe6ab1bfdH
DQ 03f1c2044b7000000H, 03d3ccd20cc753db5H
DQ 03f1c80468f000000H, 03d152df2a92669ccH
DQ 03f1ce0486c000000H, 03d4e8cfdbe6ff5d7H
DQ 03f1d3049ff000000H, 03d4e51b637245449H
DQ 03f1d904be9000000H, 03d30855ccdda9dd0H
DQ 03f1df04dd8000000H, 03d49dc0197d07430H
DQ 03f1e504fce000000H, 03d431dc9bd27e20aH
DQ 03f1ea05175000000H, 03d40ae402534fea4H
DQ 03f1f005376000000H, 03d47fa77710aad2aH
DQ 03f1f60557e000000H, 03d2bbdb4e113204bH
DQ 03f1fc0578b000000H, 03d4d8d3b6e50d246H
DQ 03f20102ccf800000H, 03d4bd3fc06a15de9H
DQ 03f20382daf800000H, 03d4d93a1498ec6c9H
DQ 03f20682ebf800000H, 03d33cb6df935a7f0H
DQ 03f20982fd2000000H, 03d4de1089920cfdaH
DQ 03f20c830e8000000H, 03d4985b012a6b1acH
DQ 03f20f031d2000000H, 03d4913e1b9ba2290H
DQ 03f212032ee000000H, 03d1624a57980edbcH
DQ 03f2150340c800000H, 03d441ee709125ff3H
DQ 03f2180352e800000H, 03d3a45e575f48b5dH
DQ 03f21a83622800000H, 03d3501dd1e238a6cH
DQ 03f21d8374a000000H, 03d4191bc1ea6aa2cH
DQ 03f22083875000000H, 03ce323237921f7b0H
DQ 03f223839a2800000H, 03d46b179d0781ff4H
DQ 03f22683ad3800000H, 03d44c09dda134362H
DQ 03f22903bd4000000H, 03d4652e31de50175H
DQ 03f22c03d0b000000H, 03d137d77dcd68a32H
DQ 03f22f03e44800000H, 03d4636fb2840cc02H
DQ 03f23203f81800000H, 03d41a8e1979c27f4H
DQ 03f2348408c000000H, 03d410dbf84163334H
DQ 03f237841ce800000H, 03d4a8e042a7d4e75H
DQ 03f23a84314800000H, 03d3772593772be29H
DQ 03f23d8445d800000H, 03d223d4b2e8c031dH
DQ 03f24004572000000H, 03d0c8072ca9dad06H
DQ 03f243046c0800000H, 03d315a83ee313d33H
DQ 03f24604812000000H, 03d473dc4088b7c68H
DQ 03f24904967000000H, 03d3af34ea9dceae1H
DQ 03f24c04abf000000H, 03d36c20ba0653485H
DQ 03f24e84be0000000H, 03d39a63c847be3ffH
DQ 03f25184d3d800000H, 03d48ca7750a55975H
DQ 03f25484e9e800000H, 03d38db2a2d1381bbH
DQ 03f25785002800000H, 03d2ef2461fbe7983H
DQ 03f25a0512d800000H, 03d2c153bc40c395cH
DQ 03f25d05297000000H, 03d4064fc5a39c232H
DQ 03f26005404000000H, 03d070d1f7c4b597eH
DQ 03f26305573800000H, 03d4a28e9bdbbc457H
DQ 03f265856a8800000H, 03d474989ecc252f3H
DQ 03f2688581e000000H, 03d4e13090fc01d57H
DQ 03f26b85997000000H, 03d391227c8678403H
DQ 03f26e85b13000000H, 03d155e22f244140dH
DQ 0bf170fd210000000H, 0bd24caa429329aeeH
DQ 0bf16dfd2ce000000H, 0bd4cb96d8562dc37H
DQ 0bf16bfd34d000000H, 0bd2813e19b9dbfb8H
DQ 0bf168fd409000000H, 0bd34c1a453011cc5H
DQ 0bf165fd4c3000000H, 0bd4cd61ac43e09bcH
DQ 0bf162fd57c000000H, 0bd4d64cef90ca8baH
DQ 0bf15ffd634000000H, 0bd3819d713b1c267H
DQ 0bf15cfd6ea000000H, 0bd319cda711db032H
DQ 0bf159fd79e000000H, 0bd43a950c71a6171H
DQ 0bf156fd851000000H, 0bd393b25eece00b9H
DQ 0bf153fd902000000H, 0bd43ab308b5fe712H
DQ 0bf151fd977000000H, 0bd4ca5e736256734H
DQ 0bf14efda26000000H, 0bd40886b3b9c924dH
DQ 0bf14bfdad3000000H, 0bd428441ff31aa38H
DQ 0bf148fdb7f000000H, 0bd14cb421675c431H
DQ 0bf145fdc29000000H, 0bcf8fb590baebb8dH
DQ 0bf142fdcd1000000H, 0bd3a1f2ca38e93f3H
DQ 0bf13ffdd78000000H, 0bd2dc25e83d52ed1H
DQ 0bf13cfde1d000000H, 0bd3fd5b6efa081f3H
DQ 0bf13afde8a000000H, 0bd49d89dd4f2bf07H
DQ 0bf137fdf2d000000H, 0bd3e4f3d5d3a13b4H
DQ 0bf134fdfce000000H, 0bd428fd96a5f7723H
DQ 0bf131fe06e000000H, 0bd20452b288690a5H
DQ 0bf12efe10c000000H, 0bd1d5f7c7e56ea2dH
DQ 0bf12bfe1a8000000H, 0bd415fc47d421debH
DQ 0bf128fe243000000H, 0bd3a598ca8dc214bH
DQ 0bf125fe2dc000000H, 0bd4712f1d7350f14H
DQ 0bf122fe374000000H, 0bd3e24878efa43e1H
DQ 0bf120fe3d8000000H, 0bd48adffee23f9f0H
DQ 0bf11dfe46d000000H, 0bd4d81e00aec2d96H
DQ 0bf11afe501000000H, 0bd406eddef9956b1H
DQ 0bf117fe593000000H, 0bd4174f65e105551H
DQ 0bf114fe624000000H, 0bcf284c306b71311H
DQ 0bf111fe6b2000000H, 0bd4dcc69dfedbec3H
DQ 0bf10efe740000000H, 0bd323b7cee38aa4bH
DQ 0bf10bfe7cc000000H, 0bd144104fd28c140H
DQ 0bf108fe856000000H, 0bd34171a36d6a695H
DQ 0bf106fe8b1000000H, 0bd4354a0acea06cdH
DQ 0bf103fe939000000H, 0bd2eb1b1fae67526H
DQ 0bf100fe9bf000000H, 0bd343a73fc467e03H
DQ 0bf0fbfd486000000H, 0bd4aa705ed090ecaH
DQ 0bf0f5fd58c000000H, 0bd4949cd0d4cde8eH
DQ 0bf0effd690000000H, 0bd2816308340bd3dH
DQ 0bf0e9fd790000000H, 0bcfb47fd2e8624a6H
DQ 0bf0e3fd88c000000H, 0bd338fca5233867dH
DQ 0bf0ddfd986000000H, 0bcf9cf14342e7c21H
DQ 0bf0d9fda2a000000H, 0bd3388827d84b6e0H
DQ 0bf0d3fdb1e000000H, 0bd3b3e0a6d6a2247H
DQ 0bf0cdfdc0e000000H, 0bd4f92aec1df2a86H
DQ 0bf0c7fdcfc000000H, 0bd4f9f3aa2200d30H
DQ 0bf0c1fdde8000000H, 0bd3b894b32ad9b9fH
DQ 0bf0bbfded0000000H, 0bd3405d8d2c46051H
DQ 0bf0b5fdfb4000000H, 0bd445a0bd420a715H
DQ 0bf0affe096000000H, 0bd39940136e0a90fH
DQ 0bf0abfe12a000000H, 0bd46b0a6f2af86bbH
DQ 0bf0a5fe206000000H, 0bd4bf4a2ca335408H
DQ 0bf09ffe2e0000000H, 0bd3ea2d6b12e4d93H
DQ 0bf099fe3b6000000H, 0bd40c6fd5fb7f840H
DQ 0bf093fe48a000000H, 0bce555685c9c3116H
DQ 0bf08dfe558000000H, 0bd4dfc70dfa2e7c3H
DQ 0bf087fe626000000H, 0bd337897b84ac785H
DQ 0bf081fe6f0000000H, 0bd1ca71ac6acd2d7H
DQ 0bf07bfe7b6000000H, 0bd370c682f1de078H
DQ 0bf077fe838000000H, 0bd45185d76c79d4cH
DQ 0bf071fe8fa000000H, 0bd33bb0cdd985699H
DQ 0bf06bfe9b8000000H, 0bd3976c00642b301H
DQ 0bf065fea72000000H, 0bd4db1e6f5a163e7H
DQ 0bf05ffeb2a000000H, 0bd4cc11808263596H
DQ 0bf059febe0000000H, 0bd33d1dff912d171H
DQ 0bf053fec92000000H, 0bd24a5ae52911a3aH
DQ 0bf04dfed40000000H, 0bd3d050f249f8edcH
DQ 0bf047fedec000000H, 0bd27d102dd924b0eH
DQ 0bf043fee5c000000H, 0bd3e62957baad081H
DQ 0bf03dfef02000000H, 0bd4376ad4524f2a0H
DQ 0bf037fefa6000000H, 0bd2752913877e949H
DQ 0bf031ff046000000H, 0bd292cb26a5ff847H
DQ 0bf02bff0e2000000H, 0bd44da42ec6a2baeH
DQ 0bf025ff17c000000H, 0bd4181e4056b600bH
DQ 0bf01fff212000000H, 0bd4c420ca7722725H
DQ 0bf019ff2a6000000H, 0bd451ab99454bc09H
DQ 0bf015ff306000000H, 0bd4f4702fac61211H
DQ 0bf00fff396000000H, 0bd23ccbf691e23e3H
DQ 0bf009ff420000000H, 0bd48b7d85ede8a3bH
DQ 0bf003ff4a8000000H, 0bd4a94f94a602836H
DQ 0beffbfea5c000000H, 0bd35151ebd4248b6H
DQ 0befeffeb60000000H, 0bd31312ebaebde60H
DQ 0befe3fec5c000000H, 0bd44bf0e08b2a851H
DQ 0befd7fed54000000H, 0bd3dfbe044563cddH
DQ 0befcbfee44000000H, 0bd47553a6bb2cf4dH
DQ 0befc3feee4000000H, 0bd02b3272c9e1514H
DQ 0befb7fefc8000000H, 0bd4655cdd79568b8H
DQ 0befabff0a8000000H, 0bd4998c8c6a29955H
DQ 0bef9fff184000000H, 0bd35e84003879074H
DQ 0bef93ff258000000H, 0bd34cfa09595f318H
DQ 0bef87ff324000000H, 0bd47f3d66389e086H
DQ 0bef7bff3ec000000H, 0bd43982f0dd1df79H
DQ 0bef6fff4ac000000H, 0bd4d54d70b7407c7H
DQ 0bef63ff568000000H, 0bd4529cb1e4119e9H
DQ 0bef5bff5e0000000H, 0bd4ea8cf63b0e57aH
DQ 0bef4fff694000000H, 0bd1a872dd1f9867bH
DQ 0bef43ff73c000000H, 0bd46113f80238647H
DQ 0bef37ff7e0000000H, 0bd46e9d9772d7da6H
DQ 0bef2bff880000000H, 0bd276ac184b1770cH
DQ 0bef1fff918000000H, 0bd171e07ff78e451H
DQ 0bef13ff9a8000000H, 0bd3c0a102a88bdf6H
DQ 0bef07ffa34000000H, 0bd2cfa098be9e4a8H
DQ 0beef7ff570000000H, 0bd3d205955bedc7eH
DQ 0beee7ff618000000H, 0bd47b79acbd1c3d4H
DQ 0beecfff710000000H, 0bd37b870ff9b8582H
DQ 0beeb7ff7f8000000H, 0bd3c31fb1038dd6dH
DQ 0bee9fff8d0000000H, 0bd4e6de6a68aa227H
DQ 0bee87ff9a0000000H, 0bd4cdaf09ce4e699H
DQ 0bee6fffa68000000H, 0bd32c03059eee94bH
DQ 0bee57ffb20000000H, 0bd1fead0c4719fccH
DQ 0bee3fffbc8000000H, 0bd39656642e976adH
DQ 0bee2fffc30000000H, 0bd46c7329db21925H
DQ 0bee17ffcc8000000H, 0bd389eab4517a5ceH
DQ 0bedffffaa0000000H, 0bd3fdf0e3da560d7H
DQ 0bedcfffba0000000H, 0bd0a7c3d4511fbcbH
DQ 0bed9fffc80000000H, 0bd0780884d13df75H
DQ 0bed6fffd40000000H, 0bd3ec0a3e439ae99H
DQ 0bed3fffdf0000000H, 0bd36c139bbface01H
DQ 0bed0fffe80000000H, 0bd4578e60a3c176bH
DQ 0becbfffe00000000H, 0bd3b5254714383f2H
DQ 0bec7fffe80000000H, 0bd4764e185e2f8bbH
DQ 0bec1ffff20000000H, 0bd4c67c0d84712a6H
DQ 0beb7ffff40000000H, 0bd3f05250dd0685fH
DQ 0bea7ffff80000000H, 0bd40b553538e0e0cH
DQ 0, 0
; log2 polynomial coefficients
clv DQ 03fc47fd462b3b816H, 03e79c3a6966457eeH ; c1|c3
DQ 0bfb550472a8bb463H, 0bfd62e4346694107H ; c2|c4
;-------Table T, D so that movapd gives [ D | T ]
;-------Note that the exponent field of T is set to 000 (instead of 3ffH)
exp2_tbl DQ 03ff0000000000000H, 00000000000000000H
DQ 03ff0163da9fb3335H, 03c9b61299ab8cdb7H
DQ 03ff02c9a3e778061H, 0bc719083535b085dH
DQ 03ff04315e86e7f85H, 0bc90a31c1977c96eH
DQ 03ff059b0d3158574H, 03c8d73e2a475b465H
DQ 03ff0706b29ddf6deH, 0bc8c91dfe2b13c26H
DQ 03ff0874518759bc8H, 03c6186be4bb284ffH
DQ 03ff09e3ecac6f383H, 03c91487818316135H
DQ 03ff0b5586cf9890fH, 03c98a62e4adc610aH
DQ 03ff0cc922b7247f7H, 03c901edc16e24f71H
DQ 03ff0e3ec32d3d1a2H, 03c403a1727c57b52H
DQ 03ff0fb66affed31bH, 0bc6b9bedc44ebd7bH
DQ 03ff11301d0125b51H, 0bc96c51039449b39H
DQ 03ff12abdc06c31ccH, 0bc51b514b36ca5c7H
DQ 03ff1429aaea92de0H, 0bc932fbf9af1369eH
DQ 03ff15a98c8a58e51H, 03c82406ab9eeab09H
DQ 03ff172b83c7d517bH, 0bc819041b9d78a75H
DQ 03ff18af9388c8deaH, 0bc911023d1970f6bH
DQ 03ff1a35beb6fcb75H, 03c8e5b4c7b4968e4H
DQ 03ff1bbe084045cd4H, 0bc995386352ef607H
DQ 03ff1d4873168b9aaH, 03c9e016e00a2643cH
DQ 03ff1ed5022fcd91dH, 0bc91df98027bb78bH
DQ 03ff2063b88628cd6H, 03c8dc775814a8494H
DQ 03ff21f49917ddc96H, 03c82a97e9494a5edH
DQ 03ff2387a6e756238H, 03c99b07eb6c70572H
DQ 03ff251ce4fb2a63fH, 03c8ac155bef4f4a4H
DQ 03ff26b4565e27cddH, 03c82bd339940e9d9H
DQ 03ff284dfe1f56381H, 0bc9a4c3a8c3f0d7dH
DQ 03ff29e9df51fdee1H, 03c8612e8afad1255H
DQ 03ff2b87fd0dad990H, 0bc410adcd6381aa3H
DQ 03ff2d285a6e4030bH, 03c90024754db41d4H
DQ 03ff2ecafa93e2f56H, 03c71ca0f45d52383H
DQ 03ff306fe0a31b715H, 03c86f46ad23182e4H
DQ 03ff32170fc4cd831H, 03c8a9ce78e18047cH
DQ 03ff33c08b26416ffH, 03c932721843659a5H
DQ 03ff356c55f929ff1H, 0bc8b5cee5c4e4628H
DQ 03ff371a7373aa9cbH, 0bc963aeabf42eae1H
DQ 03ff38cae6d05d866H, 0bc9e958d3c9904bcH
DQ 03ff3a7db34e59ff7H, 0bc75e436d661f5e2H
DQ 03ff3c32dc313a8e5H, 0bc9efff8375d29c3H
DQ 03ff3dea64c123422H, 03c8ada0911f09ebbH
DQ 03ff3fa4504ac801cH, 0bc97d023f956f9f3H
DQ 03ff4160a21f72e2aH, 0bc5ef3691c309278H
DQ 03ff431f5d950a897H, 0bc81c7dde35f7998H
DQ 03ff44e086061892dH, 03c489b7a04ef80cfH
DQ 03ff46a41ed1d0057H, 03c9c944bd1648a76H
DQ 03ff486a2b5c13cd0H, 03c73c1a3b69062f0H
DQ 03ff4a32af0d7d3deH, 03c99cb62f3d1be56H
DQ 03ff4bfdad5362a27H, 03c7d4397afec42e2H
DQ 03ff4dcb299fddd0dH, 03c98ecdbbc6a7833H
DQ 03ff4f9b2769d2ca7H, 0bc94b309d25957e3H
DQ 03ff516daa2cf6642H, 0bc8f768569bd93eeH
DQ 03ff5342b569d4f82H, 0bc807abe1db13cacH
DQ 03ff551a4ca5d920fH, 0bc8d689cefede59aH
DQ 03ff56f4736b527daH, 03c99bb2c011d93acH
DQ 03ff58d12d497c7fdH, 03c8295e15b9a1de7H
DQ 03ff5ab07dd485429H, 03c96324c054647acH
DQ 03ff5c9268a5946b7H, 03c3c4b1b816986a2H
DQ 03ff5e76f15ad2148H, 03c9ba6f93080e65dH
DQ 03ff605e1b976dc09H, 0bc93e2429b56de47H
DQ 03ff6247eb03a5585H, 0bc9383c17e40b496H
DQ 03ff6434634ccc320H, 0bc8c483c759d8932H
DQ 03ff6623882552225H, 0bc9bb60987591c33H
DQ 03ff68155d44ca973H, 03c6038ae44f73e64H
DQ 03ff6a09e667f3bcdH, 0bc9bdd3413b26455H
DQ 03ff6c012750bdabfH, 0bc72895667ff0b0cH
DQ 03ff6dfb23c651a2fH, 0bc6bbe3a683c88aaH
DQ 03ff6ff7df9519484H, 0bc883c0f25860ef6H
DQ 03ff71f75e8ec5f74H, 0bc816e4786887a99H
DQ 03ff73f9a48a58174H, 0bc90a8d96c65d53bH
DQ 03ff75feb564267c9H, 0bc90245957316dd3H
DQ 03ff780694fde5d3fH, 03c9866b80a02162cH
DQ 03ff7a11473eb0187H, 0bc841577ee04992fH
DQ 03ff7c1ed0130c132H, 03c9f124cd1164dd5H
DQ 03ff7e2f336cf4e62H, 03c705d02ba15797eH
DQ 03ff80427543e1a12H, 0bc927c86626d972aH
DQ 03ff82589994cce13H, 0bc9d4c1dd41532d7H
DQ 03ff8471a4623c7adH, 0bc88d684a341cdfbH
DQ 03ff868d99b4492edH, 0bc9fc6f89bd4f6baH
DQ 03ff88ac7d98a6699H, 03c9994c2f37cb53aH
DQ 03ff8ace5422aa0dbH, 03c96e9f156864b26H
DQ 03ff8cf3216b5448cH, 0bc70d55e32e9e3aaH
DQ 03ff8f1ae99157736H, 03c85cc13a2e3976cH
DQ 03ff9145b0b91ffc6H, 0bc9dd6792e582523H
DQ 03ff93737b0cdc5e5H, 0bc675fc781b57ebbH
DQ 03ff95a44cbc8520fH, 0bc764b7c96a5f039H
DQ 03ff97d829fde4e50H, 0bc9d185b7c1b85d0H
DQ 03ff9a0f170ca07baH, 0bc9173bd91cee632H
DQ 03ff9c49182a3f090H, 03c7c7c46b071f2beH
DQ 03ff9e86319e32323H, 03c7824ca78e64c6eH
DQ 03ffa0c667b5de565H, 0bc9359495d1cd532H
DQ 03ffa309bec4a2d33H, 03c96305c7ddc36abH
DQ 03ffa5503b23e255dH, 0bc9d2f6edb8d41e1H
DQ 03ffa799e1330b358H, 03c9bcb7ecac563c6H
DQ 03ffa9e6b5579fdbfH, 03c90fac90ef7fd31H
DQ 03ffac36bbfd3f37aH, 0bc8f9234cae76cd0H
DQ 03ffae89f995ad3adH, 03c97a1cd345dcc81H
DQ 03ffb0e07298db666H, 0bc9bdef54c80e424H
DQ 03ffb33a2b84f15fbH, 0bc62805e3084d707H
DQ 03ffb59728de5593aH, 0bc9c71dfbbba6de3H
DQ 03ffb7f76f2fb5e47H, 0bc75584f7e54ac3aH
DQ 03ffba5b030a1064aH, 0bc9efcd30e54292eH
DQ 03ffbcc1e904bc1d2H, 03c823dd07a2d9e84H
DQ 03ffbf2c25bd71e09H, 0bc9efdca3f6b9c72H
DQ 03ffc199bdd85529cH, 03c811065895048ddH
DQ 03ffc40ab5fffd07aH, 03c9b4537e083c60aH
DQ 03ffc67f12e57d14bH, 03c92884dff483cacH
DQ 03ffc8f6d9406e7b5H, 03c71acbc48805c44H
DQ 03ffcb720dcef9069H, 03c7503cbd1e949dbH
DQ 03ffcdf0b555dc3faH, 0bc8dd83b53829d72H
DQ 03ffd072d4a07897cH, 0bc9cbc3743797a9cH
DQ 03ffd2f87080d89f2H, 0bc9d487b719d8577H
DQ 03ffd5818dcfba487H, 03c82ed02d75b3706H
DQ 03ffd80e316c98398H, 0bc911ec18beddfe8H
DQ 03ffda9e603db3285H, 03c9c2300696db532H
DQ 03ffdd321f301b460H, 03c92da5778f018c2H
DQ 03ffdfc97337b9b5fH, 0bc91a5cd4f184b5bH
DQ 03ffe264614f5a129H, 0bc97b627817a1496H
DQ 03ffe502ee78b3ff6H, 03c839e8980a9cc8fH
DQ 03ffe7a51fbc74c83H, 03c92d522ca0c8de1H
DQ 03ffea4afa2a490daH, 0bc9e9c23179c2893H
DQ 03ffecf482d8e67f1H, 0bc9c93f3b411ad8cH
DQ 03ffefa1bee615a27H, 03c9dc7f486a4b6b0H
DQ 03fff252b376bba97H, 03c93a1a5bf0d8e43H
DQ 03fff50765b6e4540H, 03c99d3e12dd8a18aH
DQ 03fff7bfdad9cbe14H, 0bc9dbb12d0063509H
DQ 03fffa7c1819e90d8H, 03c874853f3a5931eH
DQ 03fffd3c22b8f71f1H, 03c62eb74966579e7H
Shifter DQ 04338000000000000H, 04338000000000000H ; 2^52+2^51|2^52+2^51
SIGMASK DQ 0000fffffffffffffH, 0000fffffffffffffH
ONEMASK DQ 03ff0000000000000H, 03ff0000000000000H
ABSVALMASK DQ 7fffffffffffffffH, 7fffffffffffffffH
; exponential polynomial coefficients
cev DQ 03f55d87fe78a6731H, 03fac6b08d704a0bfH ; c3|c5
DQ 03f83b2ab6fba4e77H, 03fcebfbdff82c58eH ; c2|c4
DQ 03fe62e42fefa39efH ; c1
HALFSIG DQ 0fffffffff8000000H
LHN DQ 0bff7154740000000H ; -log2(e) rounded to 27 bits
sNaN DQ 07ff0000000000001H
INF DQ 07ff0000000000000H
NEG_INF DQ 0fff0000000000000H
NEG_ZERO DQ 08000000000000000H
EMIN DQ 00010000000000000H
QIND DQ 0fff8000000000000H ; QNAN indefinite
ALIGN 16
CONST ENDS
$movsd MACRO op1, op2
LOCAL begin_movsd, end_movsd
begin_movsd:
movupd op1, op2
end_movsd:
org begin_movsd
db 0F2h
org end_movsd
ENDM
_TEXT SEGMENT PARA PUBLIC USE32 'CODE'
ALIGN 16
PUBLIC _pow_pentium4, _CIpow_pentium4
_CIpow_pentium4 PROC NEAR
push ebp
mov ebp,esp
sub esp,16 ; prepare place for argument
and esp,0fffffff0h
fxch st(1)
fstp qword ptr [esp] ; base
fstp qword ptr [esp+8] ; exponent
call _pow_pentium4
leave
ret
_pow_pentium4 label proc
; load first argument
movlpd xmm0, QWORD PTR [esp+4]
; load constants
movlpd xmm7, QWORD PTR [SIGMASK]
movlpd xmm2, QWORD PTR [ONEMASK]
andpd xmm7, xmm0
$movsd xmm4, xmm0
psrlq xmm0, 64-12-8
; get first 7 bits after leading 1
pextrw eax, xmm0, 0
; xmm7=first argument, with exponent set to 0+bias
orpd xmm7, xmm2
; extract sign/exponent + next 4 bits
pextrw ecx, xmm4, 3
and eax, 0ffH
add eax, 1
and eax, 1feH
; get r1=x*rcp_t1
mulsd xmm7, QWORD PTR [rcp_t1+eax*4]
; load first reciprocal value (based on first 7 bits)
movlpd xmm5, QWORD PTR [rcp_t1+eax*4]
add eax, eax
; load first log2_table values (high, low) in xmm6
movapd xmm6, QWORD PTR [log2_t1+eax*4]
; check sign/exponent of x
mov edx, 7fefH
; x infinity/NaN or negative ?
sub edx, ecx
; x denormal ?
sub ecx, 0010H
or ecx, edx
cmp ecx, 80000000H
jae SPECIAL_X
mov ecx, 0
; set xmm1=2^8*(bias-0.5-2^{-8})
mov edx, 3fe7fH
BACK_MAIN:
BACK_DENORMAL:
movd xmm1, edx
; get k (exponent) + j (j=0 if mantissa<1.5, 1 otherwise)
psubq xmm0, xmm1
psrlq xmm0, 8
; convert to DP format
cvtdq2pd xmm0, xmm0
; xmm1=mask for splitting argments in high/low parts
movlpd xmm1, QWORD PTR [HALFSIG]
; copy r1 to xmm3, set exponent to 0+bias
$movsd xmm3, xmm7 ;andpd xmm3, xmm7
; extract bits 7..14
psrlq xmm7, 64-12-14
pextrw eax, xmm7, 0
; set exponent of argument to 0+bias
andpd xmm4, QWORD PTR [SIGMASK]
and eax, 0ffH
add eax, 1
and eax, 1feH
; load second reciprocal value (based on 7 bit index)
; get r2=x*rcp_t1*rcp_t2
mulsd xmm3, QWORD PTR [rcp_t2+eax*4]
; rcp_t1*rcp_t2 (exact multiplication)
mulsd xmm5, QWORD PTR [rcp_t2+eax*4]
add eax, eax
; load next log2_table values (high, low) to xmm6
addpd xmm6, QWORD PTR [log2_t2+eax*4]
orpd xmm4, QWORD PTR [ONEMASK]
; add k
addsd xmm6, xmm0
; get xH = high part of x
andpd xmm1, xmm4
; copy r2 to xmm2
$movsd xmm2, xmm3
; extract bits 13...21
psrlq xmm3, 64-12-21
pextrw eax, xmm3, 0
; xmm0 = mask for splitting term in high/low parts
movlpd xmm0, QWORD PTR [HALFSIG]
; get xL = low part of x
subsd xmm4, xmm1
; xmm7=-log2(e) in double precision (scaling factor for reduced argument)
movlpd xmm7, QWORD PTR [LHN]
and eax, 1ffH
add eax, 1
and eax, 3feH
; load third reciprocal value (based on 8 bit index)
; get rcp_t1*rcp_t2*rcp_t3 (exact multiplication)
mulsd xmm5, QWORD PTR [rcp_t3+eax*4]
; get r3=x*rcp_t1*rcp_t2*rcp_t3
mulsd xmm2, QWORD PTR [rcp_t3+eax*4]
; load next log2_table values (high, low) to xmm6
addpd xmm6, QWORD PTR [log2_t3+eax*8]
; xmm0=rcp_H
andpd xmm0, xmm5
; xmm5=rcp_L
subsd xmm5, xmm0
; reduced argument
addsd xmm7, xmm2
; copy rcp_H
$movsd xmm3, xmm0
; rcp_H*xH
mulsd xmm0, xmm1
; xH*rcp_L
mulsd xmm1, xmm5
; rcp_H*xL
mulsd xmm3, xmm4
; calculate rounding error for reduced argument: R-rcp_H*xH
subsd xmm2, xmm0
; rcp_L*xL
mulsd xmm4, xmm5
; copy xmm6=D1+D2+D3|k+T1+T2+T3
$movsd xmm0, xmm6
; R-rcp_H*xH-rcp_L*xH
subsd xmm2, xmm1
; add reduced argument to high order term: xmm6=D1+D2+D3|k+T1+T2+T3+Rh
addsd xmm6, xmm7
; load y
movlpd xmm1, QWORD PTR [esp+12]
; get sign/exponent
pextrw eax, xmm1, 3
; R-rcp_H*xH-rcp_L*xH-rcp_H*xL
subsd xmm2, xmm3
; get -Rh
subsd xmm0, xmm6
; xmm3=HALFSIG mask
movlpd xmm3, QWORD PTR [HALFSIG]
; get exponent for log2(x)
pextrw edx, xmm6, 3
; E=R-rcp_H*xH-rcp_L*xH-rcp_H*xL-rcp_L*xL
subsd xmm2, xmm4
; xmm4=k+T1+T2+T3+Rh
$movsd xmm4, xmm6
; get Rl=R-Rh
addsd xmm0, xmm7
; R=R-E
subsd xmm7, xmm2
; xmm6=D1+D2+D3|k+T1+T2+T3+Rh+Eh
subsd xmm6, xmm2
; xmm7=R|R
unpcklpd xmm7, xmm7
; check if y is infinity/NaN
and eax, 7ff0H
cmp eax, 7ff0H
jae SPECIAL_Y
and edx, 7ff0H
sub eax, 3ff0H
add eax, edx
; y*log2(x)>=2^{11} ? (i.e. 2^{11}-eps-x<0)
mov edx, 40a0H
sub edx, eax
; avoid underflow on intermediate calculations (|y*log2(x)|<2^{-56} ?)
sub eax, 3c70H
or edx, eax
cmp edx, 80000000H
; small input or UF/OF
jae RETURN_ONE
BACK_XY_CHECK:
; -Eh
subsd xmm4, xmm6
; -El
subsd xmm2, xmm4
; xmm4=HALFSIG mask
movlpd xmm4, QWORD PTR [HALFSIG]
; yH
andpd xmm3, xmm1
; HH (high part of k+T1+T2+T3+Rh+Eh)
andpd xmm4, xmm6
; add correction to reduced argument: Rl+El
subsd xmm0, xmm2
xorpd xmm2, xmm2
mov edx, 4060H ;70H
pinsrw xmm2, edx, 3
; copy yH
$movsd xmm5, xmm3
; yH*HH
mulsd xmm3, xmm4
; HL
subsd xmm6, xmm4
; yL
subsd xmm1, xmm5
; get 2^7*(yH*HH)
mulsd xmm3, xmm2 ;paddd xmm3, xmm2
; yH*HL
mulsd xmm5, xmm6
; xmm2=cl1|cl3
movapd xmm2, QWORD PTR [clv]
; HH*yL
mulsd xmm4, xmm1
; get int(2^7*H)
cvtsd2si eax, xmm3
; HL*yL
mulsd xmm6, xmm1
; xmm1=cl2|cl4
movapd xmm1, QWORD PTR [clv+16]
; yH*HL+yL*HH
addsd xmm5, xmm4
; get D1+D2+D3
pshufd xmm4, xmm6, 0eeH
; yH*HL+yL*HH+yL*HL
addsd xmm5, xmm6
; underflow/possible overflow condition ?
mov edx, 1ff7fH
; eax>=(2^10-1)*2^7
sub edx, eax
; eax+bias*2^7<=59*2^7 ?
add eax, 1e1ffH
or edx, eax
; restore eax value
sub eax, 1e1ffH
; check sign bit
cmp edx, 0
jle UF_OF_CASES
; get table index, and exponent of result
; ecx contains expected sign of the result, scaled by 2^11
add ecx, eax
and eax, 7fH
; get exponent of result (scaled by 2^7)
and ecx, 0ffffff80h
; add exponent bias*2^7
add ecx, 1ff80h
; D1+D2+D3+(Rl+El)
addsd xmm4, xmm0
; xmm0=xmm3=2^7*H
$movsd xmm0, xmm3
; (2^7)*H+Shifter (to round to integer)
addsd xmm3, QWORD PTR [Shifter]
; cl1*R|cl3*R
mulpd xmm2, xmm7
; int((2^7)*H)=((2^7)*H+Shifter)-Shifter
subsd xmm3, QWORD PTR [Shifter]
; R^2|R^2
mulpd xmm7, xmm7
; R_exp_h'=R_exp_h*(2^7)=(2^7)*H-int((2^7)*H)
subsd xmm0, xmm3
; load table values
add eax, eax
add eax, eax
add eax, eax
add eax, eax
; D|T
movapd xmm3, QWORD PTR [exp2_tbl+eax]
; load ce3|ce5
movapd xmm6, QWORD PTR [cev]
; cl2*R^2|cl4*R^2
mulpd xmm1, xmm7
; cl1*R+cl2*R^2|cl3*R+cl4*R^2
addpd xmm2, xmm1
; unpack cl1*R+cl2*R^2
pshufd xmm1, xmm2, 0eeh
; *|cl3*R^3+cl4*R^4
mulsd xmm2, xmm7
; xmm7=0
xorpd xmm7, xmm7
mov edx, 3f80H
; Pl14
addsd xmm2, xmm1
; xmm7=scaling constant
pinsrw xmm7, edx, 3
; low part of log2(x): D1+D2+D3+(Rl+E)+P14
addsd xmm2, xmm4
; load ce1
movlpd xmm4, QWORD PTR [cev+32]
; load 2^k
movd xmm1, ecx
UF_BACK:
; y*(D1+D2+D3+(Rl+E)+P14)
mulsd xmm2, QWORD PTR [esp+12]
; get R_exp_h=2^{-7}*R_exp_h'
mulsd xmm0, xmm7
psllq xmm1, 52-7
; xmm1=2^k|2^k
pshufd xmm1, xmm1, 044h
; load ce2|ce4
movapd xmm7, QWORD PTR [cev+16]
; low part of y*log2(x): yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14)
addsd xmm5, xmm2
; get D*2^k|T*2^k
mulpd xmm3, xmm1
; get R_exp=R_exp_h+yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14)
addsd xmm0, xmm5
; xmm0=R_exp|R_exp
unpcklpd xmm0, xmm0
; ce3*R_exp|ce5*R_exp
mulpd xmm6, xmm0
; ce1*R_exp
mulsd xmm4, xmm0
; R_exp^2|R_exp^2
mulpd xmm0, xmm0
; ce2+ce3*R_exp|ce4+ce5*R_exp
addpd xmm7, xmm6
; R_exp^2*(ce2+ce3*R_exp)|R_exp^2*(ce4+ce5*R_exp)
mulpd xmm7, xmm0
; R_exp^2*(T*2^k)
mulsd xmm0, xmm3
; unpack R_exp^2*(ce2+ce3*R_exp)
pshufd xmm6, xmm7, 0eeh
; R_exp^4*(T*2^k)*(ce4+ce5*R_exp)
mulsd xmm0, xmm7
; unpack D*2^k
pshufd xmm5, xmm3, 0eeh
; R_exp^2*(T*2^k)*(ce2+ce3*R_exp)
mulsd xmm6, xmm3
; ce1*(T*2^k)*R_exp
mulsd xmm4, xmm3
; P45*(T*2^k)+D*2^k
addsd xmm0, xmm5
sub esp, 16
; P25*(T*2^k)+D*2^k
addsd xmm0, xmm6
; P15*(T*2^k)+D*2^k
addsd xmm0, xmm4
; T+P15*(T*2^k)+D*2^k
addsd xmm0, xmm3
movlpd QWORD PTR [esp+4], xmm0 ; return result
fld QWORD PTR [esp+4] ;
add esp, 16
ret
SPECIAL_X:
; load y
movlpd xmm1, QWORD PTR [esp+12]
movlpd xmm3, QWORD PTR [ABSVALMASK]
; load low half of y in eax
movd eax, xmm1
$movsd xmm2, xmm1
; eliminate sign, load high half of y in ecx
andpd xmm1, xmm3
psrlq xmm1, 32
movd ecx, xmm1
; y infinity/NaN ?
cmp ecx, 7ff00000H
jae Y_INF_NAN_CHECK_X
; y=+/- 0?
or eax, ecx
cmp eax, 0
jz Y_ZERO
; denormal, positive x ?
cmp edx, 0
jge DENORMAL_POS_X
; reconstruct sign/expon from edx=7fefH-s/exp
neg edx
add edx, 7fefH
; y integer ?
; xmm3=0fff00..0
psllq xmm3,64-12
; set exponent of y to all 1's
orpd xmm2, xmm3
; load bias-12
mov ecx, 3ffH-12
movd xmm3, ecx
; get exponent+64-52
psrlq xmm1, 32-12
psubd xmm1, xmm3
; xmm3=0
pxor xmm3, xmm3
; if exponent+12<0, set shift count to 0
pmaxsw xmm1, xmm3
; get fractional tail of y
psllq xmm2, xmm1
; fractional tail=0 ? (i.e. y integer ?)
pcmpeqd xmm2, xmm3
pmovmskb eax, xmm2
; take absolute value of x
mov ecx, edx
and edx, 7fffH
; check if x infinity/NaN
cmp edx, 7ff0H
jae INF_NAN_X
; x negative, finite
; y not integer ?
and eax, 0ffH
cmp eax, 0ffH
jnz RET_INVALID
; y integer
; y odd integer ?
movlpd xmm1, QWORD PTR [esp+12]
movlpd xmm2, QWORD PTR [esp+12]
; load bias-11
mov ecx, 3ffH-11
movd xmm3, ecx
; get exponent+64-53
andpd xmm1, QWORD PTR [ABSVALMASK]
psrlq xmm1, 64-12
psubd xmm1, xmm3
; xmm3=100..0
movlpd xmm3, QWORD PTR [NEG_ZERO]
; get last integer bit, fractional tail of y
psllq xmm2, xmm1
; last int. bit=0 ? (i.e. y is an odd integer ?)
pcmpeqd xmm2, xmm3
pmovmskb eax, xmm2
and eax, 0ffH
; if eax!=ffH, set ecx=2^11, else set ecx=0
mov ecx, 3ff01H
; set ecx=2^11*2^7 if y is an odd integer
add ecx, eax
and ecx, 40000H
; x denormal ?
cmp edx, 0010H
jb DENORMAL_X
; set xmm1=2^8*(bias-0.5-2^{-8})
mov edx, 0bfe7fH
; load constants, return to main path
movlpd xmm3, QWORD PTR [SIGMASK]
movlpd xmm2, QWORD PTR [ONEMASK]
jmp BACK_MAIN
Y_INF_NAN_CHECK_X:
; x NaN?
movlpd xmm7, QWORD PTR [esp+4]
movlpd xmm4, QWORD PTR [esp+4]
movd edx, xmm7
psrlq xmm7, 32
movd eax, xmm7
mov ecx, eax
and eax, 7fffffffH
cmp eax, 7ff00000H
jb Y_INF_NAN
ja X_NAN
cmp edx, 0
ja X_NAN
jmp Y_INF_NAN
DENORMAL_POS_X:
mov ecx, 0
DENORMAL_X:
; xmm0=2^64
xorpd xmm0, xmm0
mov eax, (3ffH+64)*16
pinsrw xmm0, eax, 3
; load constants
movlpd xmm7, QWORD PTR [SIGMASK]
movlpd xmm2, QWORD PTR [ONEMASK]
; scale x by 2^64
mulsd xmm0, xmm4
; x=+/-0 ?
movd edx, xmm4
psrlq xmm4, 32
movd eax, xmm4
cmp edx, 0
jz ZERO_X
BACK_DEN:
andpd xmm7, xmm0
$movsd xmm4, xmm0
andpd xmm0, QWORD PTR [ABSVALMASK]
psrlq xmm0, 64-12-8
; get first 7 bits after leading 1
pextrw eax, xmm0, 0
orpd xmm7, xmm2
and eax, 0ffH
add eax, 1
and eax, 1feH
; get r1=x*rcp_t1
mulsd xmm7, QWORD PTR [rcp_t1+eax*4]
; load first reciprocal value (based on first 7 bits)
movlpd xmm5, QWORD PTR [rcp_t1+eax*4]
add eax, eax
; load first log2_table values (high, low) in xmm6
movapd xmm6, QWORD PTR [log2_t1+eax*4]
; 2^8*(bias+64-0.5-2^{-8})
mov edx, 43e7fH
jmp BACK_DENORMAL
ZERO_X:
mov edx, eax
and edx, 7fffffffH
cmp edx, 0
jnz BACK_DEN
; get sign of y
mov edx, DWORD PTR [esp+16]
and edx, 80000000H
cmp edx, 0
jz ZERO_X_POS_Y
; return -infinity if (y odd and x=-0), +infinity otherwise
; ecx=0 or 2^11*2^7
shl ecx, 20-7
; eax=2^31 if (y odd and x=-0)
and eax, ecx
mov edx, 7ff00000H
; set sign of infinity
or edx, eax
; load result
movd xmm0, edx
psllq xmm0, 32
; raise divide by zero
movlpd xmm1, QWORD PTR [ONEMASK]
movlpd xmm2, QWORD PTR [esp+4]
divsd xmm1, xmm2
mov edx, 27
jmp CALL_LIBM_ERROR
ZERO_X_POS_Y:
; x=-0, and y odd integer ?
; ecx=0 or 2^11*2^7
shl ecx, 20-7
; eax=2^31 if (y odd and x=-0)
and eax, ecx
cmp eax, 0
jnz RET_NEG_ZERO
; return +0
fldz
ret
INF_NAN_X:
; y finite, not zero
; x NaN ?
movlpd xmm3, QWORD PTR [SIGMASK]
xorpd xmm1, xmm1
; get significand bits
andpd xmm3, xmm4
; significand bits = 0 ?
pcmpeqd xmm1, xmm3
pmovmskb ecx, xmm1
and ecx, 0ffH
cmp ecx, 0ffH
jnz X_NAN
; x=+infinity ?
pextrw ecx, xmm4, 3
and ecx, 8000H
cmp ecx,0
jz X_INF
; x=-infinity
; y integer ?
and eax, 0ffH
cmp eax, 0ffH
jnz X_NINF
; y odd integer ?
movlpd xmm1, QWORD PTR [esp+12]
movlpd xmm2, QWORD PTR [esp+12]
; load bias-11
mov ecx, 3ffH-11
movd xmm3, ecx
; get exponent+64-53
andpd xmm1, QWORD PTR [ABSVALMASK]
psrlq xmm1, 64-12
psubd xmm1, xmm3
; xmm3=0
pxor xmm3, xmm3
; get last integer bit, fractional tail of y
psllq xmm2, xmm1
; last int. bit=0 ? (i.e. y is an even integer ?)
pcmpeqd xmm2, xmm3
pmovmskb eax, xmm2
and eax, 0ffH
cmp eax, 0ffH
jz X_NINF
; x=-infinity, y an odd integer
movlpd xmm1, QWORD PTR [esp+12]
pextrw eax, xmm1, 3
and eax, 8000H
cmp eax, 0
; y>0 ?
jz RET_NINF
; y<0, return -0
RET_NEG_ZERO:
fld [NEG_ZERO]
ret
RET_NINF:
fld [NEG_INF]
ret
X_NINF:
; x=-infinity, y not an odd integer
movlpd xmm1, QWORD PTR [esp+12]
pextrw eax, xmm1, 3
and eax, 8000H
cmp eax, 0
; y>0 ? (return infinity)
jz RET_INF
; y<0, return 0
fldz
ret
X_INF:
; y<0 ?
movlpd xmm1, QWORD PTR [esp+12]
pextrw eax, xmm1, 3
and eax, 8000H
cmp eax, 0
jz RET_INF
; y<0, return 0
fldz
ret
X_NAN:
addsd xmm4, xmm4
; sub esp, 16
; movlpd QWORD PTR [esp+4], xmm4
; fld QWORD PTR [esp+4]
; add esp, 16
; ret
$movsd xmm0, xmm4
mov edx, 1006
jmp CALL_LIBM_ERROR
RET_INVALID:
; x=-0?
movlpd xmm2, QWORD PTR [esp+4]
movd eax, xmm2
psrlq xmm2, 32
movd edx, xmm2
and edx, 7fffffffH
or eax, edx
mov ecx, 0
cmp eax, 0
jz ZERO_X
; raise INVALID exception
movlpd xmm1, QWORD PTR [sNaN]
movlpd xmm0, QWORD PTR [QIND]
mulsd xmm1, xmm1
mov edx, 28
jmp CALL_LIBM_ERROR
SPECIAL_Y:
; load x, y
movlpd xmm4, QWORD PTR [esp+4]
movlpd xmm2, QWORD PTR [esp+12]
; x=+/-1 ?
; load lower bits of x
movd eax, xmm4
cmp eax, 0
jnz Y_INF_NAN
psrlq xmm4, 32
movd edx, xmm4
; x=1 ?
cmp edx, 3ff00000H
jz RET_ONE
; x=-1 ?
cmp edx, 0bff00000H
jnz Y_INF_NAN
; y=NaN ? (xmm1 contains y)
movlpd xmm3, QWORD PTR [SIGMASK]
xorpd xmm1, xmm1
; get significand bits, to determine if y=NaN
andpd xmm3, xmm2
; significand bits = 0 ?
pcmpeqd xmm1, xmm3
pmovmskb eax, xmm1
cmp eax, 0ffH
jnz RET_Y_NAN
; y=+/-infinity, return 1
fld1
ret
Y_INF_NAN:
movlpd xmm3, QWORD PTR [SIGMASK]
xorpd xmm1, xmm1
; get significand bits, to determine if y=NaN
andpd xmm3, xmm2
; significand bits = 0 ?
pcmpeqd xmm1, xmm3
pmovmskb eax, xmm1
and eax, 0ffH
cmp eax, 0ffH
jnz RET_Y_NAN
; y infinity, get sign
pextrw eax, xmm2, 3
; get x
movlpd xmm4, QWORD PTR [esp+4]
and eax, 8000H
; x=-1 ? (ecx,edx=high, low parts of x)
xor ecx, 0bff00000H
or edx, ecx
cmp edx, 0
; if x=-1, return 1
jz RET_ONE
cmp eax, 0
jz Y_INF
; |x|<1 ? ( |x|=1 will not take this path)
pextrw eax, xmm4, 3
and eax, 7ff0H
cmp eax, 3ff0H
jb RET_INF
; |x|>1, y=-infinity, return 0
fldz
ret
Y_INF:
; y=+infinity
; |x|>=1 ? ( |x|=1 will not take this path)
pextrw eax, xmm4, 3
and eax, 7ff0H
cmp eax, 3ff0H
jae RET_INF
; |x|<1, return 0
fldz
ret
RET_INF:
fld QWORD PTR [INF]
ret
RET_Y_NAN:
addsd xmm2, xmm2
; sub esp, 16
; movlpd QWORD PTR [esp+4], xmm2
; fld QWORD PTR [esp+4]
; add esp, 16
; ret
$movsd xmm0, xmm2
mov edx, 1006
jmp CALL_LIBM_ERROR
Y_ZERO:
; x=0 ?
movd eax, xmm4
psrlq xmm4, 32
movd edx, xmm4
and edx, 7fffffffH
mov ecx, eax
or eax, edx
movlpd xmm0, QWORD PTR [ONEMASK]
mov edx, 26
cmp eax, 0
jz CALL_LIBM_ERROR
; x=NaN ?
movd eax, xmm4
mov edx, 29
and eax, 7fffffffH
cmp eax, 7ff00000H
; x=NaN
ja CALL_LIBM_ERROR
; x!=NaN
jb Y_ZERO_RET
; x=NaN ?
cmp ecx,0
ja CALL_LIBM_ERROR
Y_ZERO_RET:
; return 1 for any x
sub esp, 16
movlpd QWORD PTR [esp+4], xmm0
fld QWORD PTR [esp+4]
add esp, 16
ret
RET_ONE:
; used for x=+/-1, special y
; fld1
; ret
movlpd xmm1, QWORD PTR [QIND]
movlpd xmm0, QWORD PTR [esp+12]
; set Invalid flag, if necessary
addsd xmm0, xmm1
mov edx, 28
; jmp cALL_LIBM_ERROR
CALL_LIBM_ERROR:
;call libm_error_support(void *arg1,void *arg2,void *retval,error_types input_tag)
sub esp, 28
movlpd QWORD PTR [esp+16], xmm0
mov DWORD PTR [esp+12],edx
mov edx, esp
add edx,16
mov DWORD PTR [esp+8],edx
add edx,16+8
mov DWORD PTR [esp+4],edx
sub edx, 8
mov DWORD PTR [esp],edx
call NEAR PTR __libm_error_support
; movlpd xmm0, QWORD PTR [esp+16]
; movlpd QWORD PTR [esp+16], xmm0 ; return result
fld QWORD PTR [esp+16] ;
add esp,28
ret
UF_OF_CASES:
cmp eax,0
jle UNDERFLOW_CASES
; if eax>=2^11*2^7, oF occurs
cmp eax, 40000H
jae RET_INF_OF
push esi
; overflow
; get table index, and exponent of result
mov edx, eax
; ecx contains expected sign of the result, scaled by 2^11
and eax, 7fH
; add exponent (bias+bias)*2^7
add ecx, 3ff00h
; edx+=(bias+(-bias)-1)*2^7 ; the same -1
sub edx, 128
and edx, 0ffffff80H
push edi
mov edi, 3ff0H
jmp OF_CONT
UNDERFLOW_CASES:
cmp eax, (2-1024)*256
jle RET_ZERO_UF
push esi
; get table index, and exponent of result
mov edx, eax
; ecx contains expected sign of the result, scaled by 2^11
and eax, 7fH
; add exponent (bias+1-bias)*2^7
add ecx, 80h
; edx=exponent*2^7
and edx, 0ffffff80H
; edx+=(bias+bias-1)*2^7
add edx, 3fe80H
push edi
mov edi, 0
OF_CONT:
; D1+D2+D3+(Rl+E)
addsd xmm4, xmm0
; xmm0=xmm3=2^7*H
$movsd xmm0, xmm3
; (2^7)*H+Shifter (to round to integer)
addsd xmm3, QWORD PTR [Shifter]
; esi=edx-bias*2^7
mov esi, edx
sub esi, 1ff80H
; cl1*R|cl3*R
mulpd xmm2, xmm7
; int((2^7)*H)=((2^7)*H+Shifter)-Shifter
subsd xmm3, QWORD PTR [Shifter]
; R^2|R^2
mulpd xmm7, xmm7
; R_exp_h'=R_exp_h*(2^7)=(2^7)*H-int((2^7)*H)
subsd xmm0, xmm3
; load table values
add eax, eax
add eax, eax
add eax, eax
add eax, eax
; D|T
movapd xmm3, QWORD PTR [exp2_tbl+eax]
; load ce3|ce5
movapd xmm6, QWORD PTR [cev]
; cl2*R^2|cl4*R^2
mulpd xmm1, xmm7
; cl1*R+cl2*R^2|cl3*R+cl4*R^2
addpd xmm2, xmm1
; unpack cl1*R+cl2*R^2
pshufd xmm1, xmm2, 0eeh
; *|cl3*R^3+cl4*R^4
mulsd xmm2, xmm7
; Pl14
addsd xmm2, xmm1
; low part of log2(x): D1+D2+D3+(Rl+E)+P14
addsd xmm2, xmm4
; load ce1
movlpd xmm4, QWORD PTR [cev+32]
; load 2^k2
movd xmm1, edx
; edx=-(edx-bias*2^7)/2^7
sub edx, 1ff80H
neg edx
sar edx, 7
add edx, 2
; if edx>=32, set edx to 64+
mov eax, edx
and eax, 32
add edx, eax
; xmm7=0
xorpd xmm7, xmm7
mov eax, 3f80H
; xmm7=scaling constant
pinsrw xmm7, eax, 3
; y*(D1+D2+D3+(Rl+E)+P14)
mulsd xmm2, QWORD PTR [esp+12+4+4]
; get R_exp_h=2^{-7}*R_exp_h'
mulsd xmm0, xmm7
psllq xmm1, 52-7
; xmm1=2^k2|2^k2
pshufd xmm1, xmm1, 044h
; load ce2|ce4
movapd xmm7, QWORD PTR [cev+16]
; low part of y*log2(x): yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14)
addsd xmm5, xmm2
; get D*2^k|T*2^k
mulpd xmm3, xmm1
; get R_exp=R_exp_h+yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14)
addsd xmm0, xmm5
; xmm0=R_exp|R_exp
unpcklpd xmm0, xmm0
; ce3*R_exp|ce5*R_exp
mulpd xmm6, xmm0
; ce1*R_exp
mulsd xmm4, xmm0
; R_exp^2|R_exp^2
mulpd xmm0, xmm0
; ce2+ce3*R_exp|ce4+ce5*R_exp
addpd xmm7, xmm6
; R_exp^2*(ce2+ce3*R_exp)|R_exp^2*(ce4+ce5*R_exp)
mulpd xmm7, xmm0
; R_exp^2*(T*2^k)
mulsd xmm0, xmm3
; unpack R_exp^2*(ce2+ce3*R_exp)
pshufd xmm6, xmm7, 0eeh
; R_exp^4*(T*2^k)*(ce4+ce5*R_exp)
mulsd xmm0, xmm7
; unpack D*2^k
pshufd xmm5, xmm3, 0eeh
; R_exp^2*(T*2^k)*(ce2+ce3*R_exp)
mulsd xmm6, xmm3
; ce1*(T*2^k)*R_exp
mulsd xmm4, xmm3
; xmm7=2^k'
movd xmm7, ecx
psllq xmm7, 52-7
movd xmm2, edx
pcmpeqd xmm1, xmm1
psllq xmm1, xmm2
; P45*(T*2^k)+D*2^k
addsd xmm0, xmm5
; P25*(T*2^k)+D*2^k
addsd xmm0, xmm6
; Th
andpd xmm1, xmm3
; P15*(T*2^k)+D*2^k
addsd xmm0, xmm4
; xmm6=0
xorpd xmm6, xmm6
pcmpeqd xmm4, xmm4
psllq xmm4, xmm2
; Tl
subsd xmm3, xmm1
; xmm2=Th
$movsd xmm2, xmm1
; (Th+(P15*(T*2^k)+D*2^k)_high)_high
addsd xmm1, xmm0
andpd xmm1, xmm4
; xmm6=(possible OF)?1:0
pinsrw xmm6, edi, 3
pop edi
; -(P15*(T*2^k)+D*2^k)_high
subsd xmm2, xmm1
; (P15*(T*2^k)+D*2^k)_low
addsd xmm0, xmm2
; Tl+(P15*(T*2^k)+D*2^k)_low
addsd xmm0, xmm3
cmp esi, 0
jg SCALE2
pop esi
; final scaling by 2^k'
mulsd xmm0, xmm7
mulsd xmm1, xmm7
; final addition
addsd xmm0, xmm1
mulsd xmm6, xmm0
addsd xmm0, xmm6
; overflow, or underflow
pextrw eax, xmm0, 3
and eax, 7ff0H
mov edx, 24
cmp eax, 7ff0H
jz CALL_LIBM_ERROR
mov edx, 25
cmp eax, 0
jz CALL_LIBM_ERROR
sub esp, 16
movlpd QWORD PTR [esp+4], xmm0 ; return result
fld QWORD PTR [esp+4] ;
add esp, 16
ret
SCALE2:
pop esi
; final addition
addsd xmm0, xmm1
; final scaling by 2^k'
mulsd xmm0, xmm7
mulsd xmm6, xmm0
addsd xmm0, xmm6
; overflow, or underflow
pextrw eax, xmm0, 3
and eax, 7ff0H
mov edx, 24
cmp eax, 7ff0H
jz CALL_LIBM_ERROR
mov edx, 25
cmp eax, 0
jz CALL_LIBM_ERROR
sub esp, 16
movlpd QWORD PTR [esp+4], xmm0 ; return result
fld QWORD PTR [esp+4] ;
add esp, 16
ret
RET_ZERO_UF:
movlpd xmm0, QWORD PTR [EMIN]
; sign
movd xmm1, ecx
mulsd xmm0, xmm0
; set sign
psllq xmm1, 63-18
orpd xmm0, xmm1
mov edx, 25
jmp CALL_LIBM_ERROR
RET_INF_OF:
mov edx, 24
; check sign
cmp ecx, 0
jz RET_INF_OF2
movlpd xmm0, QWORD PTR [NEG_INF]
jmp CALL_LIBM_ERROR
RET_INF_OF2:
movlpd xmm0, QWORD PTR [INF]
jmp CALL_LIBM_ERROR
RETURN_ONE:
; y|y
pshufd xmm4, xmm1, 44H
; y*log2(x)_high
mulpd xmm4, xmm6
; get exponent
pextrw eax, xmm4, 3
and eax, 7ff0H
; y*log2(x)>=2^{11} ? (i.e. 2^{11}-eps-x<0)
mov edx, 40a0H
sub edx, eax
; avoid underflow on intermediate calculations (|y*log2(x)|<2^{-56} ?)
sub eax, 3c70H
or edx, eax
cmp edx, 80000000H
; if no OF/UF occurs, return to main path
jb BACK_XY_CHECK
CONT_OF_UF:
; overflow/underflow ?
cmp eax, 80000000H
jb OF_UF
RET_ONE2:
; return +/- 1
or ecx, 1ff80H
movd xmm0, ecx
psllq xmm0, 52-7
sub esp, 16
movlpd [esp+4], xmm0
fld QWORD PTR [esp+4]
add esp, 16
ret
OF_UF:
movlpd xmm4, [esp+4]
pextrw edx, xmm4, 3
and edx, 7ff0H
sub edx, 3ff0H
pextrw eax, xmm1, 3
xor eax, edx
and eax, 8000H
cmp eax, 0
jnz RET_ZERO_UF
jmp RET_INF_OF
_CIpow_pentium4 ENDP
ALIGN 16
_TEXT ENDS
END