mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-14 23:10:33 +02:00
VFPU: Compute vrcp, vrsq, vsqrt and vexp2 without correction tables
The four share one quadratic interpolator: 128 segments picked by the top 7 bits of the input, each with a constant, a linear and a squared-term coefficient, and a squarer on the top 10 bits of the rest that rounds t^2 up to a multiple of 256. 128 small coefficient sets per function replace the 1 MB of delta tables. Derived from the output of the table-based code, and bit-exact with it over every 32-bit input. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
09cf031f2b
commit
dade876474
6 files changed
+311
-184
No files matched your search
+311
-180
@@ -1038,6 +1038,310 @@ uint32_t vrnd_generate(uint32_t *rcx) {
|
||||
// estimations, to allow to store them in smaller types.
|
||||
// See https://github.com/hrydgard/ppsspp/issues/16946 for details.
|
||||
|
||||
// rcp, rsqrt, sqrt and exp2 share one quadratic interpolator. The top 7 bits of a 23-bit input
|
||||
// index pick one of 128 segments with their own coefficients; the other 16 bits, x2, enter the
|
||||
// linear term in full, while the squared term only sees the top 10 of them, as a distance t from the
|
||||
// middle of the segment. The squarer rounds t^2 up to a multiple of 256, and the squared term is
|
||||
// floored separately from the rest. The sum is the significand (implicit bit included) in ulps of the
|
||||
// segment's exponent, truncated to 22 bits like every VFPU result. Derived from the output of the
|
||||
// table-based versions this replaces, and bit-exact with them over every input.
|
||||
struct VFPUSegment {
|
||||
int32_t c0; // value at x2 = 0, in ulps of 2^(e - 150), implicit bit included
|
||||
int32_t m; // slope in 2^-17 ulps per step of x2
|
||||
int16_t n; // squared term coefficient
|
||||
int16_t e; // binade whose ulps the segment works in
|
||||
};
|
||||
|
||||
// 1/x for x in [1, 2).
|
||||
static const VFPUSegment vfpu_rcp_segments[128] = {
|
||||
{ 0x0FFFF02, -0x003F80C, 0x07F, 0x7E }, { 0x0FE0300, -0x003E86C, 0x07C, 0x7E },
|
||||
{ 0x0FC0ECF, -0x003D924, 0x079, 0x7E }, { 0x0FA2241, -0x003CA38, 0x076, 0x7E },
|
||||
{ 0x0F83D28, -0x003BBA0, 0x074, 0x7E }, { 0x0F65F5C, -0x003AD60, 0x071, 0x7E },
|
||||
{ 0x0F488B1, -0x0039F6C, 0x06E, 0x7E }, { 0x0F2B8FE, -0x00391C8, 0x06C, 0x7E },
|
||||
{ 0x0F0F01D, -0x0038470, 0x06A, 0x7E }, { 0x0EF2DE9, -0x0037764, 0x067, 0x7E },
|
||||
{ 0x0ED723A, -0x0036AA0, 0x065, 0x7E }, { 0x0EBBCED, -0x0035E20, 0x063, 0x7E },
|
||||
{ 0x0EA0DDF, -0x00351E8, 0x061, 0x7E }, { 0x0E864EE, -0x00345EC, 0x05F, 0x7E },
|
||||
{ 0x0E6C1FA, -0x0033A34, 0x05D, 0x7E }, { 0x0E524E2, -0x0032EBC, 0x05B, 0x7E },
|
||||
{ 0x0E38D87, -0x0032380, 0x059, 0x7E }, { 0x0E1FBCA, -0x003187C, 0x057, 0x7E },
|
||||
{ 0x0E06F8C, -0x0030DB4, 0x056, 0x7E }, { 0x0DEE8B4, -0x0030324, 0x054, 0x7E },
|
||||
{ 0x0DD6725, -0x002F8CC, 0x052, 0x7E }, { 0x0DBEAC0, -0x002EEA4, 0x051, 0x7E },
|
||||
{ 0x0DA7370, -0x002E4B4, 0x04F, 0x7E }, { 0x0D90118, -0x002DAF4, 0x04D, 0x7E },
|
||||
{ 0x0D7939E, -0x002D168, 0x04C, 0x7E }, { 0x0D62AEB, -0x002C808, 0x04B, 0x7E },
|
||||
{ 0x0D4C6E9, -0x002BED8, 0x049, 0x7E }, { 0x0D3677D, -0x002B5D4, 0x048, 0x7E },
|
||||
{ 0x0D20C95, -0x002AD00, 0x046, 0x7E }, { 0x0D0B616, -0x002A454, 0x045, 0x7E },
|
||||
{ 0x0CF63EF, -0x0029BD4, 0x043, 0x7E }, { 0x0CE1606, -0x0029378, 0x042, 0x7E },
|
||||
{ 0x0CCCC4B, -0x0028B48, 0x041, 0x7E }, { 0x0CB86A8, -0x002833C, 0x040, 0x7E },
|
||||
{ 0x0CA450A, -0x0027B58, 0x03F, 0x7E }, { 0x0C90760, -0x0027398, 0x03D, 0x7E },
|
||||
{ 0x0C7CD94, -0x0026BFC, 0x03C, 0x7E }, { 0x0C69796, -0x0026484, 0x03B, 0x7E },
|
||||
{ 0x0C56554, -0x0025D2C, 0x03A, 0x7E }, { 0x0C436BE, -0x00255FC, 0x039, 0x7E },
|
||||
{ 0x0C30BC1, -0x0024EE8, 0x038, 0x7E }, { 0x0C1E44E, -0x00247F4, 0x037, 0x7E },
|
||||
{ 0x0C0C055, -0x0024120, 0x036, 0x7E }, { 0x0BF9FC6, -0x0023A68, 0x035, 0x7E },
|
||||
{ 0x0BE8292, -0x00233D0, 0x034, 0x7E }, { 0x0BD68A8, -0x0022D54, 0x034, 0x7E },
|
||||
{ 0x0BC5200, -0x00226F8, 0x032, 0x7E }, { 0x0BB3E83, -0x00220B4, 0x032, 0x7E },
|
||||
{ 0x0BA2E2A, -0x0021A8C, 0x031, 0x7E }, { 0x0B920E4, -0x0021480, 0x030, 0x7E },
|
||||
{ 0x0B816A5, -0x0020E8C, 0x02F, 0x7E }, { 0x0B70F5D, -0x00208B0, 0x02F, 0x7E },
|
||||
{ 0x0B60B05, -0x00202F0, 0x02E, 0x7E }, { 0x0B5098D, -0x001FD48, 0x02D, 0x7E },
|
||||
{ 0x0B40AE9, -0x001F7B8, 0x02C, 0x7E }, { 0x0B30F0B, -0x001F23C, 0x02C, 0x7E },
|
||||
{ 0x0B215ED, -0x001ECDC, 0x02B, 0x7E }, { 0x0B11F80, -0x001E790, 0x02A, 0x7E },
|
||||
{ 0x0B02BB9, -0x001E258, 0x029, 0x7E }, { 0x0AF3A8C, -0x001DD38, 0x029, 0x7E },
|
||||
{ 0x0AE4BF1, -0x001D828, 0x028, 0x7E }, { 0x0AD5FDD, -0x001D330, 0x027, 0x7E },
|
||||
{ 0x0AC7644, -0x001CE4C, 0x027, 0x7E }, { 0x0AB8F1E, -0x001C97C, 0x026, 0x7E },
|
||||
{ 0x0AAAA5F, -0x001C4C0, 0x026, 0x7E }, { 0x0A9C800, -0x001C014, 0x025, 0x7E },
|
||||
{ 0x0A8E7F5, -0x001BB78, 0x025, 0x7E }, { 0x0A80A39, -0x001B6F4, 0x024, 0x7E },
|
||||
{ 0x0A72EBF, -0x001B280, 0x023, 0x7E }, { 0x0A6557E, -0x001AE1C, 0x023, 0x7E },
|
||||
{ 0x0A57E6F, -0x001A9C8, 0x023, 0x7E }, { 0x0A4A98B, -0x001A588, 0x022, 0x7E },
|
||||
{ 0x0A3D6C8, -0x001A154, 0x021, 0x7E }, { 0x0A3061C, -0x0019D34, 0x021, 0x7E },
|
||||
{ 0x0A23783, -0x0019920, 0x020, 0x7E }, { 0x0A16AF1, -0x001951C, 0x020, 0x7E },
|
||||
{ 0x0A0A063, -0x001912C, 0x01F, 0x7E }, { 0x09FD7CC, -0x0018D44, 0x01F, 0x7E },
|
||||
{ 0x09F112A, -0x0018970, 0x01E, 0x7E }, { 0x09E4C71, -0x00185A4, 0x01E, 0x7E },
|
||||
{ 0x09D899D, -0x00181EC, 0x01E, 0x7E }, { 0x09CC8A7, -0x0017E3C, 0x01D, 0x7E },
|
||||
{ 0x09C0987, -0x0017AA0, 0x01D, 0x7E }, { 0x09B4C36, -0x001770C, 0x01D, 0x7E },
|
||||
{ 0x09A90B0, -0x0017388, 0x01C, 0x7E }, { 0x099D6EB, -0x0017010, 0x01C, 0x7E },
|
||||
{ 0x0991EE4, -0x0016CA0, 0x01B, 0x7E }, { 0x0986892, -0x0016940, 0x01B, 0x7E },
|
||||
{ 0x097B3F0, -0x00165EC, 0x01B, 0x7E }, { 0x09700FA, -0x00162A4, 0x01A, 0x7E },
|
||||
{ 0x0964FA6, -0x0015F68, 0x01A, 0x7E }, { 0x0959FF3, -0x0015C34, 0x019, 0x7E },
|
||||
{ 0x094F1D7, -0x001590C, 0x019, 0x7E }, { 0x094454F, -0x00155F4, 0x019, 0x7E },
|
||||
{ 0x0939A54, -0x00152E0, 0x019, 0x7E }, { 0x092F0E4, -0x0014FDC, 0x018, 0x7E },
|
||||
{ 0x09248F5, -0x0014CE0, 0x018, 0x7E }, { 0x091A284, -0x00149EC, 0x018, 0x7E },
|
||||
{ 0x090FD8E, -0x0014704, 0x017, 0x7E }, { 0x0905A0A, -0x0014424, 0x017, 0x7E },
|
||||
{ 0x08FB7F6, -0x0014150, 0x017, 0x7E }, { 0x08F174E, -0x0013E88, 0x016, 0x7E },
|
||||
{ 0x08E7809, -0x0013BC4, 0x016, 0x7E }, { 0x08DDA26, -0x001390C, 0x016, 0x7E },
|
||||
{ 0x08D3DA1, -0x001365C, 0x015, 0x7E }, { 0x08CA272, -0x00133B4, 0x015, 0x7E },
|
||||
{ 0x08C0897, -0x0013118, 0x015, 0x7E }, { 0x08B700C, -0x0012E80, 0x014, 0x7E },
|
||||
{ 0x08AD8CB, -0x0012BF4, 0x014, 0x7E }, { 0x08A42D0, -0x001296C, 0x014, 0x7E },
|
||||
{ 0x089AE19, -0x00126F0, 0x014, 0x7E }, { 0x0891A9F, -0x0012478, 0x014, 0x7E },
|
||||
{ 0x0888861, -0x001220C, 0x014, 0x7E }, { 0x087F75B, -0x0011FA8, 0x013, 0x7E },
|
||||
{ 0x0876785, -0x0011D48, 0x013, 0x7E }, { 0x086D8E1, -0x0011AF4, 0x012, 0x7E },
|
||||
{ 0x0864B66, -0x00118A4, 0x012, 0x7E }, { 0x085BF13, -0x001165C, 0x012, 0x7E },
|
||||
{ 0x08533E4, -0x0011418, 0x012, 0x7E }, { 0x084A9D6, -0x00111E0, 0x012, 0x7E },
|
||||
{ 0x08420E4, -0x0010FAC, 0x012, 0x7E }, { 0x083990E, -0x0010D80, 0x011, 0x7E },
|
||||
{ 0x083124D, -0x0010B5C, 0x011, 0x7E }, { 0x0828C9E, -0x001093C, 0x011, 0x7E },
|
||||
{ 0x08207FF, -0x0010724, 0x011, 0x7E }, { 0x081846C, -0x0010510, 0x011, 0x7E },
|
||||
{ 0x08101E4, -0x0010304, 0x010, 0x7E }, { 0x0808061, -0x0010100, 0x010, 0x7E },
|
||||
};
|
||||
|
||||
// 1/sqrt(x) for x in [1, 4), indexed by the bottom exponent bit and the top 22 mantissa bits.
|
||||
static const VFPUSegment vfpu_rsqrt_segments[128] = {
|
||||
{ 0x0FFFE88, -0x003F428, 0x0BC, 0x7E }, { 0x0FE0482, -0x003DD10, 0x0B5, 0x7E },
|
||||
{ 0x0FC1608, -0x003C6D4, 0x0AE, 0x7E }, { 0x0FA32AB, -0x003B16C, 0x0A7, 0x7E },
|
||||
{ 0x0F859FE, -0x0039CCC, 0x0A2, 0x7E }, { 0x0F68BA4, -0x00388E8, 0x09C, 0x7E },
|
||||
{ 0x0F4C73B, -0x00375B8, 0x096, 0x7E }, { 0x0F30C68, -0x0036334, 0x091, 0x7E },
|
||||
{ 0x0F15AD7, -0x0035154, 0x08C, 0x7E }, { 0x0EFB237, -0x003400C, 0x087, 0x7E },
|
||||
{ 0x0EE1238, -0x0032F5C, 0x083, 0x7E }, { 0x0EC7A94, -0x0031F34, 0x07E, 0x7E },
|
||||
{ 0x0EAEB01, -0x0030F94, 0x07A, 0x7E }, { 0x0E9633C, -0x0030078, 0x077, 0x7E },
|
||||
{ 0x0E7E307, -0x002F1D4, 0x073, 0x7E }, { 0x0E66A24, -0x002E3A8, 0x06F, 0x7E },
|
||||
{ 0x0E4F856, -0x002D5E8, 0x06C, 0x7E }, { 0x0E38D67, -0x002C898, 0x069, 0x7E },
|
||||
{ 0x0E22923, -0x002BBAC, 0x065, 0x7E }, { 0x0E0CB52, -0x002AF24, 0x062, 0x7E },
|
||||
{ 0x0DF73C3, -0x002A2FC, 0x060, 0x7E }, { 0x0DE224B, -0x002972C, 0x05D, 0x7E },
|
||||
{ 0x0DCD6BA, -0x0028BB4, 0x05A, 0x7E }, { 0x0DB90E5, -0x0028090, 0x057, 0x7E },
|
||||
{ 0x0DA50A0, -0x00275BC, 0x055, 0x7E }, { 0x0D915C5, -0x0026B38, 0x053, 0x7E },
|
||||
{ 0x0D7E02D, -0x00260FC, 0x051, 0x7E }, { 0x0D6AFB5, -0x0025708, 0x04E, 0x7E },
|
||||
{ 0x0D58435, -0x0024D54, 0x04C, 0x7E }, { 0x0D45D8E, -0x00243E8, 0x04A, 0x7E },
|
||||
{ 0x0D33B9E, -0x0023ABC, 0x048, 0x7E }, { 0x0D21E44, -0x00231C8, 0x046, 0x7E },
|
||||
{ 0x0D10562, -0x0022914, 0x045, 0x7E }, { 0x0CFF0DC, -0x0022098, 0x043, 0x7E },
|
||||
{ 0x0CEE094, -0x0021850, 0x041, 0x7E }, { 0x0CDD46F, -0x0021040, 0x03F, 0x7E },
|
||||
{ 0x0CCCC51, -0x0020864, 0x03E, 0x7E }, { 0x0CBC823, -0x00200B8, 0x03C, 0x7E },
|
||||
{ 0x0CAC7C9, -0x001F938, 0x03B, 0x7E }, { 0x0C9CB30, -0x001F1EC, 0x039, 0x7E },
|
||||
{ 0x0C8D23B, -0x001EACC, 0x038, 0x7E }, { 0x0C7DCD9, -0x001E3D4, 0x036, 0x7E },
|
||||
{ 0x0C6EAEE, -0x001DD08, 0x036, 0x7E }, { 0x0C5FC6E, -0x001D664, 0x034, 0x7E },
|
||||
{ 0x0C5113D, -0x001CFE8, 0x033, 0x7E }, { 0x0C4294B, -0x001C990, 0x032, 0x7E },
|
||||
{ 0x0C34486, -0x001C35C, 0x030, 0x7E }, { 0x0C262D7, -0x001BD50, 0x030, 0x7E },
|
||||
{ 0x0C18433, -0x001B760, 0x02E, 0x7E }, { 0x0C0A882, -0x001B198, 0x02E, 0x7E },
|
||||
{ 0x0BFCFB8, -0x001ABEC, 0x02D, 0x7E }, { 0x0BEF9C6, -0x001A660, 0x02B, 0x7E },
|
||||
{ 0x0BE2695, -0x001A0F4, 0x02B, 0x7E }, { 0x0BD561D, -0x0019BA4, 0x02A, 0x7E },
|
||||
{ 0x0BC884D, -0x0019670, 0x029, 0x7E }, { 0x0BBBD17, -0x0019158, 0x028, 0x7E },
|
||||
{ 0x0BAF46C, -0x0018C5C, 0x027, 0x7E }, { 0x0BA2E40, -0x001877C, 0x026, 0x7E },
|
||||
{ 0x0B96A84, -0x00182B0, 0x025, 0x7E }, { 0x0B8A92B, -0x0017E00, 0x025, 0x7E },
|
||||
{ 0x0B7EA2C, -0x0017968, 0x024, 0x7E }, { 0x0B72D79, -0x00174E8, 0x023, 0x7E },
|
||||
{ 0x0B67306, -0x0017080, 0x022, 0x7E }, { 0x0B5BAC5, -0x0016C2C, 0x022, 0x7E },
|
||||
{ 0x0B503E9, -0x002CBB4, 0x085, 0x7E }, { 0x0B39E19, -0x002BB5C, 0x080, 0x7E },
|
||||
{ 0x0B24072, -0x002ABA8, 0x07C, 0x7E }, { 0x0B0EAA8, -0x0029C84, 0x077, 0x7E },
|
||||
{ 0x0AF9C6D, -0x0028DEC, 0x073, 0x7E }, { 0x0AE557E, -0x0027FE0, 0x06F, 0x7E },
|
||||
{ 0x0AD1596, -0x002724C, 0x06B, 0x7E }, { 0x0ABDC78, -0x0026534, 0x067, 0x7E },
|
||||
{ 0x0AAA9E5, -0x0025890, 0x063, 0x7E }, { 0x0A97DA2, -0x0024C58, 0x060, 0x7E },
|
||||
{ 0x0A8577B, -0x0024088, 0x05D, 0x7E }, { 0x0A7373C, -0x0023520, 0x05A, 0x7E },
|
||||
{ 0x0A61CB1, -0x0022A14, 0x057, 0x7E }, { 0x0A507AD, -0x0021F64, 0x054, 0x7E },
|
||||
{ 0x0A3F800, -0x0021508, 0x051, 0x7E }, { 0x0A2ED7F, -0x0020B04, 0x04F, 0x7E },
|
||||
{ 0x0A1E801, -0x002014C, 0x04D, 0x7E }, { 0x0A0E761, -0x001F7E0, 0x04A, 0x7E },
|
||||
{ 0x09FEB74, -0x001EEC0, 0x048, 0x7E }, { 0x09EF418, -0x001E5E0, 0x046, 0x7E },
|
||||
{ 0x09E012B, -0x001DD48, 0x044, 0x7E }, { 0x09D128A, -0x001D4F0, 0x042, 0x7E },
|
||||
{ 0x09C2816, -0x001CCD4, 0x040, 0x7E }, { 0x09B41B0, -0x001C4F4, 0x03E, 0x7E },
|
||||
{ 0x09A5F38, -0x001BD4C, 0x03D, 0x7E }, { 0x0998096, -0x001B5D8, 0x03B, 0x7E },
|
||||
{ 0x098A5AD, -0x001AE9C, 0x039, 0x7E }, { 0x097CE60, -0x001A794, 0x038, 0x7E },
|
||||
{ 0x096FA9A, -0x001A0B8, 0x036, 0x7E }, { 0x0962A3F, -0x0019A0C, 0x035, 0x7E },
|
||||
{ 0x0955D3C, -0x0019390, 0x033, 0x7E }, { 0x0949375, -0x0018D3C, 0x032, 0x7E },
|
||||
{ 0x093CCD8, -0x0018714, 0x031, 0x7E }, { 0x093094F, -0x0018114, 0x030, 0x7E },
|
||||
{ 0x09248C7, -0x0017B3C, 0x02F, 0x7E }, { 0x0918B2B, -0x0017588, 0x02E, 0x7E },
|
||||
{ 0x090D06B, -0x0016FF8, 0x02C, 0x7E }, { 0x0901870, -0x0016A88, 0x02B, 0x7E },
|
||||
{ 0x08F632D, -0x0016540, 0x02A, 0x7E }, { 0x08EB08E, -0x0016014, 0x029, 0x7E },
|
||||
{ 0x08E0085, -0x0015B0C, 0x028, 0x7E }, { 0x08D5301, -0x0015620, 0x027, 0x7E },
|
||||
{ 0x08CA7F3, -0x0015150, 0x026, 0x7E }, { 0x08BFF4D, -0x0014C9C, 0x025, 0x7E },
|
||||
{ 0x08B58FE, -0x0014808, 0x025, 0x7E }, { 0x08AB4FE, -0x001438C, 0x023, 0x7E },
|
||||
{ 0x08A1337, -0x0013F28, 0x023, 0x7E }, { 0x08973A4, -0x0013AE0, 0x022, 0x7E },
|
||||
{ 0x088D635, -0x00136B0, 0x021, 0x7E }, { 0x0883ADC, -0x0013298, 0x021, 0x7E },
|
||||
{ 0x087A192, -0x0012E94, 0x020, 0x7E }, { 0x0870A49, -0x0012AA8, 0x01F, 0x7E },
|
||||
{ 0x08674F6, -0x00126D4, 0x01E, 0x7E }, { 0x085E18B, -0x0012310, 0x01E, 0x7E },
|
||||
{ 0x0855004, -0x0011F64, 0x01D, 0x7E }, { 0x084C051, -0x0011BCC, 0x01D, 0x7E },
|
||||
{ 0x084326D, -0x0011844, 0x01C, 0x7E }, { 0x083A64A, -0x00114D0, 0x01C, 0x7E },
|
||||
{ 0x0831BE4, -0x0011170, 0x01B, 0x7E }, { 0x082932E, -0x0010E20, 0x01A, 0x7E },
|
||||
{ 0x0820C1E, -0x0010AE0, 0x01A, 0x7E }, { 0x08186B0, -0x00107B0, 0x019, 0x7E },
|
||||
{ 0x08102D8, -0x0010490, 0x019, 0x7E }, { 0x0808091, -0x0010180, 0x018, 0x7E },
|
||||
};
|
||||
|
||||
// sqrt(x) for x in [1, 4), indexed like rsqrt.
|
||||
static const VFPUSegment vfpu_sqrt_segments[128] = {
|
||||
{ 0x0800040, 0x001FE04, -0x020, 0x7F }, { 0x080FF40, 0x001FA1C, -0x01F, 0x7F },
|
||||
{ 0x081FC4E, 0x001F648, -0x01F, 0x7F }, { 0x082F770, 0x001F290, -0x01E, 0x7F },
|
||||
{ 0x083F0B5, 0x001EEE8, -0x01D, 0x7F }, { 0x084E828, 0x001EB54, -0x01D, 0x7F },
|
||||
{ 0x085DDD0, 0x001E7D4, -0x01C, 0x7F }, { 0x086D1BA, 0x001E468, -0x01C, 0x7F },
|
||||
{ 0x087C3EC, 0x001E110, -0x01B, 0x7F }, { 0x088B471, 0x001DDC8, -0x01A, 0x7F },
|
||||
{ 0x089A352, 0x001DA90, -0x019, 0x7F }, { 0x08A9099, 0x001D768, -0x019, 0x7F },
|
||||
{ 0x08B7C4A, 0x001D450, -0x018, 0x7F }, { 0x08C6671, 0x001D148, -0x018, 0x7F },
|
||||
{ 0x08D4F14, 0x001CE50, -0x018, 0x7F }, { 0x08E3639, 0x001CB64, -0x017, 0x7F },
|
||||
{ 0x08F1BEB, 0x001C888, -0x017, 0x7F }, { 0x090002C, 0x001C5B8, -0x016, 0x7F },
|
||||
{ 0x090E308, 0x001C2F4, -0x016, 0x7F }, { 0x091C482, 0x001C040, -0x016, 0x7F },
|
||||
{ 0x092A4A0, 0x001BD98, -0x015, 0x7F }, { 0x093836B, 0x001BAFC, -0x015, 0x7F },
|
||||
{ 0x09460E8, 0x001B868, -0x015, 0x7F }, { 0x0953D1A, 0x001B5E4, -0x014, 0x7F },
|
||||
{ 0x096180B, 0x001B368, -0x014, 0x7F }, { 0x096F1BC, 0x001B0F8, -0x013, 0x7F },
|
||||
{ 0x097CA37, 0x001AE94, -0x013, 0x7F }, { 0x098A180, 0x001AC34, -0x013, 0x7F },
|
||||
{ 0x0997798, 0x001A9E4, -0x012, 0x7F }, { 0x09A4C89, 0x001A79C, -0x012, 0x7F },
|
||||
{ 0x09B2056, 0x001A55C, -0x012, 0x7F }, { 0x09BF303, 0x001A324, -0x012, 0x7F },
|
||||
{ 0x09CC493, 0x001A0F8, -0x011, 0x7F }, { 0x09D950E, 0x0019ED4, -0x011, 0x7F },
|
||||
{ 0x09E6477, 0x0019CB4, -0x011, 0x7F }, { 0x09F32D1, 0x0019AA4, -0x011, 0x7F },
|
||||
{ 0x0A00022, 0x0019894, -0x011, 0x7F }, { 0x0A0CC6A, 0x0019690, -0x010, 0x7F },
|
||||
{ 0x0A197B2, 0x0019494, -0x010, 0x7F }, { 0x0A261FC, 0x00192A0, -0x010, 0x7F },
|
||||
{ 0x0A32B49, 0x00190B0, -0x00F, 0x7F }, { 0x0A3F3A1, 0x0018EC8, -0x00F, 0x7F },
|
||||
{ 0x0A4BB05, 0x0018CE8, -0x00F, 0x7F }, { 0x0A58178, 0x0018B10, -0x00F, 0x7F },
|
||||
{ 0x0A646FF, 0x001893C, -0x00F, 0x7F }, { 0x0A70B9B, 0x0018770, -0x00E, 0x7F },
|
||||
{ 0x0A7CF52, 0x00185A8, -0x00E, 0x7F }, { 0x0A89226, 0x00183E8, -0x00E, 0x7F },
|
||||
{ 0x0A95419, 0x0018230, -0x00E, 0x7F }, { 0x0AA1530, 0x0018078, -0x00E, 0x7F },
|
||||
{ 0x0AAD56A, 0x0017ECC, -0x00D, 0x7F }, { 0x0AB94CF, 0x0017D20, -0x00D, 0x7F },
|
||||
{ 0x0AC535F, 0x0017B80, -0x00D, 0x7F }, { 0x0AD111E, 0x00179E0, -0x00D, 0x7F },
|
||||
{ 0x0ADCE0D, 0x0017848, -0x00D, 0x7F }, { 0x0AE8A2E, 0x00176B4, -0x00C, 0x7F },
|
||||
{ 0x0AF4587, 0x0017524, -0x00C, 0x7F }, { 0x0B0001A, 0x0017398, -0x00D, 0x7F },
|
||||
{ 0x0B0B9E6, 0x0017214, -0x00D, 0x7F }, { 0x0B172EE, 0x0017094, -0x00C, 0x7F },
|
||||
{ 0x0B22B38, 0x0016F18, -0x00C, 0x7F }, { 0x0B2E2C4, 0x0016DA0, -0x00C, 0x7F },
|
||||
{ 0x0B39994, 0x0016C30, -0x00C, 0x7F }, { 0x0B44FAB, 0x0016AC0, -0x00C, 0x7F },
|
||||
{ 0x0B5054D, 0x002D148, -0x02D, 0x7F }, { 0x0B66DEE, 0x002CBC0, -0x02C, 0x7F },
|
||||
{ 0x0B7D3CB, 0x002C658, -0x02B, 0x7F }, { 0x0B936F5, 0x002C110, -0x02A, 0x7F },
|
||||
{ 0x0BA977A, 0x002BBE8, -0x029, 0x7F }, { 0x0BBF56B, 0x002B6D8, -0x028, 0x7F },
|
||||
{ 0x0BD50D5, 0x002B1E4, -0x027, 0x7F }, { 0x0BEA9C5, 0x002AD10, -0x026, 0x7F },
|
||||
{ 0x0C0004C, 0x002A850, -0x026, 0x7F }, { 0x0C15472, 0x002A3AC, -0x025, 0x7F },
|
||||
{ 0x0C2A646, 0x0029F20, -0x024, 0x7F }, { 0x0C3F5D5, 0x0029AA8, -0x024, 0x7F },
|
||||
{ 0x0C54327, 0x002964C, -0x023, 0x7F }, { 0x0C68E4A, 0x0029200, -0x022, 0x7F },
|
||||
{ 0x0C7D74A, 0x0028DCC, -0x022, 0x7F }, { 0x0C91E2E, 0x00289AC, -0x021, 0x7F },
|
||||
{ 0x0CA6302, 0x00285A0, -0x020, 0x7F }, { 0x0CBA5D0, 0x00281A8, -0x01F, 0x7F },
|
||||
{ 0x0CCE6A3, 0x0027DC0, -0x01F, 0x7F }, { 0x0CE2581, 0x00279EC, -0x01E, 0x7F },
|
||||
{ 0x0CF6276, 0x0027628, -0x01E, 0x7F }, { 0x0D09D88, 0x0027278, -0x01D, 0x7F },
|
||||
{ 0x0D1D6C3, 0x0026ED4, -0x01D, 0x7F }, { 0x0D30E2D, 0x0026B44, -0x01D, 0x7F },
|
||||
{ 0x0D443CD, 0x00267C0, -0x01C, 0x7F }, { 0x0D577AD, 0x002644C, -0x01C, 0x7F },
|
||||
{ 0x0D6A9D1, 0x00260EC, -0x01B, 0x7F }, { 0x0D7DA44, 0x0025D94, -0x01A, 0x7F },
|
||||
{ 0x0D9090D, 0x0025A4C, -0x01A, 0x7F }, { 0x0DA3632, 0x0025710, -0x01A, 0x7F },
|
||||
{ 0x0DB61B8, 0x00253E4, -0x019, 0x7F }, { 0x0DC8BA9, 0x00250C0, -0x019, 0x7F },
|
||||
{ 0x0DDB407, 0x0024DB0, -0x018, 0x7F }, { 0x0DEDADE, 0x0024AA4, -0x018, 0x7F },
|
||||
{ 0x0E00030, 0x00247A8, -0x018, 0x7F }, { 0x0E12404, 0x00244B8, -0x018, 0x7F },
|
||||
{ 0x0E2465E, 0x00241D4, -0x017, 0x7F }, { 0x0E36747, 0x0023EF8, -0x017, 0x7F },
|
||||
{ 0x0E486C3, 0x0023C28, -0x017, 0x7F }, { 0x0E5A4D5, 0x0023964, -0x016, 0x7F },
|
||||
{ 0x0E6C186, 0x00236A8, -0x016, 0x7F }, { 0x0E7DCD8, 0x00233F8, -0x015, 0x7F },
|
||||
{ 0x0E8F6D3, 0x0023150, -0x015, 0x7F }, { 0x0EA0F7A, 0x0022EB4, -0x015, 0x7F },
|
||||
{ 0x0EB26D3, 0x0022C1C, -0x015, 0x7F }, { 0x0EC3CE1, 0x0022990, -0x015, 0x7F },
|
||||
{ 0x0ED51A7, 0x0022710, -0x014, 0x7F }, { 0x0EE652F, 0x0022494, -0x014, 0x7F },
|
||||
{ 0x0EF7777, 0x0022224, -0x013, 0x7F }, { 0x0F08888, 0x0021FB8, -0x013, 0x7F },
|
||||
{ 0x0F19864, 0x0021D58, -0x013, 0x7F }, { 0x0F2A710, 0x0021B00, -0x013, 0x7F },
|
||||
{ 0x0F3B490, 0x00218AC, -0x013, 0x7F }, { 0x0F4C0E6, 0x0021664, -0x013, 0x7F },
|
||||
{ 0x0F5CC16, 0x0021424, -0x012, 0x7F }, { 0x0F6D627, 0x00211E8, -0x012, 0x7F },
|
||||
{ 0x0F7DF1A, 0x0020FB0, -0x012, 0x7F }, { 0x0F8E6F0, 0x0020D88, -0x011, 0x7F },
|
||||
{ 0x0F9EDB3, 0x0020B60, -0x011, 0x7F }, { 0x0FAF362, 0x0020940, -0x011, 0x7F },
|
||||
{ 0x0FBF801, 0x0020728, -0x011, 0x7F }, { 0x0FCFB94, 0x0020514, -0x011, 0x7F },
|
||||
{ 0x0FDFE1C, 0x0020308, -0x010, 0x7F }, { 0x0FEFF9F, 0x0020104, -0x010, 0x7F },
|
||||
};
|
||||
|
||||
// exp2(x) for x in [0, 1).
|
||||
static const VFPUSegment vfpu_exp2_segments[128] = {
|
||||
{ 0x07FFFE2, 0x00163DC, 0x00F, 0x7F }, { 0x080B1CF, 0x00165CC, 0x00F, 0x7F },
|
||||
{ 0x08164B4, 0x00167BC, 0x00F, 0x7F }, { 0x0821891, 0x00169B0, 0x00F, 0x7F },
|
||||
{ 0x082CD67, 0x0016BA4, 0x010, 0x7F }, { 0x0838339, 0x0016DA0, 0x010, 0x7F },
|
||||
{ 0x0843A0B, 0x0016F9C, 0x00F, 0x7F }, { 0x084F1D8, 0x001719C, 0x00F, 0x7F },
|
||||
{ 0x085AAA3, 0x001739C, 0x010, 0x7F }, { 0x0866471, 0x00175A4, 0x010, 0x7F },
|
||||
{ 0x0871F42, 0x00177A8, 0x010, 0x7F }, { 0x087DB15, 0x00179B4, 0x010, 0x7F },
|
||||
{ 0x08897EF, 0x0017BC0, 0x010, 0x7F }, { 0x08955CE, 0x0017DD0, 0x010, 0x7F },
|
||||
{ 0x08A14B5, 0x0017FE4, 0x010, 0x7F }, { 0x08AD4A6, 0x00181F8, 0x010, 0x7F },
|
||||
{ 0x08B95A0, 0x0018410, 0x011, 0x7F }, { 0x08C57AA, 0x001862C, 0x010, 0x7F },
|
||||
{ 0x08D1ABF, 0x001884C, 0x010, 0x7F }, { 0x08DDEE2, 0x0018A6C, 0x011, 0x7F },
|
||||
{ 0x08EA418, 0x0018C90, 0x011, 0x7F }, { 0x08F6A5F, 0x0018EB8, 0x011, 0x7F },
|
||||
{ 0x09031BA, 0x00190E4, 0x011, 0x7F }, { 0x090FA2B, 0x001930C, 0x011, 0x7F },
|
||||
{ 0x091C3B1, 0x0019540, 0x011, 0x7F }, { 0x0928E50, 0x0019774, 0x011, 0x7F },
|
||||
{ 0x0935A09, 0x00199A8, 0x011, 0x7F }, { 0x09426DD, 0x0019BE4, 0x011, 0x7F },
|
||||
{ 0x094F4CC, 0x0019E20, 0x012, 0x7F }, { 0x095C3DB, 0x001A05C, 0x012, 0x7F },
|
||||
{ 0x0969409, 0x001A2A0, 0x012, 0x7F }, { 0x0976559, 0x001A4E8, 0x012, 0x7F },
|
||||
{ 0x09837CC, 0x001A730, 0x012, 0x7F }, { 0x0990B64, 0x001A97C, 0x012, 0x7F },
|
||||
{ 0x099E022, 0x001ABCC, 0x012, 0x7F }, { 0x09AB607, 0x001AE20, 0x012, 0x7F },
|
||||
{ 0x09B8D16, 0x001B074, 0x012, 0x7F }, { 0x09C654F, 0x001B2D0, 0x012, 0x7F },
|
||||
{ 0x09D3EB4, 0x001B528, 0x013, 0x7F }, { 0x09E1948, 0x001B788, 0x013, 0x7F },
|
||||
{ 0x09EF50C, 0x001B9EC, 0x013, 0x7F }, { 0x09FD202, 0x001BC54, 0x013, 0x7F },
|
||||
{ 0x0A0B02B, 0x001BEBC, 0x013, 0x7F }, { 0x0A18F89, 0x001C128, 0x013, 0x7F },
|
||||
{ 0x0A2701D, 0x001C398, 0x013, 0x7F }, { 0x0A351E9, 0x001C610, 0x013, 0x7F },
|
||||
{ 0x0A434EE, 0x001C884, 0x014, 0x7F }, { 0x0A51930, 0x001CB00, 0x014, 0x7F },
|
||||
{ 0x0A5FEAF, 0x001CD7C, 0x014, 0x7F }, { 0x0A6E56D, 0x001D000, 0x014, 0x7F },
|
||||
{ 0x0A7CD6C, 0x001D284, 0x014, 0x7F }, { 0x0A8B6AD, 0x001D50C, 0x014, 0x7F },
|
||||
{ 0x0A9A133, 0x001D798, 0x014, 0x7F }, { 0x0AA8CFE, 0x001DA28, 0x014, 0x7F },
|
||||
{ 0x0AB7A12, 0x001DCBC, 0x014, 0x7F }, { 0x0AC686D, 0x001DF50, 0x015, 0x7F },
|
||||
{ 0x0AD5817, 0x001E1EC, 0x014, 0x7F }, { 0x0AE490C, 0x001E48C, 0x014, 0x7F },
|
||||
{ 0x0AF3B4F, 0x001E72C, 0x015, 0x7F }, { 0x0B02EE4, 0x001E9D0, 0x015, 0x7F },
|
||||
{ 0x0B123CC, 0x001EC78, 0x015, 0x7F }, { 0x0B21A08, 0x001EF24, 0x015, 0x7F },
|
||||
{ 0x0B3119A, 0x001F1D8, 0x015, 0x7F }, { 0x0B40A85, 0x001F488, 0x015, 0x7F },
|
||||
{ 0x0B504C9, 0x001F744, 0x015, 0x7F }, { 0x0B60068, 0x001F9FC, 0x016, 0x7F },
|
||||
{ 0x0B6FD66, 0x001FCBC, 0x016, 0x7F }, { 0x0B7FBC4, 0x001FF80, 0x016, 0x7F },
|
||||
{ 0x0B8FB83, 0x0020248, 0x016, 0x7F }, { 0x0B9FCA6, 0x0020514, 0x016, 0x7F },
|
||||
{ 0x0BAFF2F, 0x00207E0, 0x016, 0x7F }, { 0x0BC031E, 0x0020AB4, 0x016, 0x7F },
|
||||
{ 0x0BD0876, 0x0020D88, 0x017, 0x7F }, { 0x0BE0F3A, 0x0021064, 0x017, 0x7F },
|
||||
{ 0x0BF176C, 0x0021344, 0x017, 0x7F }, { 0x0C0210D, 0x0021624, 0x017, 0x7F },
|
||||
{ 0x0C12C1F, 0x002190C, 0x017, 0x7F }, { 0x0C238A4, 0x0021BF8, 0x017, 0x7F },
|
||||
{ 0x0C3469F, 0x0021EE4, 0x017, 0x7F }, { 0x0C45611, 0x00221D8, 0x017, 0x7F },
|
||||
{ 0x0C566FC, 0x00224D0, 0x017, 0x7F }, { 0x0C67961, 0x00227C8, 0x018, 0x7F },
|
||||
{ 0x0C78D47, 0x0022AC8, 0x017, 0x7F }, { 0x0C8A2A8, 0x0022DCC, 0x018, 0x7F },
|
||||
{ 0x0C9B98E, 0x00230D0, 0x018, 0x7F }, { 0x0CAD1F6, 0x00233E0, 0x018, 0x7F },
|
||||
{ 0x0CBEBE5, 0x00236F0, 0x018, 0x7F }, { 0x0CD075A, 0x0023A00, 0x019, 0x7F },
|
||||
{ 0x0CE245C, 0x0023D1C, 0x018, 0x7F }, { 0x0CF42E7, 0x0024038, 0x019, 0x7F },
|
||||
{ 0x0D06302, 0x0024358, 0x019, 0x7F }, { 0x0D184AD, 0x0024680, 0x019, 0x7F },
|
||||
{ 0x0D2A7EC, 0x00249A8, 0x019, 0x7F }, { 0x0D3CCBF, 0x0024CD4, 0x019, 0x7F },
|
||||
{ 0x0D4F329, 0x0025008, 0x019, 0x7F }, { 0x0D61B2C, 0x0025340, 0x019, 0x7F },
|
||||
{ 0x0D744C9, 0x0025678, 0x01A, 0x7F }, { 0x0D87005, 0x00259BC, 0x01A, 0x7F },
|
||||
{ 0x0D99CE2, 0x0025CFC, 0x01A, 0x7F }, { 0x0DACB60, 0x0026048, 0x01A, 0x7F },
|
||||
{ 0x0DBFB84, 0x0026394, 0x01A, 0x7F }, { 0x0DD2D4E, 0x00266E8, 0x01A, 0x7F },
|
||||
{ 0x0DE60BF, 0x0026A3C, 0x01B, 0x7F }, { 0x0DF95DD, 0x0026D98, 0x01B, 0x7F },
|
||||
{ 0x0E0CCA9, 0x00270F8, 0x01B, 0x7F }, { 0x0E20525, 0x002745C, 0x01B, 0x7F },
|
||||
{ 0x0E33F53, 0x00277C8, 0x01B, 0x7F }, { 0x0E47B37, 0x0027B34, 0x01B, 0x7F },
|
||||
{ 0x0E5B8CF, 0x0027EA8, 0x01C, 0x7F }, { 0x0E6F825, 0x0028220, 0x01B, 0x7F },
|
||||
{ 0x0E83932, 0x002859C, 0x01C, 0x7F }, { 0x0E97C00, 0x0028920, 0x01C, 0x7F },
|
||||
{ 0x0EAC08F, 0x0028CA4, 0x01C, 0x7F }, { 0x0EC06E1, 0x0029030, 0x01C, 0x7F },
|
||||
{ 0x0ED4EF8, 0x00293C0, 0x01C, 0x7F }, { 0x0EE98D6, 0x0029754, 0x01D, 0x7F },
|
||||
{ 0x0EFE480, 0x0029AF0, 0x01D, 0x7F }, { 0x0F131F7, 0x0029E8C, 0x01D, 0x7F },
|
||||
{ 0x0F2813D, 0x002A234, 0x01D, 0x7F }, { 0x0F3D256, 0x002A5DC, 0x01D, 0x7F },
|
||||
{ 0x0F52543, 0x002A988, 0x01D, 0x7F }, { 0x0F67A07, 0x002AD3C, 0x01D, 0x7F },
|
||||
{ 0x0F7D0A5, 0x002B0F8, 0x01D, 0x7F }, { 0x0F9291E, 0x002B4B4, 0x01E, 0x7F },
|
||||
{ 0x0FA8377, 0x002B874, 0x01E, 0x7F }, { 0x0FBDFB1, 0x002BC40, 0x01E, 0x7F },
|
||||
{ 0x0FD3DD0, 0x002C00C, 0x01E, 0x7F }, { 0x0FE9DD5, 0x002C3E0, 0x01E, 0x7F },
|
||||
};
|
||||
|
||||
// The squarer only sees the top 10 bits of x2, as a distance from the middle of the segment.
|
||||
static inline int32_t vfpu_square(uint32_t x2) {
|
||||
const int32_t t = abs(int32_t(x2 >> 6) - 512);
|
||||
return (t * t + 255) >> 8;
|
||||
}
|
||||
|
||||
// The untruncated result, in ulps of 2^(seg.e - 150).
|
||||
static inline int32_t vfpu_interp(const VFPUSegment &seg, uint32_t x2) {
|
||||
return seg.c0 + int32_t(((int64_t)seg.m * x2) >> 17) + ((seg.n * vfpu_square(x2)) >> 9);
|
||||
}
|
||||
|
||||
// Float bits of a result in [2^(e-127), 2^(e-126)], truncated to 22 bits. The top of that range
|
||||
// carries into the exponent, which gives exactly the next power of two.
|
||||
static inline uint32_t vfpu_interp_bits(const VFPUSegment *segments, uint32_t index) {
|
||||
const VFPUSegment &seg = segments[index >> 16];
|
||||
return ((uint32_t(seg.e - 1) << 23) + uint32_t(vfpu_interp(seg, index & 0xFFFF))) & ~3u;
|
||||
}
|
||||
|
||||
// Lookup tables.
|
||||
// Note: these are never unloaded, and stay till program termination.
|
||||
static uint32_t *vfpu_sin_lut8192=nullptr;
|
||||
@@ -1045,13 +1349,6 @@ static int8_t (*vfpu_sin_lut_delta)[2]=nullptr;
|
||||
static int16_t *vfpu_sin_lut_interval_delta=nullptr;
|
||||
static uint8_t *vfpu_sin_lut_exceptions=nullptr;
|
||||
|
||||
static int8_t (*vfpu_sqrt_lut)[2]=nullptr;
|
||||
|
||||
static int8_t (*vfpu_rsqrt_lut)[2]=nullptr;
|
||||
|
||||
static uint32_t *vfpu_exp2_lut65536=nullptr;
|
||||
static uint8_t (*vfpu_exp2_lut)[2]=nullptr;
|
||||
|
||||
static uint32_t *vfpu_log2_lut65536=nullptr;
|
||||
static uint32_t *vfpu_log2_lut65536_quadratic=nullptr;
|
||||
static uint8_t (*vfpu_log2_lut)[131072][2]=nullptr;
|
||||
@@ -1060,8 +1357,6 @@ static int32_t (*vfpu_asin_lut65536)[3]=nullptr;
|
||||
static uint64_t *vfpu_asin_lut_deltas=nullptr;
|
||||
static uint16_t *vfpu_asin_lut_indices=nullptr;
|
||||
|
||||
static int8_t (*vfpu_rcp_lut)[2]=nullptr;
|
||||
|
||||
template<typename T>
|
||||
static inline bool load_vfpu_table(T *&ptr, const char *filename, size_t expected_size) {
|
||||
#if COMMON_BIG_ENDIAN
|
||||
@@ -1226,71 +1521,7 @@ void vfpu_sincos(float a, float &s, float &c) {
|
||||
c = vfpu_cos(a);
|
||||
}
|
||||
|
||||
// Integer square root of 2^23*x (rounded to zero).
|
||||
// Input is in 2^23 <= x < 2^25, and representable in float.
|
||||
static inline uint32_t isqrt23(uint32_t x) {
|
||||
#if 0
|
||||
// Reference version.
|
||||
int dir=fesetround(FE_TOWARDZERO);
|
||||
uint32_t ret=uint32_t(int32_t(sqrtf(float(int32_t(x)) * 8388608.0f)));
|
||||
fesetround(dir);
|
||||
return ret;
|
||||
#elif 1
|
||||
// Double version.
|
||||
// Verified to produce correct result for all valid inputs,
|
||||
// in all rounding modes, both in double and double-extended (x87)
|
||||
// precision.
|
||||
// Requires correctly-rounded sqrt (which on any IEEE-754 system
|
||||
// it should be).
|
||||
return uint32_t(int32_t(sqrt(double(x) * 8388608.0)));
|
||||
#else
|
||||
// Pure integer version, if you don't like floating point.
|
||||
// Based on code from Hacker's Delight. See isqrt4 in
|
||||
// https://github.com/hcs0/Hackers-Delight/blob/master/isqrt.c.txt
|
||||
// Relatively slow.
|
||||
uint64_t t=uint64_t(x) << 23, m, y, b;
|
||||
m=0x4000000000000000ull;
|
||||
y=0;
|
||||
while(m != 0) // Do 32 times.
|
||||
{
|
||||
b=y | m;
|
||||
y=y >> 1;
|
||||
if(t >= b)
|
||||
{
|
||||
t = t - b;
|
||||
y = y | m;
|
||||
}
|
||||
m = m >> 2;
|
||||
}
|
||||
return y;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns floating-point bitpattern.
|
||||
static inline uint32_t vfpu_sqrt_fixed(uint32_t x) {
|
||||
// Endpoints of input.
|
||||
uint32_t lo =(x + 0u) & -64u;
|
||||
uint32_t hi = (x + 64u) & -64u;
|
||||
// Convert input to 9.23 fixed-point.
|
||||
lo = (lo >= 0x00400000u ? 4u * lo : 0x00800000u + 2u * lo);
|
||||
hi = (hi >= 0x00400000u ? 4u * hi : 0x00800000u + 2u * hi);
|
||||
// Estimate endpoints of output.
|
||||
uint32_t A = 0x3F000000u + isqrt23(lo);
|
||||
uint32_t B = 0x3F000000u + isqrt23(hi);
|
||||
// Apply deltas, and increase the working precision.
|
||||
uint64_t a = (uint64_t(A) << 4) + uint64_t(vfpu_sqrt_lut[x >> 6][0]);
|
||||
uint64_t b = (uint64_t(B) << 4) + uint64_t(vfpu_sqrt_lut[x >> 6][1]);
|
||||
uint32_t ret = uint32_t((a + (((b - a) * (x & 63)) >> 6)) >> 4);
|
||||
// Truncate lower 2 bits.
|
||||
ret &= -4u;
|
||||
return ret;
|
||||
}
|
||||
|
||||
float vfpu_sqrt(float x) {
|
||||
static bool loaded =
|
||||
LOAD_TABLE(vfpu_sqrt_lut, 262144);
|
||||
if (!loaded)
|
||||
return vfpu_sqrt_fallback(x);
|
||||
uint32_t bits;
|
||||
memcpy(&bits, &x, sizeof(bits));
|
||||
if((bits & 0x7FFFFFFFu) <= 0x007FFFFFu) {
|
||||
@@ -1313,72 +1544,13 @@ float vfpu_sqrt(float x) {
|
||||
int32_t exponent = int32_t(bits >> 23) - 127;
|
||||
// Bottom bit of exponent (inverted) + significand (except bottom bit).
|
||||
uint32_t index = ((bits + 0x00800000u) >> 1) & 0x007FFFFFu;
|
||||
bits = vfpu_sqrt_fixed(index);
|
||||
bits = vfpu_interp_bits(vfpu_sqrt_segments, index);
|
||||
bits += uint32_t(exponent >> 1) << 23;
|
||||
memcpy(&x, &bits, sizeof(bits));
|
||||
return x;
|
||||
}
|
||||
|
||||
// Returns floor(2^33/sqrt(x)), for 2^22 <= x < 2^24.
|
||||
static inline uint32_t rsqrt_floor22(uint32_t x) {
|
||||
#if 1
|
||||
// Verified correct in all rounding directions,
|
||||
// by exhaustive search.
|
||||
return uint32_t(8589934592.0 / sqrt(double(x))); // 0x1p33
|
||||
#else
|
||||
// Pure integer version, if you don't like floating point.
|
||||
// Based on code from Hacker's Delight. See isqrt4 in
|
||||
// https://github.com/hcs0/Hackers-Delight/blob/master/isqrt.c.txt
|
||||
// Relatively slow.
|
||||
uint64_t t=uint64_t(x) << 22, m, y, b;
|
||||
m = 0x4000000000000000ull;
|
||||
y = 0;
|
||||
while(m != 0) // Do 32 times.
|
||||
{
|
||||
b = y | m;
|
||||
y = y >> 1;
|
||||
if(t >= b)
|
||||
{
|
||||
t = t - b;
|
||||
y = y | m;
|
||||
}
|
||||
m = m >> 2;
|
||||
}
|
||||
y = (1ull << 44) / y;
|
||||
// Decrement if y > floor(2^33 / sqrt(x)).
|
||||
// This hack works because exhaustive
|
||||
// search (on [2^22;2^24]) says it does.
|
||||
if((y * y >> 3) * x > (1ull << 63) - 3ull * (((y & 7) == 6) << 21)) --y;
|
||||
return uint32_t(y);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns floating-point bitpattern.
|
||||
static inline uint32_t vfpu_rsqrt_fixed(uint32_t x) {
|
||||
// Endpoints of input.
|
||||
uint32_t lo = (x + 0u) & -64u;
|
||||
uint32_t hi = (x + 64u) & -64u;
|
||||
// Convert input to 10.22 fixed-point.
|
||||
lo = (lo >= 0x00400000u ? 2u * lo : 0x00400000u + lo);
|
||||
hi = (hi >= 0x00400000u ? 2u * hi : 0x00400000u + hi);
|
||||
// Estimate endpoints of output.
|
||||
uint32_t A = 0x3E800000u + 4u * rsqrt_floor22(lo);
|
||||
uint32_t B = 0x3E800000u + 4u * rsqrt_floor22(hi);
|
||||
// Apply deltas, and increase the working precision.
|
||||
uint64_t a = (uint64_t(A) << 4) + uint64_t(vfpu_rsqrt_lut[x >> 6][0]);
|
||||
uint64_t b = (uint64_t(B) << 4) + uint64_t(vfpu_rsqrt_lut[x >> 6][1]);
|
||||
// Evaluate via lerp.
|
||||
uint32_t ret = uint32_t((a + (((b - a) * (x & 63)) >> 6)) >> 4);
|
||||
// Truncate lower 2 bits.
|
||||
ret &= -4u;
|
||||
return ret;
|
||||
}
|
||||
|
||||
float vfpu_rsqrt(float x) {
|
||||
static bool loaded =
|
||||
LOAD_TABLE(vfpu_rsqrt_lut, 262144);
|
||||
if (!loaded)
|
||||
return vfpu_rsqrt_fallback(x);
|
||||
uint32_t bits;
|
||||
memcpy(&bits, &x, sizeof(bits));
|
||||
if((bits & 0x7FFFFFFFu) <= 0x007FFFFFu) {
|
||||
@@ -1402,7 +1574,7 @@ float vfpu_rsqrt(float x) {
|
||||
int32_t exponent = int32_t(bits >> 23) - 127;
|
||||
// Bottom bit of exponent (inverted) + significand (except bottom bit).
|
||||
uint32_t index = ((bits + 0x00800000u) >> 1) & 0x007FFFFFu;
|
||||
bits = vfpu_rsqrt_fixed(index);
|
||||
bits = vfpu_interp_bits(vfpu_rsqrt_segments, index);
|
||||
bits -= uint32_t(exponent >> 1) << 23;
|
||||
memcpy(&x, &bits, sizeof(bits));
|
||||
return x;
|
||||
@@ -1459,32 +1631,7 @@ float vfpu_asin(float x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline uint32_t vfpu_exp2_approx(uint32_t x) {
|
||||
if(x == 0x00800000u) return 0x00800000u;
|
||||
uint32_t a=vfpu_exp2_lut65536[x >> 16];
|
||||
x &= 0x0000FFFFu;
|
||||
uint32_t b = uint32_t(((2977151143ull * x) >> 23) + ((1032119999ull * (x * x)) >> 46));
|
||||
return (a + uint32_t((uint64_t(a + (1u << 23)) * uint64_t(b)) >> 32)) & -4u;
|
||||
}
|
||||
|
||||
static inline uint32_t vfpu_exp2_fixed(uint32_t x) {
|
||||
if(x == 0u) return 0u;
|
||||
if(x == 0x00800000u) return 0x00800000u;
|
||||
uint32_t A = vfpu_exp2_approx((x ) & -64u);
|
||||
uint32_t B = vfpu_exp2_approx((x + 64) & -64u);
|
||||
uint64_t a = (A<<4)+vfpu_exp2_lut[x >> 6][0]-64u;
|
||||
uint64_t b = (B<<4)+vfpu_exp2_lut[x >> 6][1]-64u;
|
||||
uint32_t y = uint32_t((a + (((b - a) * (x & 63)) >> 6)) >> 4);
|
||||
y &= -4u;
|
||||
return y;
|
||||
}
|
||||
|
||||
float vfpu_exp2(float x) {
|
||||
static bool loaded =
|
||||
LOAD_TABLE(vfpu_exp2_lut65536, 512)&&
|
||||
LOAD_TABLE(vfpu_exp2_lut, 262144);
|
||||
if (!loaded)
|
||||
return vfpu_exp2_fallback(x);
|
||||
int32_t bits;
|
||||
memcpy(&bits, &x, sizeof(bits));
|
||||
if((bits & 0x7FFFFFFF) <= 0x007FFFFF) {
|
||||
@@ -1510,7 +1657,10 @@ float vfpu_exp2(float x) {
|
||||
}
|
||||
bits = int32_t(x * 0x1p23f);
|
||||
if(x < 0.0f) --bits; // Yes, really.
|
||||
bits = int32_t(0x3F800000) + (bits & int32_t(0xFF800000)) + int32_t(vfpu_exp2_fixed(bits & int32_t(0x007FFFFF)));
|
||||
// The fraction's exp2 is in [1, 2), so its significand bits are the offset from 1.0.
|
||||
const uint32_t frac = bits & 0x007FFFFF;
|
||||
const int32_t significand = frac == 0 ? 0 : int32_t(vfpu_interp_bits(vfpu_exp2_segments, frac) - 0x3F800000u);
|
||||
bits = int32_t(0x3F800000) + (bits & int32_t(0xFF800000)) + significand;
|
||||
memcpy(&x, &bits, sizeof(bits));
|
||||
return x;
|
||||
}
|
||||
@@ -1585,15 +1735,7 @@ float vfpu_log2(float x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline uint32_t vfpu_rcp_approx(uint32_t i) {
|
||||
return 0x3E800000u + (uint32_t((1ull << 47) / ((1ull << 23) + i)) & -4u);
|
||||
}
|
||||
|
||||
float vfpu_rcp(float x) {
|
||||
static bool loaded =
|
||||
LOAD_TABLE(vfpu_rcp_lut, 262144);
|
||||
if (!loaded)
|
||||
return vfpu_rcp_fallback(x);
|
||||
uint32_t bits;
|
||||
memcpy(&bits, &x, sizeof(bits));
|
||||
uint32_t s = bits & 0x80000000u;
|
||||
@@ -1609,13 +1751,7 @@ float vfpu_rcp(float x) {
|
||||
memcpy(&x, &bits, sizeof(x));
|
||||
return x;
|
||||
}
|
||||
uint32_t A = vfpu_rcp_approx((i ) & -64u);
|
||||
uint32_t B = vfpu_rcp_approx((i + 64) & -64u);
|
||||
uint64_t a = (uint64_t(A) << 6) + uint64_t(vfpu_rcp_lut[i >> 6][0]) * 4u;
|
||||
uint64_t b = (uint64_t(B) << 6) + uint64_t(vfpu_rcp_lut[i >> 6][1]) * 4u;
|
||||
uint32_t v = uint32_t((a+(((b-a)*(i&63))>>6))>>6);
|
||||
v &= -4u;
|
||||
bits = s + (0x3F800000u - e) + v;
|
||||
bits = s + (0x3F800000u - e) + vfpu_interp_bits(vfpu_rcp_segments, i);
|
||||
memcpy(&x, &bits, sizeof(x));
|
||||
return x;
|
||||
}
|
||||
@@ -1628,17 +1764,12 @@ void InitVFPU() {
|
||||
LOAD_TABLE(vfpu_asin_lut65536 , 1536);
|
||||
LOAD_TABLE(vfpu_asin_lut_deltas , 517448);
|
||||
LOAD_TABLE(vfpu_asin_lut_indices , 798916);
|
||||
LOAD_TABLE(vfpu_exp2_lut65536 , 512);
|
||||
LOAD_TABLE(vfpu_exp2_lut , 262144);
|
||||
LOAD_TABLE(vfpu_log2_lut65536 , 516);
|
||||
LOAD_TABLE(vfpu_log2_lut65536_quadratic, 512);
|
||||
LOAD_TABLE(vfpu_log2_lut , 2097152);
|
||||
LOAD_TABLE(vfpu_rcp_lut , 262144);
|
||||
LOAD_TABLE(vfpu_rsqrt_lut , 262144);
|
||||
LOAD_TABLE(vfpu_sin_lut8192 , 4100);
|
||||
LOAD_TABLE(vfpu_sin_lut_delta , 262144);
|
||||
LOAD_TABLE(vfpu_sin_lut_exceptions , 86938);
|
||||
LOAD_TABLE(vfpu_sin_lut_interval_delta , 131074);
|
||||
LOAD_TABLE(vfpu_sqrt_lut , 262144);
|
||||
#endif
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
@E5>=HEQMYW^\ednlwdnl75::EBNJVUZYbakYbakjro97B@IIQQXV`MYV`_ggplwu>=HEQNVFLJVT\\eeljrr|zEBN:EDHIQQYYbakgpoyw�I7BAGEQMYV`_gdnlwu~l75>>CBNJVT\\dakjrr|jrr<;A@IIQQYZa_ggpoygpo95>=HEQMYW^\ednlwu~lwu::EBNJVUZYbakjrr|jrs87B@IIQRXV`_ggpoyu~l75>=HEQNVT\\ednlwr|z�<:EBNLRQYYbakjroyw�IIQ@IIPMYV`_ggplwu~}HEQNVT\JVT\\eeljrr|zEBNIQQYYbakYbakgpoywB@IINMYV`_gholwu~lwu>=HBNJVT\\eejjrr|z�NIQ@IIQQYYbbigpoywB@IEQMYV`_ggo`ednlwu>=HBNJVT\\eejjrr|z�K<B@IIQQYYb_ggpoywBAGEQMYV`_gdn_ddnlwu>>EBNJVT\\eakjrr|z�HIQQYIQQYYb_ggpoywBAGEQMYV`_gdnlwu~}HFLJVBNJVT\\dakjrr|zE@IIQQYYbbigpoyw�IIN@EEQMYV``ednlwu>=HBNJVT\\eejjrr|z�KIQQYIQQYYbbigpoywB@IEQMYV`_ggolwu~}HGMJVT\\ednjrejjrr<:ECKIQQYYbakjooywB@IIPMYV`_ggplwu~}HEQNVT\\eT\\eeljrr<:EBNIQQYYbakkqoywB@IIQMYV`_ggppuu~}HEQMYT\\ednlwu}mtr<:EBNJVQYYbakjrsxwB@IIQRXV`_ggpoyu~}HEQMYW^\ednlwu~zEBNJVT\]bakjrr||�IIQ@IIQQYZ__ggpoywB=HEQMYV`_ddnlwu>>EBNJVT\\eakjrr|zEDHIQQYYbakgpoywB@IINMYV`_gholwu~}HEQJVT\\ednlwr|zEBNJVTYYbakjrszw�IIQQYV`_ggpoyy}}HEQMYV`\ednlwu~~�NJVT\\dakjrr|z�IIQQYYbbigpoyw�IEQMYV`_ggolwu~}HGMJVT\\ednjrr|z�NLRQYYbakjroyw�IIQQXV`_ggpqwu~}HEQMYT\\ednlwu}zEBNJVT\Ybakjrr||B@IIQQYYb_ggpoywBAGEQMYV`_gdnlwu>=HFLJVT\\eeljrr<:EBNIQQYYbakkqo97B@IIQMYV`_ggpp55>=HEQOVT\\eu~~CBNJVT\\dakjrr|zE@IIQQYYbbigpoywB@IEQMYV`_ggolwu>=HGMJVT\\ednjrr<:EBNLRQYjrszw�IIQQYV`_ggpoywB=HEQMYV`_ddnlwu>>EBNJVT\\eakjrr<:EDHIQakkqoywB@IIQMYV`_ggppuu>=HEQOVT\\ednlwu::EBNJVUZYbr|zE@IIQQYYbbigpoywB@IEQMYV`_ggol75>=HGMJVT\lwuzzEBNJVUZYbakjrr<7B@IIQQYZ__ggpo97B=HV`_gdnlwu>=HGMJVT\\ednjrr<:EBNLRQYYbszwB@IIQQYV`_ggpoyy==HEQMYV`\ednl75>JVT\\eeljrr<:EBNIQQYYbakk1/97B@IV`_ggpoyy==HEQMYV`\ednl75>>CBN\eejjrr<:ECKIQQYYbakj//97B@IV`_ggpoyu>=HEQMYW^\ednl75>:ET\\eejjrr<:ECKIQQYYbakj//9IQQXV`_ggpq75>=HEQMYT\\ed.>EBNJVT\\eakj22<:EDHIQQYkqo97B@IIQMYV`_gg0055>=HV`\ednl75>>CBNJVT\\da+*2BNIQQYYbakk1/97B@IIQMYgpo95>=HEQMYW^\ed.,75>JVT\\eejj22<:ECKIQQYjrs87B@IIQRXV`_gg0/95>MYV`_ddnl75>>EBNJVT\jrr<:EBNLRQYYba+*2/9IQQYV`_gg0/99==HEQ_gdnl75>=HFLJVT\\ee,:EBNJVTYYba+*23:7BQYZa_gg0/97B@EEQMYhol75>=HEQJVT\\ed.:EBNJVUZYba+*22<7BQYYbbig0/97B@IEQM]HZTe`pj|z�QP][jYbdnn}y�VPa\kfxu~o~yKEUT\_gjwu��YHUT`_klww�QL\Xect_oj{u�RM]Wigpr}䏙GEQQY[jfvr��ZTd_o\kfxu~�LIZTe`poyz��MMYYbcqn}y�UPa\kXecto~y�QT\_kjwu�糵JHUT`aklwu��]Wictr|j{v�RM]\efvr}�VV`P][jfxr��ZTd`pj|v��MIZTednoyy�VP]\kfxr�}y�UPa_gjru��YYbcqn}jww�QL\Xecto~y��\_kjwgpr|}�UT`aklwu��\Wict_oj{v�RM]\efvr}�VV`_oj{fxr��ZTd`pj|v��Y[jfvroyy�VP]\kfxr��ZTe`poyz��MMYYbcqn}y�UPa\kjru~���eT\_kjwu��YXecqo~y��\_gjwu�|}�UT`_klww��\Xecto~y��`_kWigpr|}�UV`akj{u��]Wictr|}��`_k\efvr}�VV`_oj{v��]\egpr}��`ak[jfvr��ZTd_oj|v��Y[jfvr��d_oj{v嫑��ZTe`pj|z��][jfvr���d`pj|v��Y[jfvdnoyy�VP]\kfxr��ZTe`poyz��][jfxr���d`pj|v杮~��ZTednoyy��a\kfxu~��ZTe`poyz��][jfxr���e`pj|z���ZYbdnn}y�VPa\kfxu~��ZTednoyy��]\kfxr���e`poyz��][jfxr���d`pj|jru~��ZTednoyy�VPa\kfxu~��ZTe`poyz��][jfxr��ZTe`pj|z��][jfvr���d`pj|v��Y[jfvr��d_oj{v��Y\efvr}��`_oj{u���egpr}��`akj{u���ictr|}��`aklwu���icto~}��`_klww���ecto~y��\_kjwu���ecqo~y��\_gjwu���bcqn}y��a_gjru���bdnn}y��a\kjru~���ednoyy��]\kfxu~��ZTe`poyz��][jfxr��ZTe`pj|z��][jfvr��ZTd_oj|v�QQY[jfvr�VTdr|}��`_klww��\Xecto~}��`_kjww��\Xecqo~y�UT\_kjwu��YXecqn}y�UPa_gz��][jfxr���e`pj|z��][jfvr��ZTd_oj|v�QQY[jfvr�Vctr|}��`_klww��\Xecto~y�QT`_kjww��\Xecqo~y�ednoyy��]\kfxr��ZTe`poyz�VP][jfxr��Zgpr}��`akj{u��]Wigpr|}�UT`aklwu�Q_gjwu��YYbcqn}y�UPa_gjru��ZYbdn}��d`pj|v��Y[jfvr�ZTd_oj|v�R_klwu��\Wicto~}�QT`_kjww�NL\jru~��ZTednn}y�VPa\kfxu~�LIZfvr�VTd_oj{v�RM]\egpr}JXecto~y�QT`_kjww�NL\Xecqo~变Tednoyy�VP]\kfxr�LHZTer}�VV`_oj{u�RM]\egpr}JXecto~y�QT\_kjwu�NMYXeu~��ZTe`poyz�VP][jfxr�]\egpr}�VV`_oj{u�RM]jww��\Xecqo~y�UT\_gy�VP]\kfxr�LHZTe`poy擝V`_oj{u�RM]\egpr𨜏Xecqo~y�QT\_kjwu�N\kfxu~�LIZTe`poyzEDV_oj{v�RM]\egpr}JHUcto~y�QT\_kjww�N\kfxu~�LIZTednoyyIDV_oj{v�RQY\efvr}JWicto~}�QT`_kjwwBPa\kjru~�MIZTednoyĒTd_oj|v�RQY\efv�L\Wicto~}HIQT`_o_oo~~�][mj}x��[Vljyy��igxu��VSfaxu��ccqr���a`pm��b_mn}}𢜒�\\kj{y��le}uó�WSffvu��ects���a^tm��]_oo~~糵�][mj}x��ljyy��ZXefxv��faxu���ccqr��a`pm���mn}j}}�\\kj|y��le}uó��ffvu��eaxs���c^tr��]_oo~~��pj}j}x��jjyy��igxu���faxu��dcqr���tm�䔖�b_mn}}��kj|z��ljye}u��efxv��eaxq��ㄒq^tr�𦻗`pm���pj}}��k[jj{y��le}u��ffvu��央xcts��c^tr��剠o~~��pj}j}x��jj{y��igxu��戌vu���dcts��a^tm���oo~~��mj}j}z��ljyy��igxu��式xu��不ts���a^tm���mn}}��mj}x��ljyy视��efxv��faxu��ㄒqr���tm���m_mn}}��kj|z��ljyy��efxv��式xu��ㄒqcqr��a`pm���mn}}��kj|z��ljyy��它xv���eaxq��ccqr���pm���mn}}��kj|z��ljyy��它xv���eaxq��ccqr��a`pm���mn}}��kj|z��ljyy��ifxv��式xu��不tr���a`pm��b_mn}}��mj|z��ljyy��ifxv��faxu��不tr���tmLine truncated
|
||||
'6QO,,IE$@=&EA =91@^OtpQOtpUQvbFChdIFhgIHkX=:[[;:[[||]LqnNOopQOtpUAebFEdbFChT75YV:7[X}z[JmkOLqnNOlnN@^_@@b`DAebF3VT75YVzxXVzjHHkiLJmkOLqnN>__@@bbA@b`D0UQ63VTwuYVzw[HkiLJmiLJmkO<]]>>__@@b`DAeQ63VU53VTwuYFhgIHkiLJmkOLq]>>_]>>__@@b`D0UQ63VT75YTwuYFhgIHkiLJmkOLq]>>__@@^_@@b`DAeQ63VT75YV:8XVziLHkiLJmkOLqnNOo_@@b`D@b`DAebFChT75YV:7[X=:ZX=:[J-+OLqnNOopQOtrRAedCAebFChdIFhgI7[X=:[[<:[[<<]]>>_O/0QO40UQ60UQvsVChdIFhgIHkiLJmlJJm]=<]]>>__@@b`DAedCAeU53VT75YV:7[X=:[[<:[L1+OL1.NO/0QOtpUQvbFChfEChdIFhgIHkiLJm[<<]]><]]>>__@@b`DAedC3VT73VT75YV:7[X=:[[<<\[<.KL1.NO/0QO40UQ64TQ63VC($IFhgIHkiLJmkOJmkOLqnN>__@@b`DAebFAebFChdIFhgIHkX=:[[<<\[<<]]>>__@@b`DCb`DAeQ63VT75YV:7[X=:[X=:[[<<]]>>__@0QO40UO40UQ63VT75YV:7[Y97[X=:[[<+OL1.NO/0QQ10QO40UQ63VT75YV:5YV:7[X=)LJ-+OL1.NO/0MO/0QO40UQ63VT73VT75YV:7[X=:[J-+OL1.NL1.NO/0QO40UQ64TQ63VT75YV:7[X=:[X=:[[<+OL1.NO/0QO40UO40UQ63VT75YV:7[Y97[X=:[[<<]]>>__@>__@@b`DAebFChT75YV:5YV:7[X=:[[<<]]>>^]>>__@@b`DAebFEdbFC($IF('IH+)LJ-)LJ-+OL1.NO/0QQ10QO40UQ63VT75YV:5YV:7[X=:[[<<]]>>^]>>__@@b`DAebFEdbFChdIFhgIHkiLJmiLJ-+OL1.NO/0QO40QO40UQ63VT75YV:8XV:7[X=:[[<<]]>>^]>>__@@b`DAebFEdbFChdIFhgIH+)LJ-)LJ-+OL1.NO/0QO40QO40UQ63VT75YV:8XV:7[X=:[[<<]]>>_]>>@@" DA%"FC("FC($IF('IH+)LJ-:[[<<]]>>__@@^_@@b`DAebFC($IG&$IF('IH+)LJ-+OL1+OL1.NO/0QO40UQ6AebFChdIF('IF('IH+)LJ-+OL1.NO,.NO/0QO40UQ63VU5ChdIF('IH+)LH+)LJ-+OL1.NO/0PO/0QO40UQ63VT7ChdIF('IH+)LJ-,JJ-+OL1.NO/0QO42RO40UbFChdIG&$IF('IH+)LJ-+OL1+OL1.NO/@b`D@b`DA%"FC($IF('II''IH+)LJ-<]]=<]]>>__@@" DA%$CA%"FC($IV:7[V:7[X=:[[<<>>?>@O40UQ60UQ63VT75YV:7=:)LJ-+OL1.NO/.NO/0QO40UdCA%"FC($IF('IH+)LH+)LJ-<]]>>__?>@@" DA%"FC(3VT75YV:7[X=:=:<L1.NO/.NO/0QO40UQ6A%"FC($IF('IH+)LK))L[<<]]>>?>@@" DA%4TQ63VT75YV:7=:)LJ-+OL1.NO/.NO/@b`DA%"FA%"FC($IF(7[Y97[X=:<<>L1.NO/0QO40UQ64TbFC($IF('IH+'IH+:[[<<]]><>>@O40UO40UQ63VT75(GF('IH+)LJ-+O[<<]]>>@@" DC"0UQ63VT75YV:5'IH+)LJ-+OJ-+O]>>@@"@@" DQ63VT76VT75:H+)LK))LJ-+O]>>@>@@" DQ63VQ63VT75'IH+'IH+)LJ-+O]>>>>@@"0US30UQ63VT75(GF('IH+)LJ-<][<<>>@Q10QO40UQ63$IC($IF('IH+:[[;:<<.NO/0MO/0QO4A%"FE$"FC($IV:7[X=7=:+OL1.NL1.N_�a]�kh�ye�us]Z�fe蘖db�rp��dT{c`�rp�j�}y__�r]�kh�yua]�]Z�fh�us�tp[W�de�r`�pp�{db戬__�qm�}xc`缷a\�ok�yv�us]Z�kh�uq�rp[X�fe�rb�ppVS�db�p`�qm�{c`视__�ok�}y__�a]�kh�yua]�]Z�fe�us��[W�da�rp��VT{c_�pp�|fQ}y_`�qm�}{cOyua]�ok�yy__�]]�kh�yua]�kZ�fe�us]Z�ff𥗛db�tp[W�da�r`�rpVT{cb�pp�rmTQ}y_`�qm�}{cOyua_�ok�yy__�]]�kh�yua]�kh�fe�us]Z�ff�us��[W�da�rp[W�ie�rb�ppVT|fb�pp��TQ}{c`�qmTT{c`�q_�ojUQ}y__�om�}y__óa]�mkQOyua\�ok�yva_�]Z�kh�uua]�kh�yuaLrs]Z�fe�us]Z�fh�us]Lrp[W�ge�rp[W�fe�rp\Z�VS�db�ppYW�db�tp[W�da蕳c`�rpVT{cb�ppVT~db�pp��TQ}{c`�qmVT{c`�qpVT{c_�pp�rmTQ}y__�qmTQ}xd`�qmTN�c`�qn�kQQ}y__�ojVQ}y__�qmTQ}xc`�qm�}{c`�qm�okQN{y__�ojUQ}y__�rmTQ}y__�qm�}xd`�qm��QOyva_�okQQ}y__�omTQ}y__�qmTQ}xc`�qmTQ}{c`�qm�{c`�qp�ojUQ}y__�rmTQ}y__�qmTQ}xd`�qmTT{c`�qnXT{c`�ppVT{cb�ppVT~db�ppVW�db�rp[W�da�rp[W�ge�rp[X�fe�rp\Z�fe�ws]Z�ff�us]Z�kh�us]]�kh�uua]�kh�yua]�kk�yua\�ok�yua_�ok�{y__�oj�}y__�rmTQ}y_`�qmTQ}xd`�qmTT{c`�qnXT{c`�ppVT{db�ppVT~db�ppYW�dbMIrp[W�daOLrp[W�geOLrp[X�yua]�kh�yua]�okQOyua]�okQOyy__�okQQ}y__�omTQ}y__HFqmTQ}𩟔pYW�db�rp[W�da�rp[W�ieOLrp[X�feOLrs]Z�yua]�okQOyua]�okQOyy__�ojUQ}y__EComTQ}𩟔pVT~db�ppYW�dbMJtp[W�daOLrp[W�uqa]�khPOyua]�khSOyua]�okQOy�mTT{c`�qpVT{c`IJppVT{dbMZ�fe�us]Z�ffPOus]Z�ihPOu�kQN{y__�ojVQ}y__EFqmTQ}𩟔pVW�db�pp[W�dbMLrp[h�us]]�khPNyua]�khQ_�qmTQ}xd`�qmTN�c`IFq~da�rp[W�ieOLrp[X�fua]�kkQOyua]�okQOy�mTT{c`IFqpVT{cp[W�feOLrp\Z�feOLu�mkQOyua]�okQOyva_ET{c`�rpVT{cbMJp�feOLrs]Z�feOOu�kQOyua_�okQN{y_pVT{c_KJppVT{dp\Z�feOLus]Z�fua]�okQOyva_ECo{c`�rpVT{cbMJp�feOLrs]Z�feOOu�kQOyua_ECokQ`�qpVT{c_KJppVeOLrp\Z�feOLw�mkQOyua]GCokQ`�qnXT{c`IJp~ieOLrp[Z�feO]�kkQOyua\GQ}{c`�qmVT{cp[W�geOLrp[hPNyua]�khSOy�mTQ}xd`IFq~dbMJtp[W�deOZ�khPOuua]CQ}y__EFqmTQ}𩟔pVW�dbMIr�ihPOus]ZCAky__�ojUQ}𩟔pVT|fbMJp�feOLws]ZA@fua]�okQOyy_nXT{c`IJpp�yw坐����tq��wt��mj��rp�yw坐��酊�tq��yw��mm��rp�ywgd��酊�tq��yw坐�mm��tq�ǔjg��mj��r_�yw坐����tq��yw坏�mm��rp�苏gd��mj����yw坐����tq��wt丑枿mj��rp��wd��mj��rp�ywgf�{zjg����wt丑�{z爭�rp��wt��yj��mm��tq�𡀞jg��mm��ts�{zjh��mj��r_�ywgd��mj��a_�yx丑�{z爭�rp��wt丑�{z爭�rp��wq��yw��mm��tq��yw��mm��qp��wt丑枿mj��rp��wt丑�yj��mm��tq��yg��mm��tq��wt��mj��rp��wt丑�{j��rp��tq��yw坐����tq��yt丑�{zjg�rp\\�wtda�{zjg�}mj�rqa_�ywgd��mj��rp��gf�{zjg��mm��tq��yx��mm��rp��wtda�{zjg��m\�tqa_�ywgd��mj��rp��tq�{zjg��mm��tqa_�yxda�{zjg��m\�wtda�{zjg��ij��rp��wt丑�{zjh��\]�tqa_�ywgd��mj��rp��tq��ywgd��mY�tqa_�wtda�{zjg��mm��tqa_�wtda�{zjg��mm��rp��wd��Line truncated
|
||||
<,>7)$DF32$!TBR.=- 97)8''RD13 1 NN>-=,
|
||||
FG77$%RB/@1/
;-=(*GE74$$RAT,?-:I97)$TD42$1!R.=,,JG86&'RB/1=M;,>*7F34$$T@.,?-::)8'$TD43 1! >.=,(IG86&%#RB//LJ<,>*DF34$!TAT.=-:I88'$RB21 >M;-=( GE74%$RAT@.-KI97)$RD13 PW�}lqhY��ym}ne[��vm|laB�}o}k[��zn}qhW��ym}neD��vm|[��}o}siZ��zn}pgW��wl~neD�𢘫m|laD�}o}siX��zn}pfV��wl~mc[�忛~l}laW�|o}siXi^�{n}pfVj[�wl~mcX�酧~l}[hW��婨iXi^��𢖯fVj[��~o}XgX��zn}WgF��wl~mcD�忛~l}WjW�|lsiXi^�忛}pfVj[��}mcXgX��z[hWgW��wl~^TD�忛~m|laW�|o}siXi^�忛}pfVj[��}mcXgZ��zn}pgWLB�wl~ne[dA𢘫m|laWhW�𠏋iXi^TC��vm|\SB�}o}si[hW�zn}qhYh\��}n~[dZOC�|lqhYhA�ym}ne[d[��|lcXgX��ym}pfVjC�xl~mcXgX�𠑥}[hWgF��wl~mc[dA忛~l}WjWhW��wm}^TD��vm|laWhW亣}siXiViC��vm|laBTH}o}k[hWgC��vl~\SBTB萏~l}[hWgF��wYh\TD�忛~l}WjWhW�婨iXi^TDSA𢘫m|laWhW�𠏋iXi^TCTC�vm|laXgX��y[hWgCTC�vl~mcXgX��{n}WgCTB�wl~mcXgXPC�zn}pfYh\�wl~ne[dZOC�zlqhYh\SB�忛e[dZODRF|lqhYh^TD�忛~l}WjWhW�𠏋iXi^TDSA�vm|laWhWLA�ym}ne[d[QD�|laXgXNA�ym}pfVj[QD�|o}siXi^TD��vm|laWhH}o}siXiWgCTC�vm|lcXgXNA�yn}pfVj[QD�}o}siXi^TC��vm|laBTH}o}si[hWgCTC�vl~mcXgXNA�{n}pfVj[QBTH}o}siXiViCTC�vm|lcXgXNA�ym}pfVj[QD�~o}siXi^TD��vm|laWhXNA�ym}neVj[QD�|lsiXi^TD��vm|laWhWLA�ym}ne[d[QD�|lqhXi^TD�忛~m|laWhWLB�ym}ne[dZOD�|lqhYh\TDSA忛~l}WjWhWLB�wl~ne[dZOCRD}lqhYh\SBTA忛~l}[hWgWLBRBwl~mcsi[hWgCTC�vl~mcXgXNA�{n}pfVj[QBTH}o}siXiViCTCP@vm|lcXgXN^TDSA忛~m|laWhWLB�ym}ne[dZODRF|lqhYh^TDSZOC�zn}pgYh\SBTH}n~l}[hWgCTCPBwl~mcsiXiViCTC�vm|laXgXNATCym}pfVj[QDRWLB�ym}ne[dZODRF|lqhYh\TXgZOC�zn}pgYh\SBTH=/}l}[hWgVj[QDRH}o}siXi^TCTCP@vm|lqhYh^TDSA忛~l}laWhWLBRBTH}n~l}[hWgCTBRBwl~mcsiXiViCTCP@vm|lcXgXN^TDSA忛~m|laWhWLBRC9A忛~l}[hWgFSBRBwl~mcsi[hWgCTCP@vm|mcXgXi^TDSAS@vm|laWhYh\SDSA忛~l}[hWgWL\SBTH}o}k[hWgCTCPDRF|o}siXi^TDSZODRF|lqhYh\TDSZOCREzn}pgYh\SBTXNATCyn}pfVj[QWhWLBRCym}ne[dYQWgWLBRBwl~mc[d[hWgCTCP@vl~mcsiXi^TDSAS@vm|lqhYh\TDSASCREzn}pfYh\SBTXNATCym}pfVjlaWhWLBRC9-}n~l}[hWgFSBRB7H}o}si[hWgCT[QDRF<,sim}ne[dZOCRD=C�wl~mcXgXPViCTCP@vm|laqhXi^TDSAS.>Ezn}qhYh\SXgXNATE:.}pfm|laWhWNATDSAS.~l}WjWhYh\SBTH=/=Cyn}pfVj[QWhWLBRC9-}n~l}[hWgWL\SBTH=/}sim}nfVj[QDRWLBRBwm}nel}[hWgCTBRBTH=/}siXine[d[QDRF<BRBwl~ne[d[hWgCTCPDRF>/}siXine[dZODRFSBRBwl~mcsi[hWgCT[QDRF<,sim}ne[dZOC䕑~n~n}l~VjWhWeVfC��}p~n~ZiXiVjWhWeC���}k{YjZiXiVjBTCRC�蓞|l{k{YjZiBUFSBTC�都}m|l{k{YjXTBUFSB�侊}m}m|l{k{VhXTBUFSB琷o}m}m|l{WgVhXTBUF㺸mo}m}m|XgWgVhXTBUB~omo}m}YhXgWgVhXTBUB~omo}m}YhXgWgVhXTBUB~omo}m}YhXgWgVhXTBUAA/mo}m}m|[dWgVhXTBUFS/mo}m}m|l{WgVhXTBUFS/mo}m}m|l{WgVhXTBUFSDSC侊}m}m|l{k~ZjXTBUFSDSCRB𠍿}m|l{k~ZjZiXiFSDSCRBRB�𨧣{k~ZjZi[hVjWhCRBRBOAP@}nn~Zi[hVjWhViVfWSAP@=.n~ll~l}lyViVfWSFTCTBTAT,l~l}lymiXjWjYhCTBTATASAQA�p~XjWjYh[dWgWeVcAQAA/?0~o}n}m|l{k~WeVcBUFSDSCRBRBOA邮{k~ZjZi[hVjXgViBRBOAP@>.n~ll~l}XgViVhWSFTCTBTATCPA𡡣}lymiYjWjYh[dWgWeVcAQAL/?0>/}n}m|kk~ZjVcBUAUDSDRBRBOAP@>.mZi[hVjXgViVhWSFTCTBTATCP-=,}lymiYjWjXi[dWgWeVcBUAL1?0>/=.}m|kk~lhZi[hVjXgViBRBOAP@>.?-?,m}l}lymiYjWjFTCTBTATCPAQAL1?0>/}n}m|kk~lhXj[hAUDSDRBRASAP@>.?-?,m}l}l{miYjWjXi[dBTATCPAQAL1?0>.>.=-|kk~lhXj[hYhXgViVhWTFTB>.?-?,?-=,=,{k{YjWjXi[dWhWeVfCUAUDSDRBRASAPB>.?-?,m}l}l{ViVhWTFTFSBTCRCPAQAL1?0>.>.=,>+k~lhXj[hYhXgWgVhWTFTFSBTCRCPBOAL1?0>.>.=,~klylhXj[hYhXgWgVhWTFTFSBTCRCPBOAL1?0>.>.}l~klylhXj[hYhXgWgVhXTFTFSBTCRCPBOAL@=0>.>.=,~klyliXj[hYhXgWgVhXTFTFSBTCRCPBOAL@=0>.>.=,>+?,yliXj[hYhXgWgVhXTBUFSBTCRCPBOAL@=.?.>.=,>+?,9,)**hl{k{YjZiXiVjWhViVfCUAUCTDRATASAQB>/?-?/=-=-<,;+>*))jWhliXjWjYhXgWgVhXTBUFSDSCRCPBOAL@=.?.>,?,>+?/?-?/=-=-<,;+>jZiXiVjWhViVfWSAUCTDRVhXTBUFSDSCRBRBOAL@=.?.>,?,>,=,9,)/=-=-<,;+>*)iVjWhViVfWSYh[dWgWeXTBUFSDSCRBRBOAL@=.?ATASAQAA/?0>/=-=-<,;+>*,?,>,=,9-)**(dWgWeXT[hVjWhViVfWSFTCTBTATASBUFSDSCRBRBOAP@=.?.>ASAQAA/?0>/=.=-<,;+>.>,?,>,=,9-)**($+>*)(*gViVfWSYh[dWgWeVcBUAUDSViVfWSFTCTBTATCPAQAUDSCRBRBOAP@>.?-?CPAQAA/?0>/=.=AP@>.?-?,?,>,=,90>/=.=-<+?+>*),>,=,9-)**)+?+>,()(*')**)$'%#(*'iVhWTFT[dWgWeVcBUAUDSViVhWTFTCTBTWeVcBUAUDSDRBRWTFTCTBTATCPBUAUDSDRBRASFTCTBTATCPAQALDSDRBRASAP@>BTATCPAQALDSDRBRASAP@>BTATCPAQAL1?DRBRASAP@>.?ATCPAQAL1?0>BRASAPB>.?ATCPAQAL1?0>BRASAPB>.?CRCPAQAL1?0>BRASAPB>.?CRCPAQAL1?DRBRASAPB>BTCRCPAQALDSDRBRASAPFSBTCRCPAQAUDSDRBRASFTFSBTCRCPCUAUDSDRBRWTFTFSBTCRVfCUAUDSD((%&''()$(%&((''*))$(,(*(hl}ZjUuk~l~UuUul{n}nk{l}o}qlym}mk�k�lnk��n~qk���k�k���k�����������������������������筍��jUul{m}Uukkl}lok~l~muk�n}nk���qk����k���������������������筍�hZjUulyl~mUukn}nk��o}qk����k��������������������jUuk{m|o}Uulym}mk�k�lnk����k�����������������jUulyl~UuUukn}nk��o}qk������������������ulyl~UuUukn}nk���qk����������������iZjUuk~l~n~uk�n}p~k����������������jZiUukkklok��n~uk�������������jUuk{m|o}qlym}mk�k�������������jUuk~l~n~Uul{n}p~k�����������Line truncated
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in new issue
Block a user