📄 libm_reduce.s
字号:
FR_g = f37 FR_p_2 = f38 FR_f = f39 FR_s_lo = f40 FR_p_3 = f41 FR_f_abs = f42 FR_D_lo = f43 FR_p_4 = f44 FR_D_hi = f45 FR_Tmp2_C = f46 FR_s_hi = f47 FR_sigma_A = f48 FR_A = f49 FR_sigma_B = f50 FR_B = f51 FR_sigma_C = f52 FR_b = f53 FR_ScaleP2 = f54 FR_ScaleP3 = f55 FR_ScaleP4 = f56 FR_Tmp_A = f57 FR_Tmp_B = f58 FR_Tmp_C = f59 FR_A_hi = f60 FR_f_hi = f61 FR_r_hi = f62 FR_A_lo = f63 FR_B_hi = f64 FR_a = f65 FR_B_lo = f66 FR_f_lo = f67FR_r_lo = f68 FR_C_hi = f69 FR_C_lo = f70 GR_N = r8GR_Address_of_Input = r32 GR_Address_of_Outputs = r33 GR_Exp_x = r36 GR_Temp = r37 GR_BIASL63 = r38 GR_CASE = r39GR_x_lo = r40 GR_sgn_x = r41 GR_M = r42GR_BASE = r43GR_LENGTH1 = r44GR_LENGTH2 = r45GR_ASUB = r46GR_P_0 = r47GR_P_1 = r48 GR_P_2 = r49 GR_P_3 = r50 GR_P_4 = r51 GR_START = r52GR_SEGMENT = r53GR_A = r54GR_B = r55 GR_C = r56GR_D = r57GR_E = r58GR_TEMP1 = r59 GR_TEMP2 = r60 GR_TEMP3 = r61 GR_TEMP4 = r62 GR_TEMP5 = r63GR_TEMP6 = r64.align 64#ifdef _LIBC.rodata#else.data#endifConstants_Bits_of_2_by_pi:ASM_TYPE_DIRECTIVE(Constants_Bits_of_2_by_pi,@object)data8 0x0000000000000000,0xA2F9836E4E441529data8 0xFC2757D1F534DDC0,0xDB6295993C439041data8 0xFE5163ABDEBBC561,0xB7246E3A424DD2E0data8 0x06492EEA09D1921C,0xFE1DEB1CB129A73Edata8 0xE88235F52EBB4484,0xE99C7026B45F7E41data8 0x3991D639835339F4,0x9C845F8BBDF9283Bdata8 0x1FF897FFDE05980F,0xEF2F118B5A0A6D1Fdata8 0x6D367ECF27CB09B7,0x4F463F669E5FEA2Ddata8 0x7527BAC7EBE5F17B,0x3D0739F78A5292EAdata8 0x6BFB5FB11F8D5D08,0x56033046FC7B6BABdata8 0xF0CFBC209AF4361D,0xA9E391615EE61B08data8 0x6599855F14A06840,0x8DFFD8804D732731data8 0x06061556CA73A8C9,0x60E27BC08C6B47C4data8 0x19C367CDDCE8092A,0x8359C4768B961CA6data8 0xDDAF44D15719053E,0xA5FF07053F7E33E8data8 0x32C2DE4F98327DBB,0xC33D26EF6B1E5EF8data8 0x9F3A1F35CAF27F1D,0x87F121907C7C246Adata8 0xFA6ED5772D30433B,0x15C614B59D19C3C2data8 0xC4AD414D2C5D000C,0x467D862D71E39AC6data8 0x9B0062337CD2B497,0xA7B4D55537F63ED7data8 0x1810A3FC764D2A9D,0x64ABD770F87C6357data8 0xB07AE715175649C0,0xD9D63B3884A7CB23data8 0x24778AD623545AB9,0x1F001B0AF1DFCE19data8 0xFF319F6A1E666157,0x9947FBACD87F7EB7data8 0x652289E83260BFE6,0xCDC4EF09366CD43Fdata8 0x5DD7DE16DE3B5892,0x9BDE2822D2E88628data8 0x4D58E232CAC616E3,0x08CB7DE050C017A7data8 0x1DF35BE01834132E,0x6212830148835B8Edata8 0xF57FB0ADF2E91E43,0x4A48D36710D8DDAAdata8 0x425FAECE616AA428,0x0AB499D3F2A6067Fdata8 0x775C83C2A3883C61,0x78738A5A8CAFBDD7data8 0x6F63A62DCBBFF4EF,0x818D67C12645CA55data8 0x36D9CAD2A8288D61,0xC277C9121426049Bdata8 0x4612C459C444C5C8,0x91B24DF31700AD43data8 0xD4E5492910D5FDFC,0xBE00CC941EEECE70data8 0xF53E1380F1ECC3E7,0xB328F8C79405933Edata8 0x71C1B3092EF3450B,0x9C12887B20AB9FB5data8 0x2EC292472F327B6D,0x550C90A7721FE76Bdata8 0x96CB314A1679E279,0x4189DFF49794E884data8 0xE6E29731996BED88,0x365F5F0EFDBBB49Adata8 0x486CA46742727132,0x5D8DB8159F09E5BCdata8 0x25318D3974F71C05,0x30010C0D68084B58data8 0xEE2C90AA4702E774,0x24D6BDA67DF77248data8 0x6EEF169FA6948EF6,0x91B45153D1F20ACFdata8 0x3398207E4BF56863,0xB25F3EDD035D407Fdata8 0x8985295255C06437,0x10D86D324832754Cdata8 0x5BD4714E6E5445C1,0x090B69F52AD56614data8 0x9D072750045DDB3B,0xB4C576EA17F9877Ddata8 0x6B49BA271D296996,0xACCCC65414AD6AE2data8 0x9089D98850722CBE,0xA4049407777030F3data8 0x27FC00A871EA49C2,0x663DE06483DD9797data8 0x3FA3FD94438C860D,0xDE41319D39928C70data8 0xDDE7B7173BDF082B,0x3715A0805C93805Adata8 0x921110D8E80FAF80,0x6C4BFFDB0F903876data8 0x185915A562BBCB61,0xB989C7BD401004F2data8 0xD2277549F6B6EBBB,0x22DBAA140A2F2689data8 0x768364333B091A94,0x0EAA3A51C2A31DAEdata8 0xEDAF12265C4DC26D,0x9C7A2D9756C0833Fdata8 0x03F6F0098C402B99,0x316D07B43915200Cdata8 0x5BC3D8C492F54BAD,0xC6A5CA4ECD37A736data8 0xA9E69492AB6842DD,0xDE6319EF8C76528Bdata8 0x6837DBFCABA1AE31,0x15DFA1AE00DAFB0Cdata8 0x664D64B705ED3065,0x29BF56573AFF47B9data8 0xF96AF3BE75DF9328,0x3080ABF68C6615CBdata8 0x040622FA1DE4D9A4,0xB33D8F1B5709CD36data8 0xE9424EA4BE13B523,0x331AAAF0A8654FA5data8 0xC1D20F3F0BCD785B,0x76F923048B7B7217data8 0x8953A6C6E26E6F00,0xEBEF584A9BB7DAC4data8 0xBA66AACFCF761D02,0xD12DF1B1C1998C77data8 0xADC3DA4886A05DF7,0xF480C62FF0AC9AECdata8 0xDDBC5C3F6DDED01F,0xC790B6DB2A3A25A3data8 0x9AAF009353AD0457,0xB6B42D297E804BA7data8 0x07DA0EAA76A1597B,0x2A12162DB7DCFDE5data8 0xFAFEDB89FDBE896C,0x76E4FCA90670803Edata8 0x156E85FF87FD073E,0x2833676186182AEAdata8 0xBD4DAFE7B36E6D8F,0x3967955BBF3148D7data8 0x8416DF30432DC735,0x6125CE70C9B8CB30data8 0xFD6CBFA200A4E46C,0x05A0DD5A476F21D2data8 0x1262845CB9496170,0xE0566B0152993755data8 0x50B7D51EC4F1335F,0x6E13E4305DA92E85data8 0xC3B21D3632A1A4B7,0x08D4B1EA21F716E4data8 0x698F77FF2780030C,0x2D408DA0CD4F99A5data8 0x20D3A2B30A5D2F42,0xF9B4CBDA11D0BE7Ddata8 0xC1DB9BBD17AB81A2,0xCA5C6A0817552E55data8 0x0027F0147F8607E1,0x640B148D4196DEBEdata8 0x872AFDDAB6256B34,0x897BFEF3059EBFB9data8 0x4F6A68A82A4A5AC4,0x4FBCF82D985AD795data8 0xC7F48D4D0DA63A20,0x5F57A4B13F149538data8 0x800120CC86DD71B6,0xDEC9F560BF11654Ddata8 0x6B0701ACB08CD0C0,0xB24855510EFB1EC3data8 0x72953B06A33540C0,0x7BDC06CC45E0FA29data8 0x4EC8CAD641F3E8DE,0x647CD8649B31BED9data8 0xC397A4D45877C5E3,0x6913DAF03C3ABA46data8 0x18465F7555F5BDD2,0xC6926E5D2EACED44data8 0x0E423E1C87C461E9,0xFD29F3D6E7CA7C22data8 0x35916FC5E0088DD7,0xFFE26A6EC6FDB0C1data8 0x0893745D7CB2AD6B,0x9D6ECD7B723E6A11data8 0xC6A9CFF7DF7329BA,0xC9B55100B70DB2E2data8 0x24BA74607DE58AD8,0x742C150D0C188194data8 0x667E162901767A9F,0xBEFDFDEF4556367Edata8 0xD913D9ECB9BA8BFC,0x97C427A831C36EF1data8 0x36C59456A8D8B5A8,0xB40ECCCF2D891234data8 0x576F89562CE3CE99,0xB920D6AA5E6B9C2Adata8 0x3ECC5F114A0BFDFB,0xF4E16D3B8E2C86E2data8 0x84D4E9A9B4FCD1EE,0xEFC9352E61392F44data8 0x2138C8D91B0AFC81,0x6A4AFBD81C2F84B4data8 0x538C994ECC2254DC,0x552AD6C6C096190Bdata8 0xB8701A649569605A,0x26EE523F0F117F11data8 0xB5F4F5CBFC2DBC34,0xEEBC34CC5DE8605Edata8 0xDD9B8E67EF3392B8,0x17C99B5861BC57E1data8 0xC68351103ED84871,0xDDDD1C2DA118AF46data8 0x2C21D7F359987AD9,0xC0549EFA864FFC06data8 0x56AE79E536228922,0xAD38DC9367AAE855data8 0x3826829BE7CAA40D,0x51B133990ED7A948data8 0x0569F0B265A7887F,0x974C8836D1F9B392data8 0x214A827B21CF98DC,0x9F405547DC3A74E1data8 0x42EB67DF9DFE5FD4,0x5EA4677B7AACBAA2data8 0xF65523882B55BA41,0x086E59862A218347data8 0x39E6E389D49EE540,0xFB49E956FFCA0F1Cdata8 0x8A59C52BFA94C5C1,0xD3CFC50FAE5ADB86data8 0xC5476243853B8621,0x94792C8761107B4Cdata8 0x2A1A2C8012BF4390,0x2688893C78E4C4A8data8 0x7BDBE5C23AC4EAF4,0x268A67F7BF920D2Bdata8 0xA365B1933D0B7CBD,0xDC51A463DD27DDE1data8 0x6919949A9529A828,0xCE68B4ED09209F44data8 0xCA984E638270237C,0x7E32B90F8EF5A7E7data8 0x561408F1212A9DB5,0x4D7E6F5119A5ABF9data8 0xB5D6DF8261DD9602,0x36169F3AC4A1A283data8 0x6DED727A8D39A9B8,0x825C326B5B2746EDdata8 0x34007700D255F4FC,0x4D59018071E0E13Fdata8 0x89B295F364A8F1AE,0xA74B38FC4CEAB2BBASM_SIZE_DIRECTIVE(Constants_Bits_of_2_by_pi)Constants_Bits_of_pi_by_2:ASM_TYPE_DIRECTIVE(Constants_Bits_of_pi_by_2,@object)data4 0x2168C234,0xC90FDAA2,0x00003FFF,0x00000000data4 0x80DC1CD1,0xC4C6628B,0x00003FBF,0x00000000ASM_SIZE_DIRECTIVE(Constants_Bits_of_pi_by_2).section .text.proc __libm_pi_by_2_reduce#.global __libm_pi_by_2_reduce#.align 64 __libm_pi_by_2_reduce: // X is at the address in Address_of_Input// Place the two-piece result at the address in Address_of_Outputs// r followed by c// N is returned{ .mmfalloc r34 = ar.pfs,2,34,0,0(p0) ldfe FR_X = [GR_Address_of_Input](p0) fsetc.s3 0x00,0x7F ;;}{ .mlx nop.m 999(p0) movl GR_BIASL63 = 0x1003E};;// L -1-2-3-4// 0 0 0 0 0. 1 0 1 0// M 0 1 2 .... 63, 64 65 ... 127, 128// ---------------------------------------------// Segment 0. 1 , 2 , 3// START = M - 63 M = 128 becomes 65// LENGTH1 = START & 0x3F 65 become position 1// SEGMENT = shr(START,6) + 1 0 maps to 1, 64 maps to 2,// LENGTH2 = 64 - LENGTH1// Address_BASE = shladd(SEGMENT,3) + BASE{ .mmi nop.m 999(p0) addl GR_BASE = @ltoff(Constants_Bits_of_2_by_pi#), gp nop.i 999};;{ .mmi ld8 GR_BASE = [GR_BASE] nop.m 999 nop.i 999};;{ .mlx nop.m 999(p0) movl GR_TEMP5 = 0x000000000000FFFE}{ .mmi nop.m 999 ;;(p0) setf.exp FR_sigma_B = GR_TEMP5 nop.i 999}{ .mlx nop.m 999(p0) movl GR_TEMP6 = 0x000000000000FFBE ;;}// Define sigma_C := 2^63; sigma_B := 2^(-1); sigma_A := 2^(-65).{ .mfi(p0) setf.exp FR_sigma_A = GR_TEMP6 nop.f 999 nop.i 999 ;;}// Special Code for testing DE arguments // (p0) movl GR_BIASL63 = 0x0000000000013FFE// (p0) movl GR_x_lo = 0xFFFFFFFFFFFFFFFF// (p0) setf.exp FR_X = GR_BIASL63// (p0) setf.sig FR_ScaleP3 = GR_x_lo// (p0) fmerge.se FR_X = FR_X,FR_ScaleP3// Set sgn_x := sign(x); x := |x|; x_lo := 2 lsb of x.// 2/pi is stored contigously as// 0x00000000 0x00000000.0xA2F....// M = EXP - BIAS ( M >= 63)// Given x = 2^m * 1.xxxx...xxx; we calculate L := 62 - m.// Thus -1 <= L <= -16321.{ .mmf(p0) getf.exp GR_Exp_x = FR_X(p0) getf.sig GR_x_lo = FR_X(p0) fabs FR_X = FR_X ;;}{ .mii(p0) and GR_x_lo = 0x03,GR_x_lo(p0) extr.u GR_M = GR_Exp_x,0,17 ;;(p0) sub GR_START = GR_M,GR_BIASL63}{ .mmi nop.m 999 ;;(p0) and GR_LENGTH1 = 0x3F,GR_START(p0) shr.u GR_SEGMENT = GR_START,6}{ .mmi nop.m 999 ;;(p0) add GR_SEGMENT = 0x1,GR_SEGMENT(p0) sub GR_LENGTH2 = 0x40,GR_LENGTH1}// P_0 is the two bits corresponding to bit positions L+2 and L+1// P_1 is the 64-bit starting at bit position L// P_2 is the 64-bit starting at bit position L-64// P_3 is the 64-bit starting at bit position L-128// P_4 is the 64-bit starting at bit position L-192// P_1 is made up of Alo and Bhi// P_1 = deposit Alo, position 0, length2 into P_1,position length1// deposit Bhi, position length2, length1 into P_1, position 0// P_2 is made up of Blo and Chi// P_2 = deposit Blo, position 0, length2 into P_2, position length1// deposit Chi, position length2, length1 into P_2, position 0// P_3 is made up of Clo and Dhi// P_3 = deposit Clo, position 0, length2 into P_3, position length1// deposit Dhi, position length2, length1 into P_3, position 0// P_4 is made up of Clo and Dhi// P_4 = deposit Dlo, position 0, length2 into P_4, position length1// deposit Ehi, position length2, length1 into P_4, position 0{ .mmi(p0) cmp.le.unc p6,p7 = 0x2,GR_LENGTH1 ;;(p0) shladd GR_BASE = GR_SEGMENT,3,GR_BASE(p7) cmp.eq.unc p8,p9 = 0x1,GR_LENGTH1 ;;}{ .mmi nop.m 999// ld_64 A at Base and increment Base by 8// ld_64 B at Base and increment Base by 8// ld_64 C at Base and increment Base by 8// ld_64 D at Base and increment Base by 8// ld_64 E at Base and increment Base by 8// A/B/C/D// ---------------------// A, B, C, D, and E look like | length1 | length2 |// ---------------------// hi lo(p0) ld8 GR_A = [GR_BASE],8(p0) extr.u GR_sgn_x = GR_Exp_x,17,1 ;;}{ .mmf nop.m 999(p0) ld8 GR_B = [GR_BASE],8(p0) fmerge.se FR_X = FR_sigma_B,FR_X ;;}{ .mii(p0) ld8 GR_C = [GR_BASE],8(p8) extr.u GR_Temp = GR_A,63,1 ;;(p0) shl GR_TEMP1 = GR_A,GR_LENGTH1}{ .mii(p0) ld8 GR_D = [GR_BASE],8// If length1 >= 2,// P_0 = deposit Ahi, position length2, 2 bit into P_0 at position 0.(p6) shr.u GR_P_0 = GR_A,GR_LENGTH2 ;;(p0) shl GR_TEMP2 = GR_B,GR_LENGTH1}{ .mii(p0) ld8 GR_E = [GR_BASE],-40(p0) shr.u GR_P_1 = GR_B,GR_LENGTH2 ;;(p0) shr.u GR_P_2 = GR_C,GR_LENGTH2}// Else// Load 16 bit of ASUB from (Base_Address_of_A - 2)// P_0 = ASUB & 0x3// If length1 == 0,// P_0 complete// Else// Deposit element 63 from Ahi and place in element 0 of P_0.// Endif// Endif{ .mii(p7) ld2 GR_ASUB = [GR_BASE],8(p0) shl GR_TEMP3 = GR_C,GR_LENGTH1 ;;(p0) shl GR_TEMP4 = GR_D,GR_LENGTH1}{ .mii nop.m 999(p0) shr.u GR_P_3 = GR_D,GR_LENGTH2 ;;(p0) shr.u GR_P_4 = GR_E,GR_LENGTH2}{ .mii(p7) and GR_P_0 = 0x03,GR_ASUB(p6) and GR_P_0 = 0x03,GR_P_0 ;;(p0) or GR_P_1 = GR_P_1,GR_TEMP1}{ .mmi(p8) and GR_P_0 = 0x1,GR_P_0 ;;(p0) or GR_P_2 = GR_P_2,GR_TEMP2(p8) shl GR_P_0 = GR_P_0,0x1 ;;}{ .mii nop.m 999(p0) or GR_P_3 = GR_P_3,GR_TEMP3(p8) or GR_P_0 = GR_P_0,GR_Temp}{ .mmi(p0) setf.sig FR_p_1 = GR_P_1 ;;(p0) setf.sig FR_p_2 = GR_P_2(p0) or GR_P_4 = GR_P_4,GR_TEMP4 ;;}{ .mmi nop.m 999 ;;(p0) setf.sig FR_p_3 = GR_P_3(p0) pmpy2.r GR_M = GR_P_0,GR_x_lo}{ .mlx(p0) setf.sig FR_p_4 = GR_P_4// P_1, P_2, P_3, P_4 are integers. They should be// 2^(L-63) * P_1;// 2^(L-63-64) * P_2;// 2^(L-63-128) * P_3;// 2^(L-63-192) * P_4;// Since each of them need to be multiplied to x, we would scale// both x and the P_j's by some convenient factors: scale each// of P_j's up by 2^(63-L), and scale x down by 2^(L-63).// p_1 := fcvt.xf ( P_1 )// p_2 := fcvt.xf ( P_2 ) * 2^(-64)// p_3 := fcvt.xf ( P_3 ) * 2^(-128)// p_4 := fcvt.xf ( P_4 ) * 2^(-192)// x= Set x's exp to -1 because 2^m*1.x...x *2^(L-63)=2^(-1)*1.x...xxx// --------- --------- ---------// | P_1 | | P_2 | | P_3 |// --------- --------- ---------// ---------// X | X |// ---------// ----------------------------------------------------// --------- ---------// | A_hi | | A_lo |// --------- ---------// --------- ---------// | B_hi | | B_lo |// --------- ---------// --------- ---------// | C_hi | | C_lo |// --------- ---------// ====================================================// ----------- --------- --------- ---------// | S_0 | | S_1 | | S_2 | | S_3 |// ----------- --------- --------- ---------// | |___ binary point// |___ possibly one more bit//// Let FPSR3 be set to round towards zero with widest precision// and exponent range. Unless an explicit FPSR is given,// round-to-nearest with widest precision and exponent range is// used.(p0) movl GR_TEMP1 = 0x000000000000FFBF}{ .mmi nop.m 999 ;;(p0) setf.exp FR_ScaleP2 = GR_TEMP1 nop.i 999}{ .mlx nop.m 999(p0) movl GR_TEMP4 = 0x000000000001003E}{ .mmi nop.m 999 ;;(p0) setf.exp FR_sigma_C = GR_TEMP4 nop.i 999}{ .mlx nop.m 999(p0) movl GR_TEMP2 = 0x000000000000FF7F ;;}{ .mmf nop.m 999(p0) setf.exp FR_ScaleP3 = GR_TEMP2(p0) fcvt.xuf.s1 FR_p_1 = FR_p_1 ;;}{ .mfi nop.m 999(p0) fcvt.xuf.s1 FR_p_2 = FR_p_2 nop.i 999}{ .mlx nop.m 999(p0) movl GR_Temp = 0x000000000000FFDE ;;}{ .mmf nop.m 999(p0) setf.exp FR_TWOM33 = GR_Temp(p0) fcvt.xuf.s1 FR_p_3 = FR_p_3 ;;}{ .mfi nop.m 999(p0) fcvt.xuf.s1 FR_p_4 = FR_p_4 nop.i 999 ;;}{ .mfi nop.m 999// Tmp_C := fmpy.fpsr3( x, p_1 );// Tmp_B := fmpy.fpsr3( x, p_2 );// Tmp_A := fmpy.fpsr3( x, p_3 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -