From b0224485aaecd0f98f61c0c77663ecba14302687 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 3 May 2016 05:38:36 -0400 Subject: Fix placement of alignas - fixes Mac OS X build --- Alc/mixer_sse3.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 7085c537..1b946461 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -36,8 +36,8 @@ const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfl { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - alignas(16) union { ALuint i[4]; float f[4]; } pos_; - alignas(16) union { ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALuint pos; ALuint i; @@ -100,8 +100,8 @@ const ALfloat *Resample_fir8_32_SSE3(const BsincState* UNUSED(state), const ALfl { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - alignas(16) union { ALuint i[4]; float f[4]; } pos_; - alignas(16) union { ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALuint pos; ALuint i, j; -- cgit v1.2.3 From 76cd6797b7e58272e4e5268f1461f209045b9de4 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 6 Oct 2016 01:39:18 -0700 Subject: Add some more 'restrict' keywords --- Alc/mixer.c | 2 +- Alc/mixer_c.c | 17 +++++++++-------- Alc/mixer_defs.h | 46 ++++++++++++++++++++++++++-------------------- Alc/mixer_sse.c | 5 +++-- Alc/mixer_sse2.c | 5 +++-- Alc/mixer_sse3.c | 10 ++++++---- Alc/mixer_sse41.c | 15 +++++++++------ OpenAL32/Include/alu.h | 2 +- 8 files changed, 58 insertions(+), 44 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/mixer.c b/Alc/mixer.c index a0132e0f..b1f79d05 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -41,7 +41,7 @@ static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); -extern inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *frac_arr, ALuint *pos_arr, ALuint size); +extern inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *restrict frac_arr, ALuint *restrict pos_arr, ALuint size); alignas(16) union ResamplerCoeffs ResampleCoeffs; diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index a75ad002..6ef818c7 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -8,17 +8,17 @@ #include "alAuxEffectSlot.h" -static inline ALfloat point32(const ALfloat *vals, ALuint UNUSED(frac)) +static inline ALfloat point32(const ALfloat *restrict vals, ALuint UNUSED(frac)) { return vals[0]; } -static inline ALfloat lerp32(const ALfloat *vals, ALuint frac) +static inline ALfloat lerp32(const ALfloat *restrict vals, ALuint frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat fir4_32(const ALfloat *vals, ALuint frac) +static inline ALfloat fir4_32(const ALfloat *restrict vals, ALuint frac) { return resample_fir4(vals[-1], vals[0], vals[1], vals[2], frac); } -static inline ALfloat fir8_32(const ALfloat *vals, ALuint frac) +static inline ALfloat fir8_32(const ALfloat *restrict vals, ALuint frac) { return resample_fir8(vals[-3], vals[-2], vals[-1], vals[0], vals[1], vals[2], vals[3], vals[4], frac); } -const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), const ALfloat *src, ALuint UNUSED(frac), +const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), const ALfloat *restrict src, ALuint UNUSED(frac), ALuint UNUSED(increment), ALfloat *restrict dst, ALuint numsamples) { #if defined(HAVE_SSE) || defined(HAVE_NEON) @@ -32,7 +32,7 @@ const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), const ALfloat #define DECL_TEMPLATE(Sampler) \ const ALfloat *Resample_##Sampler##_C(const BsincState* UNUSED(state), \ - const ALfloat *src, ALuint frac, ALuint increment, \ + const ALfloat *restrict src, ALuint frac, ALuint increment, \ ALfloat *restrict dst, ALuint numsamples) \ { \ ALuint i; \ @@ -54,8 +54,9 @@ DECL_TEMPLATE(fir8_32) #undef DECL_TEMPLATE -const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *src, ALuint frac, - ALuint increment, ALfloat *restrict dst, ALuint dstlen) +const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint dstlen) { const ALfloat *fil, *scd, *phd, *spd; const ALfloat sf = state->sf; diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index df449197..24916002 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -12,12 +12,12 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_point32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_lerp32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_fir4_32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_fir8_32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_copy32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_point32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_lerp32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_fir4_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_fir8_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); /* C mixers */ @@ -53,7 +53,7 @@ void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, ALuint InPos, ALuint BufferSize); /* SSE resamplers */ -inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *frac_arr, ALuint *pos_arr, ALuint size) +inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *restrict frac_arr, ALuint *restrict pos_arr, ALuint size) { ALuint i; @@ -67,23 +67,29 @@ inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *frac_a } } -const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *src, ALuint frac, +const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_lerp32_SSE2(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); -const ALfloat *Resample_lerp32_SSE41(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); +const ALfloat *Resample_lerp32_SSE2(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); +const ALfloat *Resample_lerp32_SSE41(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); -const ALfloat *Resample_fir4_32_SSE3(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); -const ALfloat *Resample_fir4_32_SSE41(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); +const ALfloat *Resample_fir4_32_SSE3(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); +const ALfloat *Resample_fir4_32_SSE41(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); -const ALfloat *Resample_fir8_32_SSE3(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); -const ALfloat *Resample_fir8_32_SSE41(const BsincState *state, const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples); +const ALfloat *Resample_fir8_32_SSE3(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); +const ALfloat *Resample_fir8_32_SSE41(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples); /* Neon mixers */ void MixHrtf_Neon(ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALuint lidx, ALuint ridx, diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index 6d18a638..f5e21e23 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -12,8 +12,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *src, ALuint frac, - ALuint increment, ALfloat *restrict dst, ALuint dstlen) +const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint dstlen) { const __m128 sf4 = _mm_set1_ps(state->sf); const ALuint m = state->m; diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c index 004dba9e..22a18ef3 100644 --- a/Alc/mixer_sse2.c +++ b/Alc/mixer_sse2.c @@ -27,8 +27,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE2(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_lerp32_SSE2(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 1b946461..66005e53 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -31,8 +31,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); @@ -95,8 +96,9 @@ const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_fir8_32_SSE3(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_fir8_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index ed49447d..7a4db6cf 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -28,8 +28,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); @@ -84,8 +85,9 @@ const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); @@ -151,8 +153,9 @@ const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALf return dst; } -const ALfloat *Resample_fir8_32_SSE41(const BsincState* UNUSED(state), const ALfloat *src, ALuint frac, ALuint increment, - ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_fir8_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, + ALuint frac, ALuint increment, ALfloat *restrict dst, + ALuint numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 09c8c238..ae8645fa 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -149,7 +149,7 @@ typedef struct SendParams { typedef const ALfloat* (*ResamplerFunc)(const BsincState *state, - const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen + const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen ); typedef void (*MixerFunc)(const ALfloat *data, ALuint OutChans, -- cgit v1.2.3 From 325a49975a762744638b56b6a7ddd2ccd40fda55 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 16 Jan 2017 08:54:30 -0800 Subject: Use ALsizei and ALint for sizes and offsets with resamplers and filters --- Alc/mixer.c | 2 +- Alc/mixer_c.c | 24 +++++++++++------------ Alc/mixer_defs.h | 47 +++++++++++++++++++++++---------------------- Alc/mixer_sse.c | 9 ++++----- Alc/mixer_sse2.c | 10 +++++----- Alc/mixer_sse3.c | 20 +++++++++---------- Alc/mixer_sse41.c | 30 ++++++++++++++--------------- OpenAL32/Include/alFilter.h | 4 ++-- OpenAL32/Include/alu.h | 3 ++- OpenAL32/alFilter.c | 2 +- 10 files changed, 76 insertions(+), 75 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/mixer.c b/Alc/mixer.c index cfb975f4..e759482e 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -41,7 +41,7 @@ static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); -extern inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *restrict frac_arr, ALuint *restrict pos_arr, ALuint size); +extern inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); alignas(16) union ResamplerCoeffs ResampleCoeffs; diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 8ddd07f3..15c603ca 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -18,8 +18,9 @@ static inline ALfloat fir8_32(const ALfloat *restrict vals, ALuint frac) { return resample_fir8(vals[-3], vals[-2], vals[-1], vals[0], vals[1], vals[2], vals[3], vals[4], frac); } -const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), const ALfloat *restrict src, ALuint UNUSED(frac), - ALuint UNUSED(increment), ALfloat *restrict dst, ALuint numsamples) +const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), + const ALfloat *restrict src, ALuint UNUSED(frac), ALint UNUSED(increment), + ALfloat *restrict dst, ALsizei numsamples) { #if defined(HAVE_SSE) || defined(HAVE_NEON) /* Avoid copying the source data if it's aligned like the destination. */ @@ -32,10 +33,10 @@ const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), const ALfloat #define DECL_TEMPLATE(Sampler) \ const ALfloat *Resample_##Sampler##_C(const BsincState* UNUSED(state), \ - const ALfloat *restrict src, ALuint frac, ALuint increment, \ - ALfloat *restrict dst, ALuint numsamples) \ + const ALfloat *restrict src, ALuint frac, ALint increment, \ + ALfloat *restrict dst, ALsizei numsamples) \ { \ - ALuint i; \ + ALsizei i; \ for(i = 0;i < numsamples;i++) \ { \ dst[i] = Sampler(src, frac); \ @@ -55,16 +56,15 @@ DECL_TEMPLATE(fir8_32) #undef DECL_TEMPLATE const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint dstlen) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) { const ALfloat *fil, *scd, *phd, *spd; const ALfloat sf = state->sf; - const ALuint m = state->m; + const ALsizei m = state->m; const ALint l = state->l; - ALuint j_f, pi, i; + ALsizei j_s, j_f, pi, i; ALfloat pf, r; - ALint j_s; for(i = 0;i < dstlen;i++) { @@ -94,9 +94,9 @@ const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restri } -void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALuint numsamples) +void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) { - ALuint i; + ALsizei i; if(numsamples > 1) { dst[0] = filter->b0 * src[0] + diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index 318df626..6d2b3c04 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -12,12 +12,12 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_point32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_lerp32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_fir4_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_fir8_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); -const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_copy32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir4_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir8_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* C mixers */ @@ -53,43 +53,44 @@ void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* SSE resamplers */ -inline void InitiatePositionArrays(ALuint frac, ALuint increment, ALuint *restrict frac_arr, ALuint *restrict pos_arr, ALuint size) +inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) { - ALuint i; + ALsizei i; pos_arr[0] = 0; frac_arr[0] = frac; for(i = 1;i < size;i++) { - ALuint frac_tmp = frac_arr[i-1] + increment; + ALint frac_tmp = frac_arr[i-1] + increment; pos_arr[i] = pos_arr[i-1] + (frac_tmp>>FRACTIONBITS); frac_arr[i] = frac_tmp&FRACTIONMASK; } } -const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, ALuint frac, - ALuint increment, ALfloat *restrict dst, ALuint dstlen); +const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); const ALfloat *Resample_lerp32_SSE2(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); const ALfloat *Resample_lerp32_SSE41(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); const ALfloat *Resample_fir4_32_SSE3(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); const ALfloat *Resample_fir4_32_SSE41(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); const ALfloat *Resample_fir8_32_SSE3(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); const ALfloat *Resample_fir8_32_SSE41(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples); + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); /* Neon mixers */ void MixHrtf_Neon(ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei lidx, ALsizei ridx, diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index bad08e2d..96228b47 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -13,16 +13,15 @@ const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint dstlen) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) { const __m128 sf4 = _mm_set1_ps(state->sf); - const ALuint m = state->m; + const ALsizei m = state->m; const ALint l = state->l; const ALfloat *fil, *scd, *phd, *spd; - ALuint pi, j_f, i; + ALsizei j_s, pi, j_f, i; ALfloat pf; - ALint j_s; __m128 r4; for(i = 0;i < dstlen;i++) diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c index 22a18ef3..5cf4c8a0 100644 --- a/Alc/mixer_sse2.c +++ b/Alc/mixer_sse2.c @@ -28,17 +28,17 @@ const ALfloat *Resample_lerp32_SSE2(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i; + ALint pos; + ALsizei i; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 66005e53..34121d71 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -32,16 +32,16 @@ const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i; + ALint pos; + ALsizei i; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); @@ -97,16 +97,16 @@ const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfl } const ALfloat *Resample_fir8_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i, j; + ALsizei i, j; + ALint pos; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 7a4db6cf..a531ca77 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -29,17 +29,17 @@ const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i; + ALint pos; + ALsizei i; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); @@ -86,16 +86,16 @@ const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfl } const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i; + ALint pos; + ALsizei i; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); @@ -154,16 +154,16 @@ const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALf } const ALfloat *Resample_fir8_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALuint increment, ALfloat *restrict dst, - ALuint numsamples) + ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALuint i[4]; float f[4]; } pos_; + union { alignas(16) ALint i[4]; float f[4]; } pos_; union { alignas(16) ALuint i[4]; float f[4]; } frac_; __m128i frac4, pos4; - ALuint pos; - ALuint i, j; + ALsizei i, j; + ALint pos; InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); diff --git a/OpenAL32/Include/alFilter.h b/OpenAL32/Include/alFilter.h index bec4d46b..019e40d3 100644 --- a/OpenAL32/Include/alFilter.h +++ b/OpenAL32/Include/alFilter.h @@ -77,9 +77,9 @@ inline void ALfilterState_clear(ALfilterState *filter) void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat gain, ALfloat freq_mult, ALfloat rcpQ); -void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALuint numsamples); +void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples); -inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALuint numsamples) +inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALsizei numsamples) { if(numsamples >= 2) { diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index cd2170cf..4a424246 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -149,7 +149,8 @@ typedef struct SendParams { typedef const ALfloat* (*ResamplerFunc)(const BsincState *state, - const ALfloat *restrict src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei dstlen ); typedef void (*MixerFunc)(const ALfloat *data, ALsizei OutChans, diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c index c675d344..150d84b5 100644 --- a/OpenAL32/alFilter.c +++ b/OpenAL32/alFilter.c @@ -36,7 +36,7 @@ extern inline void UnlockFiltersWrite(ALCdevice *device); extern inline struct ALfilter *LookupFilter(ALCdevice *device, ALuint id); extern inline struct ALfilter *RemoveFilter(ALCdevice *device, ALuint id); extern inline void ALfilterState_clear(ALfilterState *filter); -extern inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALuint numsamples); +extern inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALsizei numsamples); extern inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope); extern inline ALfloat calc_rcpQ_from_bandwidth(ALfloat freq_mult, ALfloat bandwidth); -- cgit v1.2.3 From 0324712540f88d18f1fa8f18f7a72da06af00d75 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 13 Feb 2017 11:29:32 -0800 Subject: Put BsincState in a generic union --- Alc/ALu.c | 4 ++-- Alc/mixer.c | 2 +- Alc/mixer_c.c | 20 ++++++++++---------- Alc/mixer_defs.h | 34 +++++++++++++++++----------------- Alc/mixer_neon.c | 38 +++++++++++++++++++------------------- Alc/mixer_sse.c | 16 ++++++++-------- Alc/mixer_sse2.c | 6 +++--- Alc/mixer_sse3.c | 12 ++++++------ Alc/mixer_sse41.c | 18 +++++++++--------- OpenAL32/Include/alSource.h | 2 +- OpenAL32/Include/alu.h | 6 +++++- 11 files changed, 81 insertions(+), 77 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/ALu.c b/Alc/ALu.c index 29097c2a..42f229a2 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -433,7 +433,7 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALsourceProps * voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->SincState); + BsincPrepare(voice->Step, &voice->ResampleState.bsinc); /* Calculate gains */ DryGain = clampf(SourceVolume, MinVolume, MaxVolume); @@ -1115,7 +1115,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALsourceProps *pro voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->SincState); + BsincPrepare(voice->Step, &voice->ResampleState.bsinc); if(Device->Render_Mode == HrtfRender) { diff --git a/Alc/mixer.c b/Alc/mixer.c index 5442954e..592d51d4 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -564,7 +564,7 @@ void MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei Samp ); /* Now resample, then filter and mix to the appropriate outputs. */ - ResampledData = Resample(&voice->SincState, + ResampledData = Resample(&voice->ResampleState, &SrcData[MAX_PRE_SAMPLES], DataPosFrac, increment, Device->ResampledData, DstBufferSize ); diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 1284371b..323f1363 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -18,7 +18,7 @@ static inline ALfloat fir8_32(const ALfloat *restrict vals, ALuint frac) { return resample_fir8(vals[-3], vals[-2], vals[-1], vals[0], vals[1], vals[2], vals[3], vals[4], frac); } -const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), +const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), const ALfloat *restrict src, ALuint UNUSED(frac), ALint UNUSED(increment), ALfloat *restrict dst, ALsizei numsamples) { @@ -32,7 +32,7 @@ const ALfloat *Resample_copy32_C(const BsincState* UNUSED(state), } #define DECL_TEMPLATE(Sampler) \ -const ALfloat *Resample_##Sampler##_C(const BsincState* UNUSED(state), \ +const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ const ALfloat *restrict src, ALuint frac, ALint increment, \ ALfloat *restrict dst, ALsizei numsamples) \ { \ @@ -55,17 +55,17 @@ DECL_TEMPLATE(fir8_32) #undef DECL_TEMPLATE -const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { const ALfloat *fil, *scd, *phd, *spd; - const ALfloat sf = state->sf; - const ALsizei m = state->m; + const ALfloat sf = state->bsinc.sf; + const ALsizei m = state->bsinc.m; ALsizei j_f, pi, i; ALfloat pf, r; - src += state->l; + src += state->bsinc.l; for(i = 0;i < dstlen;i++) { // Calculate the phase index and factor. @@ -74,10 +74,10 @@ const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restri pf = (frac & ((1<coeffs[pi].filter; - scd = state->coeffs[pi].scDelta; - phd = state->coeffs[pi].phDelta; - spd = state->coeffs[pi].spDelta; + fil = ASSUME_ALIGNED(state->bsinc.coeffs[pi].filter, 16); + scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); + phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); + spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); // Apply the scale and phase interpolated filter. r = 0.0f; diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index 4bafc839..60735c9f 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -12,12 +12,12 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir4_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir8_32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc32_C(const BsincState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir8_32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* C mixers */ @@ -67,28 +67,28 @@ inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restric } } -const ALfloat *Resample_lerp32_SSE2(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_lerp32_SSE2(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_lerp32_SSE41(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_lerp32_SSE41(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE3(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir4_32_SSE3(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE41(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir4_32_SSE41(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir8_32_SSE3(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir8_32_SSE3(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir8_32_SSE41(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir8_32_SSE41(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); @@ -109,16 +109,16 @@ void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* Neon resamplers */ -const ALfloat *Resample_lerp32_Neon(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_lerp32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir4_32_Neon(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir4_32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir8_32_Neon(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_fir8_32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_bsinc32_Neon(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 533817ff..543ff0f3 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -10,9 +10,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_Neon(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const int32x4_t increment4 = vdupq_n_s32(increment*4); const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); @@ -66,9 +66,9 @@ const ALfloat *Resample_lerp32_Neon(const BsincState* UNUSED(state), const ALflo return dst; } -const ALfloat *Resample_fir4_32_Neon(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const int32x4_t increment4 = vdupq_n_s32(increment*4); const uint32x4_t fracMask4 = vdupq_n_u32(FRACTIONMASK); @@ -136,9 +136,9 @@ const ALfloat *Resample_fir4_32_Neon(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_fir8_32_Neon(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir8_32_Neon(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const int32x4_t increment4 = vdupq_n_s32(increment*4); const uint32x4_t fracMask4 = vdupq_n_u32(FRACTIONMASK); @@ -211,18 +211,18 @@ const ALfloat *Resample_fir8_32_Neon(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_bsinc32_Neon(const BsincState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) +const ALfloat *Resample_bsinc32_Neon(const InterpState *state, + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei dstlen) { - const float32x4_t sf4 = vdupq_n_f32(state->sf); - const ALsizei m = state->m; + const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); + const ALsizei m = state->bsinc.m; const ALfloat *fil, *scd, *phd, *spd; ALsizei pi, i, j; float32x4_t r4; ALfloat pf; - src += state->l; + src += state->bsinc.l; for(i = 0;i < dstlen;i++) { // Calculate the phase index and factor. @@ -231,10 +231,10 @@ const ALfloat *Resample_bsinc32_Neon(const BsincState *state, const ALfloat *res pf = (frac & ((1<coeffs[pi].filter, 16); - scd = ASSUME_ALIGNED(state->coeffs[pi].scDelta, 16); - phd = ASSUME_ALIGNED(state->coeffs[pi].phDelta, 16); - spd = ASSUME_ALIGNED(state->coeffs[pi].spDelta, 16); + fil = ASSUME_ALIGNED(state->bsinc.coeffs[pi].filter, 16); + scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); + phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); + spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); // Apply the scale and phase interpolated filter. r4 = vdupq_n_f32(0.0f); diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index 8aeb8211..7870a6d8 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -12,18 +12,18 @@ #include "mixer_defs.h" -const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *restrict src, +const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { - const __m128 sf4 = _mm_set1_ps(state->sf); - const ALsizei m = state->m; + const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); + const ALsizei m = state->bsinc.m; const ALfloat *fil, *scd, *phd, *spd; ALsizei pi, i, j; ALfloat pf; __m128 r4; - src += state->l; + src += state->bsinc.l; for(i = 0;i < dstlen;i++) { // Calculate the phase index and factor. @@ -32,10 +32,10 @@ const ALfloat *Resample_bsinc32_SSE(const BsincState *state, const ALfloat *rest pf = (frac & ((1<coeffs[pi].filter, 16); - scd = ASSUME_ALIGNED(state->coeffs[pi].scDelta, 16); - phd = ASSUME_ALIGNED(state->coeffs[pi].phDelta, 16); - spd = ASSUME_ALIGNED(state->coeffs[pi].spDelta, 16); + fil = ASSUME_ALIGNED(state->bsinc.coeffs[pi].filter, 16); + scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); + phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); + spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); // Apply the scale and phase interpolated filter. r4 = _mm_setzero_ps(); diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c index 5cf4c8a0..a1e8507e 100644 --- a/Alc/mixer_sse2.c +++ b/Alc/mixer_sse2.c @@ -27,9 +27,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE2(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_lerp32_SSE2(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 34121d71..3b444158 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -31,9 +31,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); @@ -96,9 +96,9 @@ const ALfloat *Resample_fir4_32_SSE3(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_fir8_32_SSE3(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir8_32_SSE3(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index a531ca77..7ae5bec7 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -28,9 +28,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); @@ -85,9 +85,9 @@ const ALfloat *Resample_lerp32_SSE41(const BsincState* UNUSED(state), const ALfl return dst; } -const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); @@ -153,9 +153,9 @@ const ALfloat *Resample_fir4_32_SSE41(const BsincState* UNUSED(state), const ALf return dst; } -const ALfloat *Resample_fir8_32_SSE41(const BsincState* UNUSED(state), const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) +const ALfloat *Resample_fir8_32_SSE41(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALuint frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h index 4f04efe2..3111a48a 100644 --- a/OpenAL32/Include/alSource.h +++ b/OpenAL32/Include/alSource.h @@ -92,7 +92,7 @@ typedef struct ALvoice { alignas(16) ALfloat PrevSamples[MAX_INPUT_CHANNELS][MAX_PRE_SAMPLES]; - BsincState SincState; + InterpState ResampleState; struct { ALfloat (*Buffer)[BUFFERSIZE]; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 642fb944..c3c7a20c 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -62,6 +62,10 @@ typedef struct BsincState { } coeffs[BSINC_PHASE_COUNT]; } BsincState; +typedef union InterpState { + BsincState bsinc; +} InterpState; + typedef union aluVector { alignas(16) ALfloat v[4]; @@ -148,7 +152,7 @@ typedef struct SendParams { } SendParams; -typedef const ALfloat* (*ResamplerFunc)(const BsincState *state, +typedef const ALfloat* (*ResamplerFunc)(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen ); -- cgit v1.2.3 From d45dd9c668b2f4331492600d8ff99dc20c068664 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 19 Feb 2017 14:36:06 -0800 Subject: Remove the sinc8 resampler option Perf shows less than 1 percent CPU difference from the higher quality bsinc resampler, but uses almost twice as much memory (a 128KB lookup table). --- Alc/mixer.c | 59 +++++++-------------------- Alc/mixer_c.c | 3 -- Alc/mixer_defs.h | 11 ----- Alc/mixer_neon.c | 83 ++------------------------------------ Alc/mixer_sse3.c | 75 ++-------------------------------- Alc/mixer_sse41.c | 81 ++----------------------------------- OpenAL32/Include/alu.h | 14 +------ utils/alsoft-config/mainwindow.cpp | 8 ++-- utils/alsoft-config/mainwindow.ui | 14 +++---- 9 files changed, 39 insertions(+), 309 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/mixer.c b/Alc/mixer.c index d5cf30cc..a48b0e29 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -43,22 +43,21 @@ static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, extern inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); -alignas(16) union ResamplerCoeffs ResampleCoeffs; +alignas(16) ALfloat ResampleCoeffs_FIR4[FRACTIONONE][4]; enum Resampler { PointResampler, LinearResampler, FIR4Resampler, - FIR8Resampler, BSincResampler, ResamplerDefault = LinearResampler }; -/* FIR8 requires 3 extra samples before the current position, and 4 after. */ -static_assert(MAX_PRE_SAMPLES >= 3, "MAX_PRE_SAMPLES must be at least 3!"); -static_assert(MAX_POST_SAMPLES >= 4, "MAX_POST_SAMPLES must be at least 4!"); +/* BSinc requires up to 11 extra samples before the current position, and 12 after. */ +static_assert(MAX_PRE_SAMPLES >= 11, "MAX_PRE_SAMPLES must be at least 11!"); +static_assert(MAX_POST_SAMPLES >= 12, "MAX_POST_SAMPLES must be at least 12!"); static MixerFunc MixSamples = Mix_C; @@ -140,20 +139,6 @@ static inline ResamplerFunc SelectResampler(enum Resampler resampler) return Resample_fir4_32_SSE3; #endif return Resample_fir4_32_C; - case FIR8Resampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_fir8_32_Neon; -#endif -#ifdef HAVE_SSE4_1 - if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_fir8_32_SSE41; -#endif -#ifdef HAVE_SSE3 - if((CPUCapFlags&CPU_CAP_SSE3)) - return Resample_fir8_32_SSE3; -#endif - return Resample_fir8_32_C; case BSincResampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) @@ -264,13 +249,11 @@ void aluInitMixer(void) resampler = LinearResampler; else if(strcasecmp(str, "sinc4") == 0) resampler = FIR4Resampler; - else if(strcasecmp(str, "sinc8") == 0) - resampler = FIR8Resampler; else if(strcasecmp(str, "bsinc") == 0) resampler = BSincResampler; - else if(strcasecmp(str, "cubic") == 0) + else if(strcasecmp(str, "cubic") == 0 || strcasecmp(str, "sinc8") == 0) { - WARN("Resampler option \"cubic\" is deprecated, using sinc4\n"); + WARN("Resampler option \"%s\" is deprecated, using sinc4\n", str); resampler = FIR4Resampler; } else @@ -284,28 +267,14 @@ void aluInitMixer(void) } } - if(resampler == FIR8Resampler) - for(i = 0;i < FRACTIONONE;i++) - { - ALdouble mu = (ALdouble)i / FRACTIONONE; - ResampleCoeffs.FIR8[i][0] = SincKaiser(4.0, mu - -3.0); - ResampleCoeffs.FIR8[i][1] = SincKaiser(4.0, mu - -2.0); - ResampleCoeffs.FIR8[i][2] = SincKaiser(4.0, mu - -1.0); - ResampleCoeffs.FIR8[i][3] = SincKaiser(4.0, mu - 0.0); - ResampleCoeffs.FIR8[i][4] = SincKaiser(4.0, mu - 1.0); - ResampleCoeffs.FIR8[i][5] = SincKaiser(4.0, mu - 2.0); - ResampleCoeffs.FIR8[i][6] = SincKaiser(4.0, mu - 3.0); - ResampleCoeffs.FIR8[i][7] = SincKaiser(4.0, mu - 4.0); - } - else if(resampler == FIR4Resampler) - for(i = 0;i < FRACTIONONE;i++) - { - ALdouble mu = (ALdouble)i / FRACTIONONE; - ResampleCoeffs.FIR4[i][0] = SincKaiser(2.0, mu - -1.0); - ResampleCoeffs.FIR4[i][1] = SincKaiser(2.0, mu - 0.0); - ResampleCoeffs.FIR4[i][2] = SincKaiser(2.0, mu - 1.0); - ResampleCoeffs.FIR4[i][3] = SincKaiser(2.0, mu - 2.0); - } + for(i = 0;i < FRACTIONONE;i++) + { + ALdouble mu = (ALdouble)i / FRACTIONONE; + ResampleCoeffs_FIR4[i][0] = SincKaiser(2.0, mu - -1.0); + ResampleCoeffs_FIR4[i][1] = SincKaiser(2.0, mu - 0.0); + ResampleCoeffs_FIR4[i][2] = SincKaiser(2.0, mu - 1.0); + ResampleCoeffs_FIR4[i][3] = SincKaiser(2.0, mu - 2.0); + } MixHrtfSamples = SelectHrtfMixer(); MixSamples = SelectMixer(); diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 323f1363..a3d79a46 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -14,8 +14,6 @@ static inline ALfloat lerp32(const ALfloat *restrict vals, ALuint frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } static inline ALfloat fir4_32(const ALfloat *restrict vals, ALuint frac) { return resample_fir4(vals[-1], vals[0], vals[1], vals[2], frac); } -static inline ALfloat fir8_32(const ALfloat *restrict vals, ALuint frac) -{ return resample_fir8(vals[-3], vals[-2], vals[-1], vals[0], vals[1], vals[2], vals[3], vals[4], frac); } const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), @@ -51,7 +49,6 @@ const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ DECL_TEMPLATE(point32) DECL_TEMPLATE(lerp32) DECL_TEMPLATE(fir4_32) -DECL_TEMPLATE(fir8_32) #undef DECL_TEMPLATE diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index 60735c9f..b76c9aee 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -16,7 +16,6 @@ const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restri const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir8_32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); @@ -81,13 +80,6 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState *state, const ALfloat *r ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir8_32_SSE3(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir8_32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); - const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); @@ -115,9 +107,6 @@ const ALfloat *Resample_lerp32_Neon(const InterpState *state, const ALfloat *res const ALfloat *Resample_fir4_32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir8_32_Neon(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 543ff0f3..727c5c55 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -90,10 +90,10 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), const float32x4_t val1 = vld1q_f32(&src[pos_[1]]); const float32x4_t val2 = vld1q_f32(&src[pos_[2]]); const float32x4_t val3 = vld1q_f32(&src[pos_[3]]); - float32x4_t k0 = vld1q_f32(ResampleCoeffs.FIR4[frac_[0]]); - float32x4_t k1 = vld1q_f32(ResampleCoeffs.FIR4[frac_[1]]); - float32x4_t k2 = vld1q_f32(ResampleCoeffs.FIR4[frac_[2]]); - float32x4_t k3 = vld1q_f32(ResampleCoeffs.FIR4[frac_[3]]); + float32x4_t k0 = vld1q_f32(ResampleCoeffs_FIR4[frac_[0]]); + float32x4_t k1 = vld1q_f32(ResampleCoeffs_FIR4[frac_[1]]); + float32x4_t k2 = vld1q_f32(ResampleCoeffs_FIR4[frac_[2]]); + float32x4_t k3 = vld1q_f32(ResampleCoeffs_FIR4[frac_[3]]); float32x4_t out; k0 = vmulq_f32(k0, val0); @@ -136,81 +136,6 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), return dst; } -const ALfloat *Resample_fir8_32_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const uint32x4_t fracMask4 = vdupq_n_u32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALuint frac_[4]; - int32x4_t pos4; - uint32x4_t frac4; - ALsizei i, j; - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - - frac4 = vld1q_u32(frac_); - pos4 = vld1q_s32(pos_); - - src -= 3; - for(i = 0;numsamples-i > 3;i += 4) - { - float32x4_t out[2]; - for(j = 0;j < 8;j+=4) - { - const float32x4_t val0 = vld1q_f32(&src[pos_[0]+j]); - const float32x4_t val1 = vld1q_f32(&src[pos_[1]+j]); - const float32x4_t val2 = vld1q_f32(&src[pos_[2]+j]); - const float32x4_t val3 = vld1q_f32(&src[pos_[3]+j]); - float32x4_t k0 = vld1q_f32(&ResampleCoeffs.FIR4[frac_[0]][j]); - float32x4_t k1 = vld1q_f32(&ResampleCoeffs.FIR4[frac_[1]][j]); - float32x4_t k2 = vld1q_f32(&ResampleCoeffs.FIR4[frac_[2]][j]); - float32x4_t k3 = vld1q_f32(&ResampleCoeffs.FIR4[frac_[3]][j]); - - k0 = vmulq_f32(k0, val0); - k1 = vmulq_f32(k1, val1); - k2 = vmulq_f32(k2, val2); - k3 = vmulq_f32(k3, val3); - k0 = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k1), vget_high_f32(k1))); - k2 = vcombine_f32(vpadd_f32(vget_low_f32(k2), vget_high_f32(k2)), - vpadd_f32(vget_low_f32(k3), vget_high_f32(k3))); - out[j>>2] = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k2), vget_high_f32(k2))); - } - - out[0] = vaddq_f32(out[0], out[1]); - vst1q_f32(&dst[i], out[0]); - - frac4 = vaddq_u32(frac4, (uint32x4_t)increment4); - pos4 = vaddq_s32(pos4, (int32x4_t)vshrq_n_u32(frac4, FRACTIONBITS)); - frac4 = vandq_u32(frac4, fracMask4); - - vst1q_s32(pos_, pos4); - vst1q_u32(frac_, frac4); - } - - if(i < numsamples) - { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - ALint pos = pos_[0]; - frac = frac_[0]; - do { - dst[i] = resample_fir8(src[pos ], src[pos+1], src[pos+2], src[pos+3], - src[pos+4], src[pos+5], src[pos+6], src[pos+7], frac); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); - } - return dst; -} - const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 3b444158..861cfc38 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -55,10 +55,10 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[0]]); - __m128 k1 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[1]]); - __m128 k2 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[2]]); - __m128 k3 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[3]]); + __m128 k0 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[0]]); + __m128 k1 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[1]]); + __m128 k2 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[2]]); + __m128 k3 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); @@ -95,70 +95,3 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), } return dst; } - -const ALfloat *Resample_fir8_32_SSE3(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALsizei i, j; - ALint pos; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - src -= 3; - for(i = 0;numsamples-i > 3;i += 4) - { - __m128 out[2]; - for(j = 0;j < 8;j+=4) - { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]+j]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]+j]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]+j]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]+j]); - __m128 k0 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[0]][j]); - __m128 k1 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[1]][j]); - __m128 k2 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[2]][j]); - __m128 k3 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[3]][j]); - - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out[j>>2] = _mm_hadd_ps(k0, k2); - } - - out[0] = _mm_add_ps(out[0], out[1]); - _mm_store_ps(&dst[i], out[0]); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); - _mm_store_ps(frac_.f, _mm_castsi128_ps(frac4)); - } - - pos = pos_.i[0]; - frac = frac_.i[0]; - - for(;i < numsamples;i++) - { - dst[i] = resample_fir8(src[pos ], src[pos+1], src[pos+2], src[pos+3], - src[pos+4], src[pos+5], src[pos+6], src[pos+7], frac); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 7ae5bec7..61be4cae 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -109,10 +109,10 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[0]]); - __m128 k1 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[1]]); - __m128 k2 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[2]]); - __m128 k3 = _mm_load_ps(ResampleCoeffs.FIR4[frac_.i[3]]); + __m128 k0 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[0]]); + __m128 k1 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[1]]); + __m128 k2 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[2]]); + __m128 k3 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); @@ -152,76 +152,3 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), } return dst; } - -const ALfloat *Resample_fir8_32_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALsizei i, j; - ALint pos; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - src -= 3; - for(i = 0;numsamples-i > 3;i += 4) - { - __m128 out[2]; - for(j = 0;j < 8;j+=4) - { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]+j]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]+j]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]+j]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]+j]); - __m128 k0 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[0]][j]); - __m128 k1 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[1]][j]); - __m128 k2 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[2]][j]); - __m128 k3 = _mm_load_ps(&ResampleCoeffs.FIR8[frac_.i[3]][j]); - - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out[j>>2] = _mm_hadd_ps(k0, k2); - } - - out[0] = _mm_add_ps(out[0], out[1]); - _mm_store_ps(&dst[i], out[0]); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - pos_.i[0] = _mm_extract_epi32(pos4, 0); - pos_.i[1] = _mm_extract_epi32(pos4, 1); - pos_.i[2] = _mm_extract_epi32(pos4, 2); - pos_.i[3] = _mm_extract_epi32(pos4, 3); - frac_.i[0] = _mm_extract_epi32(frac4, 0); - frac_.i[1] = _mm_extract_epi32(frac4, 1); - frac_.i[2] = _mm_extract_epi32(frac4, 2); - frac_.i[3] = _mm_extract_epi32(frac4, 3); - } - - pos = pos_.i[0]; - frac = frac_.i[0]; - - for(;i < numsamples;i++) - { - dst[i] = resample_fir8(src[pos ], src[pos+1], src[pos+2], src[pos+3], - src[pos+4], src[pos+5], src[pos+6], src[pos+7], frac); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index c3c7a20c..c9f8760e 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -229,11 +229,7 @@ inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max) { return minu64(max, maxu64(min, val)); } -union ResamplerCoeffs { - ALfloat FIR4[FRACTIONONE][4]; - ALfloat FIR8[FRACTIONONE][8]; -}; -extern alignas(16) union ResamplerCoeffs ResampleCoeffs; +extern alignas(16) ALfloat ResampleCoeffs_FIR4[FRACTIONONE][4]; extern alignas(16) const ALfloat bsincTab[18840]; @@ -244,15 +240,9 @@ inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) } inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALuint frac) { - const ALfloat *k = ResampleCoeffs.FIR4[frac]; + const ALfloat *k = ResampleCoeffs_FIR4[frac]; return k[0]*val0 + k[1]*val1 + k[2]*val2 + k[3]*val3; } -inline ALfloat resample_fir8(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat val5, ALfloat val6, ALfloat val7, ALuint frac) -{ - const ALfloat *k = ResampleCoeffs.FIR8[frac]; - return k[0]*val0 + k[1]*val1 + k[2]*val2 + k[3]*val3 + - k[4]*val4 + k[5]*val5 + k[6]*val6 + k[7]*val7; -} enum HrtfRequestMode { diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp index 4ae89f09..89e4c30a 100644 --- a/utils/alsoft-config/mainwindow.cpp +++ b/utils/alsoft-config/mainwindow.cpp @@ -101,7 +101,6 @@ static const struct NameValuePair { { "Linear", "linear" }, { "Default (Linear)", "" }, { "4-Point Sinc", "sinc4" }, - { "8-Point Sinc", "sinc8" }, { "Band-limited Sinc", "bsinc" }, { "", "" } @@ -598,9 +597,10 @@ void MainWindow::loadConfig(const QString &fname) QString resampler = settings.value("resampler").toString().trimmed(); ui->resamplerSlider->setValue(0); - /* The "cubic" resampler is no longer supported. It's been replaced by - * "sinc4". */ - if(resampler == "cubic") + /* The "cubic" and "sinc8" resamplers are no longer supported. Use "sinc4" + * as a fallback. + */ + if(resampler == "cubic" || resampler == "sinc8") resampler = "sinc4"; for(int i = 0;resamplerList[i].name[0];i++) { diff --git a/utils/alsoft-config/mainwindow.ui b/utils/alsoft-config/mainwindow.ui index 0356d491..06f12546 100644 --- a/utils/alsoft-config/mainwindow.ui +++ b/utils/alsoft-config/mainwindow.ui @@ -7,13 +7,13 @@ 0 0 564 - 454 + 460 564 - 454 + 460 @@ -131,8 +131,8 @@ to stereo output. 380 20 - 96 - 22 + 91 + 29 @@ -2075,8 +2075,8 @@ added by the ALC_EXT_DEDICATED extension. 160 20 - 131 - 22 + 123 + 29 @@ -2245,7 +2245,7 @@ added by the ALC_EXT_DEDICATED extension. 0 0 564 - 19 + 27 -- cgit v1.2.3 From 319d0971986309d7882a9be42a5aef7dc612945d Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 8 Apr 2017 13:43:19 -0700 Subject: Pre-compute the sinc4 resampler coefficient table --- Alc/bsinc.c | 4100 ++++++++++++++++++++++++++++++++++++++++++++++++ Alc/mixer.c | 92 -- Alc/mixer_neon.c | 8 +- Alc/mixer_sse3.c | 8 +- Alc/mixer_sse41.c | 8 +- OpenAL32/Include/alu.h | 7 +- utils/bsincgen.c | 40 +- 7 files changed, 4154 insertions(+), 109 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/bsinc.c b/Alc/bsinc.c index f795120f..ad83c42b 100644 --- a/Alc/bsinc.c +++ b/Alc/bsinc.c @@ -979,3 +979,4103 @@ alignas(16) const ALfloat bsincTab[18840] = /* 12,14 */ -3.311614162e-04f, +9.124383184e-04f, -9.731965741e-04f, -9.055999228e-04f, +3.928365474e-03f, -4.572939653e-03f, +1.133926469e-03f, +3.134198780e-03f, -4.073990388e-03f, +1.902468489e-03f, +1.684748882e-04f, -6.042449626e-04f, /* 12,15 */ -3.212754781e-04f, +8.205283947e-04f, -6.994376016e-04f, -1.285631838e-03f, +4.064044128e-03f, -4.167864669e-03f, +3.806742210e-04f, +3.684471854e-03f, -4.112050532e-03f, +1.619691310e-03f, +4.291307465e-04f, -7.165252154e-04f }; + +alignas(16) const ALfloat sinc4Tab[4096][4] = +{ + { +1.972846707e-17f, +1.000000000e+00f, +1.972846707e-17f, -7.947592825e-19f }, + { -1.234844220e-04f, +9.999998638e-01f, +1.236324705e-04f, -2.493930525e-06f }, + { -2.468208365e-04f, +9.999994551e-01f, +2.474130305e-04f, -4.998192808e-06f }, + { -3.700092848e-04f, +9.999987739e-01f, +3.713417210e-04f, -7.512801591e-06f }, + { -4.930498082e-04f, +9.999978203e-01f, +4.954185828e-04f, -1.003777162e-05f }, + { -6.159424479e-04f, +9.999965942e-01f, +6.196436566e-04f, -1.257311763e-05f }, + { -7.386872455e-04f, +9.999950956e-01f, +7.440169831e-04f, -1.511885438e-05f }, + { -8.612842424e-04f, +9.999933246e-01f, +8.685386028e-04f, -1.767499661e-05f }, + { -9.837334803e-04f, +9.999912812e-01f, +9.932085563e-04f, -2.024155907e-05f }, + { -1.106035001e-03f, +9.999889652e-01f, +1.118026884e-03f, -2.281855651e-05f }, + { -1.228188846e-03f, +9.999863768e-01f, +1.242993626e-03f, -2.540600368e-05f }, + { -1.350195058e-03f, +9.999835160e-01f, +1.368108822e-03f, -2.800391533e-05f }, + { -1.472053677e-03f, +9.999803827e-01f, +1.493372514e-03f, -3.061230620e-05f }, + { -1.593764748e-03f, +9.999769770e-01f, +1.618784740e-03f, -3.323119106e-05f }, + { -1.715328311e-03f, +9.999732988e-01f, +1.744345541e-03f, -3.586058466e-05f }, + { -1.836744408e-03f, +9.999693481e-01f, +1.870054956e-03f, -3.850050175e-05f }, + { -1.958013083e-03f, +9.999651250e-01f, +1.995913026e-03f, -4.115095708e-05f }, + { -2.079134377e-03f, +9.999606295e-01f, +2.121919790e-03f, -4.381196542e-05f }, + { -2.200108333e-03f, +9.999558615e-01f, +2.248075287e-03f, -4.648354151e-05f }, + { -2.320934994e-03f, +9.999508211e-01f, +2.374379558e-03f, -4.916570012e-05f }, + { -2.441614402e-03f, +9.999455083e-01f, +2.500832641e-03f, -5.185845600e-05f }, + { -2.562146601e-03f, +9.999399230e-01f, +2.627434576e-03f, -5.456182391e-05f }, + { -2.682531632e-03f, +9.999340653e-01f, +2.754185402e-03f, -5.727581862e-05f }, + { -2.802769538e-03f, +9.999279352e-01f, +2.881085158e-03f, -6.000045487e-05f }, + { -2.922860364e-03f, +9.999215326e-01f, +3.008133883e-03f, -6.273574744e-05f }, + { -3.042804151e-03f, +9.999148577e-01f, +3.135331617e-03f, -6.548171107e-05f }, + { -3.162600944e-03f, +9.999079103e-01f, +3.262678397e-03f, -6.823836055e-05f }, + { -3.282250785e-03f, +9.999006906e-01f, +3.390174264e-03f, -7.100571061e-05f }, + { -3.401753717e-03f, +9.998931984e-01f, +3.517819255e-03f, -7.378377604e-05f }, + { -3.521109785e-03f, +9.998854338e-01f, +3.645613409e-03f, -7.657257158e-05f }, + { -3.640319031e-03f, +9.998773969e-01f, +3.773556765e-03f, -7.937211202e-05f }, + { -3.759381500e-03f, +9.998690875e-01f, +3.901649361e-03f, -8.218241209e-05f }, + { -3.878297235e-03f, +9.998605058e-01f, +4.029891236e-03f, -8.500348659e-05f }, + { -3.997066279e-03f, +9.998516517e-01f, +4.158282427e-03f, -8.783535025e-05f }, + { -4.115688677e-03f, +9.998425252e-01f, +4.286822973e-03f, -9.067801786e-05f }, + { -4.234164473e-03f, +9.998331264e-01f, +4.415512912e-03f, -9.353150418e-05f }, + { -4.352493710e-03f, +9.998234552e-01f, +4.544352281e-03f, -9.639582397e-05f }, + { -4.470676433e-03f, +9.998135116e-01f, +4.673341119e-03f, -9.927099199e-05f }, + { -4.588712686e-03f, +9.998032957e-01f, +4.802479464e-03f, -1.021570230e-04f }, + { -4.706602513e-03f, +9.997928075e-01f, +4.931767353e-03f, -1.050539318e-04f }, + { -4.824345959e-03f, +9.997820469e-01f, +5.061204824e-03f, -1.079617332e-04f }, + { -4.941943068e-03f, +9.997710141e-01f, +5.190791913e-03f, -1.108804418e-04f }, + { -5.059393885e-03f, +9.997597089e-01f, +5.320528660e-03f, -1.138100725e-04f }, + { -5.176698454e-03f, +9.997481313e-01f, +5.450415101e-03f, -1.167506400e-04f }, + { -5.293856820e-03f, +9.997362815e-01f, +5.580451273e-03f, -1.197021592e-04f }, + { -5.410869028e-03f, +9.997241594e-01f, +5.710637213e-03f, -1.226646447e-04f }, + { -5.527735122e-03f, +9.997117650e-01f, +5.840972959e-03f, -1.256381113e-04f }, + { -5.644455148e-03f, +9.996990983e-01f, +5.971458547e-03f, -1.286225739e-04f }, + { -5.761029151e-03f, +9.996861593e-01f, +6.102094014e-03f, -1.316180471e-04f }, + { -5.877457176e-03f, +9.996729481e-01f, +6.232879398e-03f, -1.346245458e-04f }, + { -5.993739268e-03f, +9.996594646e-01f, +6.363814734e-03f, -1.376420846e-04f }, + { -6.109875472e-03f, +9.996457089e-01f, +6.494900059e-03f, -1.406706784e-04f }, + { -6.225865834e-03f, +9.996316809e-01f, +6.626135411e-03f, -1.437103420e-04f }, + { -6.341710400e-03f, +9.996173807e-01f, +6.757520824e-03f, -1.467610900e-04f }, + { -6.457409214e-03f, +9.996028083e-01f, +6.889056337e-03f, -1.498229373e-04f }, + { -6.572962323e-03f, +9.995879637e-01f, +7.020741983e-03f, -1.528958987e-04f }, + { -6.688369772e-03f, +9.995728468e-01f, +7.152577801e-03f, -1.559799888e-04f }, + { -6.803631606e-03f, +9.995574578e-01f, +7.284563826e-03f, -1.590752225e-04f }, + { -6.918747873e-03f, +9.995417966e-01f, +7.416700094e-03f, -1.621816145e-04f }, + { -7.033718618e-03f, +9.995258632e-01f, +7.548986640e-03f, -1.652991797e-04f }, + { -7.148543887e-03f, +9.995096577e-01f, +7.681423501e-03f, -1.684279326e-04f }, + { -7.263223725e-03f, +9.994931800e-01f, +7.814010713e-03f, -1.715678882e-04f }, + { -7.377758181e-03f, +9.994764302e-01f, +7.946748310e-03f, -1.747190612e-04f }, + { -7.492147298e-03f, +9.994594082e-01f, +8.079636328e-03f, -1.778814663e-04f }, + { -7.606391125e-03f, +9.994421141e-01f, +8.212674803e-03f, -1.810551183e-04f }, + { -7.720489707e-03f, +9.994245479e-01f, +8.345863769e-03f, -1.842400320e-04f }, + { -7.834443092e-03f, +9.994067096e-01f, +8.479203263e-03f, -1.874362221e-04f }, + { -7.948251325e-03f, +9.993885992e-01f, +8.612693320e-03f, -1.906437034e-04f }, + { -8.061914453e-03f, +9.993702168e-01f, +8.746333973e-03f, -1.938624906e-04f }, + { -8.175432524e-03f, +9.993515622e-01f, +8.880125258e-03f, -1.970925985e-04f }, + { -8.288805583e-03f, +9.993326357e-01f, +9.014067211e-03f, -2.003340419e-04f }, + { -8.402033679e-03f, +9.993134371e-01f, +9.148159865e-03f, -2.035868356e-04f }, + { -8.515116858e-03f, +9.992939664e-01f, +9.282403256e-03f, -2.068509942e-04f }, + { -8.628055168e-03f, +9.992742238e-01f, +9.416797418e-03f, -2.101265325e-04f }, + { -8.740848654e-03f, +9.992542091e-01f, +9.551342385e-03f, -2.134134654e-04f }, + { -8.853497366e-03f, +9.992339225e-01f, +9.686038192e-03f, -2.167118075e-04f }, + { -8.966001349e-03f, +9.992133639e-01f, +9.820884872e-03f, -2.200215735e-04f }, + { -9.078360653e-03f, +9.991925333e-01f, +9.955882461e-03f, -2.233427784e-04f }, + { -9.190575323e-03f, +9.991714307e-01f, +1.009103099e-02f, -2.266754367e-04f }, + { -9.302645409e-03f, +9.991500563e-01f, +1.022633050e-02f, -2.300195634e-04f }, + { -9.414570956e-03f, +9.991284099e-01f, +1.036178102e-02f, -2.333751730e-04f }, + { -9.526352014e-03f, +9.991064916e-01f, +1.049738258e-02f, -2.367422804e-04f }, + { -9.637988631e-03f, +9.990843014e-01f, +1.063313522e-02f, -2.401209002e-04f }, + { -9.749480853e-03f, +9.990618393e-01f, +1.076903897e-02f, -2.435110474e-04f }, + { -9.860828729e-03f, +9.990391053e-01f, +1.090509386e-02f, -2.469127365e-04f }, + { -9.972032308e-03f, +9.990160995e-01f, +1.104129994e-02f, -2.503259824e-04f }, + { -1.008309164e-02f, +9.989928219e-01f, +1.117765722e-02f, -2.537507998e-04f }, + { -1.019400677e-02f, +9.989692724e-01f, +1.131416575e-02f, -2.571872034e-04f }, + { -1.030477774e-02f, +9.989454512e-01f, +1.145082556e-02f, -2.606352080e-04f }, + { -1.041540461e-02f, +9.989213581e-01f, +1.158763668e-02f, -2.640948284e-04f }, + { -1.052588743e-02f, +9.988969933e-01f, +1.172459914e-02f, -2.675660791e-04f }, + { -1.063622623e-02f, +9.988723567e-01f, +1.186171298e-02f, -2.710489751e-04f }, + { -1.074642108e-02f, +9.988474483e-01f, +1.199897823e-02f, -2.745435310e-04f }, + { -1.085647202e-02f, +9.988222682e-01f, +1.213639492e-02f, -2.780497616e-04f }, + { -1.096637910e-02f, +9.987968164e-01f, +1.227396308e-02f, -2.815676816e-04f }, + { -1.107614236e-02f, +9.987710929e-01f, +1.241168275e-02f, -2.850973058e-04f }, + { -1.118576186e-02f, +9.987450978e-01f, +1.254955397e-02f, -2.886386488e-04f }, + { -1.129523765e-02f, +9.987188309e-01f, +1.268757675e-02f, -2.921917254e-04f }, + { -1.140456977e-02f, +9.986922924e-01f, +1.282575114e-02f, -2.957565503e-04f }, + { -1.151375828e-02f, +9.986654823e-01f, +1.296407716e-02f, -2.993331383e-04f }, + { -1.162280322e-02f, +9.986384006e-01f, +1.310255485e-02f, -3.029215041e-04f }, + { -1.173170465e-02f, +9.986110473e-01f, +1.324118424e-02f, -3.065216624e-04f }, + { -1.184046260e-02f, +9.985834223e-01f, +1.337996537e-02f, -3.101336280e-04f }, + { -1.194907714e-02f, +9.985555259e-01f, +1.351889825e-02f, -3.137574155e-04f }, + { -1.205754831e-02f, +9.985273578e-01f, +1.365798293e-02f, -3.173930397e-04f }, + { -1.216587616e-02f, +9.984989183e-01f, +1.379721944e-02f, -3.210405152e-04f }, + { -1.227406075e-02f, +9.984702072e-01f, +1.393660781e-02f, -3.246998569e-04f }, + { -1.238210211e-02f, +9.984412247e-01f, +1.407614806e-02f, -3.283710794e-04f }, + { -1.249000030e-02f, +9.984119707e-01f, +1.421584024e-02f, -3.320541975e-04f }, + { -1.259775538e-02f, +9.983824452e-01f, +1.435568436e-02f, -3.357492258e-04f }, + { -1.270536739e-02f, +9.983526483e-01f, +1.449568047e-02f, -3.394561791e-04f }, + { -1.281283638e-02f, +9.983225800e-01f, +1.463582860e-02f, -3.431750720e-04f }, + { -1.292016240e-02f, +9.982922403e-01f, +1.477612876e-02f, -3.469059193e-04f }, + { -1.302734550e-02f, +9.982616292e-01f, +1.491658101e-02f, -3.506487357e-04f }, + { -1.313438573e-02f, +9.982307467e-01f, +1.505718535e-02f, -3.544035359e-04f }, + { -1.324128315e-02f, +9.981995929e-01f, +1.519794184e-02f, -3.581703346e-04f }, + { -1.334803780e-02f, +9.981681678e-01f, +1.533885049e-02f, -3.619491465e-04f }, + { -1.345464973e-02f, +9.981364714e-01f, +1.547991134e-02f, -3.657399862e-04f }, + { -1.356111900e-02f, +9.981045038e-01f, +1.562112441e-02f, -3.695428686e-04f }, + { -1.366744566e-02f, +9.980722648e-01f, +1.576248975e-02f, -3.733578082e-04f }, + { -1.377362975e-02f, +9.980397546e-01f, +1.590400737e-02f, -3.771848197e-04f }, + { -1.387967133e-02f, +9.980069732e-01f, +1.604567730e-02f, -3.810239179e-04f }, + { -1.398557045e-02f, +9.979739207e-01f, +1.618749959e-02f, -3.848751175e-04f }, + { -1.409132716e-02f, +9.979405969e-01f, +1.632947425e-02f, -3.887384331e-04f }, + { -1.419694151e-02f, +9.979070020e-01f, +1.647160132e-02f, -3.926138794e-04f }, + { -1.430241355e-02f, +9.978731359e-01f, +1.661388082e-02f, -3.965014710e-04f }, + { -1.440774333e-02f, +9.978389988e-01f, +1.675631280e-02f, -4.004012227e-04f }, + { -1.451293091e-02f, +9.978045905e-01f, +1.689889726e-02f, -4.043131492e-04f }, + { -1.461797634e-02f, +9.977699112e-01f, +1.704163425e-02f, -4.082372651e-04f }, + { -1.472287966e-02f, +9.977349608e-01f, +1.718452380e-02f, -4.121735850e-04f }, + { -1.482764093e-02f, +9.976997395e-01f, +1.732756592e-02f, -4.161221238e-04f }, + { -1.493226021e-02f, +9.976642471e-01f, +1.747076066e-02f, -4.200828959e-04f }, + { -1.503673754e-02f, +9.976284837e-01f, +1.761410804e-02f, -4.240559161e-04f }, + { -1.514107297e-02f, +9.975924494e-01f, +1.775760809e-02f, -4.280411991e-04f }, + { -1.524526657e-02f, +9.975561442e-01f, +1.790126083e-02f, -4.320387594e-04f }, + { -1.534931837e-02f, +9.975195680e-01f, +1.804506631e-02f, -4.360486119e-04f }, + { -1.545322843e-02f, +9.974827210e-01f, +1.818902453e-02f, -4.400707710e-04f }, + { -1.555699680e-02f, +9.974456031e-01f, +1.833313554e-02f, -4.441052515e-04f }, + { -1.566062355e-02f, +9.974082143e-01f, +1.847739937e-02f, -4.481520680e-04f }, + { -1.576410871e-02f, +9.973705548e-01f, +1.862181603e-02f, -4.522112352e-04f }, + { -1.586745234e-02f, +9.973326244e-01f, +1.876638556e-02f, -4.562827677e-04f }, + { -1.597065449e-02f, +9.972944233e-01f, +1.891110799e-02f, -4.603666801e-04f }, + { -1.607371522e-02f, +9.972559515e-01f, +1.905598334e-02f, -4.644629872e-04f }, + { -1.617663458e-02f, +9.972172089e-01f, +1.920101164e-02f, -4.685717034e-04f }, + { -1.627941262e-02f, +9.971781956e-01f, +1.934619292e-02f, -4.726928435e-04f }, + { -1.638204939e-02f, +9.971389117e-01f, +1.949152721e-02f, -4.768264221e-04f }, + { -1.648454495e-02f, +9.970993571e-01f, +1.963701453e-02f, -4.809724538e-04f }, + { -1.658689935e-02f, +9.970595319e-01f, +1.978265492e-02f, -4.851309533e-04f }, + { -1.668911265e-02f, +9.970194362e-01f, +1.992844839e-02f, -4.893019351e-04f }, + { -1.679118489e-02f, +9.969790698e-01f, +2.007439498e-02f, -4.934854139e-04f }, + { -1.689311613e-02f, +9.969384329e-01f, +2.022049471e-02f, -4.976814042e-04f }, + { -1.699490642e-02f, +9.968975255e-01f, +2.036674762e-02f, -5.018899208e-04f }, + { -1.709655581e-02f, +9.968563476e-01f, +2.051315372e-02f, -5.061109782e-04f }, + { -1.719806437e-02f, +9.968148993e-01f, +2.065971304e-02f, -5.103445911e-04f }, + { -1.729943214e-02f, +9.967731805e-01f, +2.080642562e-02f, -5.145907739e-04f }, + { -1.740065918e-02f, +9.967311913e-01f, +2.095329147e-02f, -5.188495414e-04f }, + { -1.750174553e-02f, +9.966889317e-01f, +2.110031063e-02f, -5.231209082e-04f }, + { -1.760269126e-02f, +9.966464017e-01f, +2.124748312e-02f, -5.274048887e-04f }, + { -1.770349642e-02f, +9.966036014e-01f, +2.139480896e-02f, -5.317014977e-04f }, + { -1.780416106e-02f, +9.965605309e-01f, +2.154228819e-02f, -5.360107497e-04f }, + { -1.790468523e-02f, +9.965171900e-01f, +2.168992083e-02f, -5.403326592e-04f }, + { -1.800506899e-02f, +9.964735789e-01f, +2.183770690e-02f, -5.446672410e-04f }, + { -1.810531240e-02f, +9.964296976e-01f, +2.198564643e-02f, -5.490145094e-04f }, + { -1.820541550e-02f, +9.963855461e-01f, +2.213373945e-02f, -5.533744792e-04f }, + { -1.830537836e-02f, +9.963411244e-01f, +2.228198598e-02f, -5.577471650e-04f }, + { -1.840520102e-02f, +9.962964326e-01f, +2.243038605e-02f, -5.621325811e-04f }, + { -1.850488354e-02f, +9.962514707e-01f, +2.257893968e-02f, -5.665307423e-04f }, + { -1.860442598e-02f, +9.962062387e-01f, +2.272764690e-02f, -5.709416631e-04f }, + { -1.870382839e-02f, +9.961607366e-01f, +2.287650774e-02f, -5.753653581e-04f }, + { -1.880309082e-02f, +9.961149645e-01f, +2.302552221e-02f, -5.798018418e-04f }, + { -1.890221333e-02f, +9.960689225e-01f, +2.317469035e-02f, -5.842511287e-04f }, + { -1.900119597e-02f, +9.960226105e-01f, +2.332401218e-02f, -5.887132334e-04f }, + { -1.910003880e-02f, +9.959760285e-01f, +2.347348772e-02f, -5.931881705e-04f }, + { -1.919874188e-02f, +9.959291766e-01f, +2.362311700e-02f, -5.976759545e-04f }, + { -1.929730525e-02f, +9.958820549e-01f, +2.377290004e-02f, -6.021765999e-04f }, + { -1.939572898e-02f, +9.958346633e-01f, +2.392283688e-02f, -6.066901213e-04f }, + { -1.949401312e-02f, +9.957870019e-01f, +2.407292752e-02f, -6.112165332e-04f }, + { -1.959215772e-02f, +9.957390708e-01f, +2.422317200e-02f, -6.157558500e-04f }, + { -1.969016283e-02f, +9.956908698e-01f, +2.437357035e-02f, -6.203080865e-04f }, + { -1.978802853e-02f, +9.956423992e-01f, +2.452412258e-02f, -6.248732570e-04f }, + { -1.988575485e-02f, +9.955936589e-01f, +2.467482872e-02f, -6.294513760e-04f }, + { -1.998334185e-02f, +9.955446489e-01f, +2.482568879e-02f, -6.340424582e-04f }, + { -2.008078960e-02f, +9.954953692e-01f, +2.497670282e-02f, -6.386465180e-04f }, + { -2.017809815e-02f, +9.954458200e-01f, +2.512787083e-02f, -6.432635698e-04f }, + { -2.027526754e-02f, +9.953960012e-01f, +2.527919285e-02f, -6.478936283e-04f }, + { -2.037229785e-02f, +9.953459129e-01f, +2.543066889e-02f, -6.525367078e-04f }, + { -2.046918912e-02f, +9.952955551e-01f, +2.558229899e-02f, -6.571928229e-04f }, + { -2.056594140e-02f, +9.952449278e-01f, +2.573408316e-02f, -6.618619881e-04f }, + { -2.066255477e-02f, +9.951940310e-01f, +2.588602143e-02f, -6.665442179e-04f }, + { -2.075902926e-02f, +9.951428649e-01f, +2.603811383e-02f, -6.712395266e-04f }, + { -2.085536494e-02f, +9.950914294e-01f, +2.619036036e-02f, -6.759479289e-04f }, + { -2.095156187e-02f, +9.950397245e-01f, +2.634276107e-02f, -6.806694392e-04f }, + { -2.104762010e-02f, +9.949877504e-01f, +2.649531596e-02f, -6.854040719e-04f }, + { -2.114353968e-02f, +9.949355069e-01f, +2.664802507e-02f, -6.901518415e-04f }, + { -2.123932068e-02f, +9.948829943e-01f, +2.680088842e-02f, -6.949127625e-04f }, + { -2.133496314e-02f, +9.948302124e-01f, +2.695390602e-02f, -6.996868493e-04f }, + { -2.143046713e-02f, +9.947771613e-01f, +2.710707790e-02f, -7.044741164e-04f }, + { -2.152583271e-02f, +9.947238411e-01f, +2.726040409e-02f, -7.092745782e-04f }, + { -2.162105992e-02f, +9.946702518e-01f, +2.741388460e-02f, -7.140882492e-04f }, + { -2.171614883e-02f, +9.946163934e-01f, +2.756751946e-02f, -7.189151437e-04f }, + { -2.181109950e-02f, +9.945622660e-01f, +2.772130869e-02f, -7.237552763e-04f }, + { -2.190591197e-02f, +9.945078696e-01f, +2.787525232e-02f, -7.286086614e-04f }, + { -2.200058631e-02f, +9.944532042e-01f, +2.802935035e-02f, -7.334753133e-04f }, + { -2.209512257e-02f, +9.943982699e-01f, +2.818360282e-02f, -7.383552465e-04f }, + { -2.218952082e-02f, +9.943430666e-01f, +2.833800975e-02f, -7.432484754e-04f }, + { -2.228378110e-02f, +9.942875945e-01f, +2.849257115e-02f, -7.481550144e-04f }, + { -2.237790348e-02f, +9.942318536e-01f, +2.864728706e-02f, -7.530748780e-04f }, + { -2.247188802e-02f, +9.941758439e-01f, +2.880215748e-02f, -7.580080805e-04f }, + { -2.256573476e-02f, +9.941195654e-01f, +2.895718245e-02f, -7.629546363e-04f }, + { -2.265944377e-02f, +9.940630182e-01f, +2.911236198e-02f, -7.679145598e-04f }, + { -2.275301511e-02f, +9.940062023e-01f, +2.926769610e-02f, -7.728878654e-04f }, + { -2.284644883e-02f, +9.939491178e-01f, +2.942318481e-02f, -7.778745675e-04f }, + { -2.293974499e-02f, +9.938917647e-01f, +2.957882816e-02f, -7.828746805e-04f }, + { -2.303290364e-02f, +9.938341429e-01f, +2.973462615e-02f, -7.878882187e-04f }, + { -2.312592486e-02f, +9.937762527e-01f, +2.989057881e-02f, -7.929151965e-04f }, + { -2.321880869e-02f, +9.937180939e-01f, +3.004668616e-02f, -7.979556282e-04f }, + { -2.331155519e-02f, +9.936596666e-01f, +3.020294821e-02f, -8.030095283e-04f }, + { -2.340416442e-02f, +9.936009710e-01f, +3.035936500e-02f, -8.080769110e-04f }, + { -2.349663644e-02f, +9.935420069e-01f, +3.051593653e-02f, -8.131577908e-04f }, + { -2.358897131e-02f, +9.934827745e-01f, +3.067266283e-02f, -8.182521819e-04f }, + { -2.368116908e-02f, +9.934232738e-01f, +3.082954391e-02f, -8.233600987e-04f }, + { -2.377322981e-02f, +9.933635047e-01f, +3.098657981e-02f, -8.284815556e-04f }, + { -2.386515357e-02f, +9.933034675e-01f, +3.114377053e-02f, -8.336165668e-04f }, + { -2.395694040e-02f, +9.932431620e-01f, +3.130111610e-02f, -8.387651466e-04f }, + { -2.404859038e-02f, +9.931825884e-01f, +3.145861654e-02f, -8.439273095e-04f }, + { -2.414010355e-02f, +9.931217466e-01f, +3.161627187e-02f, -8.491030697e-04f }, + { -2.423147998e-02f, +9.930606368e-01f, +3.177408210e-02f, -8.542924415e-04f }, + { -2.432271972e-02f, +9.929992589e-01f, +3.193204725e-02f, -8.594954392e-04f }, + { -2.441382283e-02f, +9.929376130e-01f, +3.209016735e-02f, -8.647120771e-04f }, + { -2.450478938e-02f, +9.928756991e-01f, +3.224844242e-02f, -8.699423695e-04f }, + { -2.459561942e-02f, +9.928135173e-01f, +3.240687246e-02f, -8.751863308e-04f }, + { -2.468631300e-02f, +9.927510676e-01f, +3.256545750e-02f, -8.804439750e-04f }, + { -2.477687020e-02f, +9.926883501e-01f, +3.272419757e-02f, -8.857153167e-04f }, + { -2.486729107e-02f, +9.926253647e-01f, +3.288309267e-02f, -8.910003699e-04f }, + { -2.495757566e-02f, +9.925621116e-01f, +3.304214283e-02f, -8.962991490e-04f }, + { -2.504772404e-02f, +9.924985907e-01f, +3.320134807e-02f, -9.016116683e-04f }, + { -2.513773626e-02f, +9.924348021e-01f, +3.336070839e-02f, -9.069379419e-04f }, + { -2.522761239e-02f, +9.923707459e-01f, +3.352022383e-02f, -9.122779842e-04f }, + { -2.531735249e-02f, +9.923064221e-01f, +3.367989440e-02f, -9.176318093e-04f }, + { -2.540695661e-02f, +9.922418307e-01f, +3.383972011e-02f, -9.229994316e-04f }, + { -2.549642481e-02f, +9.921769718e-01f, +3.399970099e-02f, -9.283808652e-04f }, + { -2.558575716e-02f, +9.921118453e-01f, +3.415983706e-02f, -9.337761243e-04f }, + { -2.567495371e-02f, +9.920464515e-01f, +3.432012832e-02f, -9.391852233e-04f }, + { -2.576401452e-02f, +9.919807902e-01f, +3.448057480e-02f, -9.446081762e-04f }, + { -2.585293966e-02f, +9.919148616e-01f, +3.464117652e-02f, -9.500449974e-04f }, + { -2.594172918e-02f, +9.918486656e-01f, +3.480193349e-02f, -9.554957009e-04f }, + { -2.603038315e-02f, +9.917822024e-01f, +3.496284573e-02f, -9.609603011e-04f }, + { -2.611890161e-02f, +9.917154719e-01f, +3.512391325e-02f, -9.664388120e-04f }, + { -2.620728464e-02f, +9.916484743e-01f, +3.528513608e-02f, -9.719312480e-04f }, + { -2.629553230e-02f, +9.915812094e-01f, +3.544651423e-02f, -9.774376231e-04f }, + { -2.638364463e-02f, +9.915136775e-01f, +3.560804772e-02f, -9.829579515e-04f }, + { -2.647162171e-02f, +9.914458785e-01f, +3.576973656e-02f, -9.884922474e-04f }, + { -2.655946360e-02f, +9.913778125e-01f, +3.593158078e-02f, -9.940405249e-04f }, + { -2.664717035e-02f, +9.913094795e-01f, +3.609358038e-02f, -9.996027983e-04f }, + { -2.673474203e-02f, +9.912408796e-01f, +3.625573538e-02f, -1.005179082e-03f }, + { -2.682217869e-02f, +9.911720128e-01f, +3.641804581e-02f, -1.010769389e-03f }, + { -2.690948040e-02f, +9.911028791e-01f, +3.658051167e-02f, -1.016373735e-03f }, + { -2.699664722e-02f, +9.910334786e-01f, +3.674313298e-02f, -1.021992133e-03f }, + { -2.708367921e-02f, +9.909638114e-01f, +3.690590976e-02f, -1.027624597e-03f }, + { -2.717057642e-02f, +9.908938774e-01f, +3.706884203e-02f, -1.033271142e-03f }, + { -2.725733893e-02f, +9.908236768e-01f, +3.723192979e-02f, -1.038931782e-03f }, + { -2.734396678e-02f, +9.907532095e-01f, +3.739517307e-02f, -1.044606531e-03f }, + { -2.743046005e-02f, +9.906824756e-01f, +3.755857188e-02f, -1.050295402e-03f }, + { -2.751681879e-02f, +9.906114753e-01f, +3.772212623e-02f, -1.055998411e-03f }, + { -2.760304307e-02f, +9.905402084e-01f, +3.788583615e-02f, -1.061715570e-03f }, + { -2.768913294e-02f, +9.904686751e-01f, +3.804970164e-02f, -1.067446895e-03f }, + { -2.777508847e-02f, +9.903968753e-01f, +3.821372273e-02f, -1.073192399e-03f }, + { -2.786090972e-02f, +9.903248092e-01f, +3.837789942e-02f, -1.078952096e-03f }, + { -2.794659675e-02f, +9.902524768e-01f, +3.854223173e-02f, -1.084726001e-03f }, + { -2.803214962e-02f, +9.901798782e-01f, +3.870671968e-02f, -1.090514127e-03f }, + { -2.811756839e-02f, +9.901070133e-01f, +3.887136328e-02f, -1.096316489e-03f }, + { -2.820285313e-02f, +9.900338822e-01f, +3.903616254e-02f, -1.102133100e-03f }, + { -2.828800389e-02f, +9.899604850e-01f, +3.920111748e-02f, -1.107963974e-03f }, + { -2.837302075e-02f, +9.898868218e-01f, +3.936622812e-02f, -1.113809126e-03f }, + { -2.845790375e-02f, +9.898128925e-01f, +3.953149447e-02f, -1.119668570e-03f }, + { -2.854265296e-02f, +9.897386972e-01f, +3.969691653e-02f, -1.125542319e-03f }, + { -2.862726845e-02f, +9.896642360e-01f, +3.986249434e-02f, -1.131430388e-03f }, + { -2.871175028e-02f, +9.895895088e-01f, +4.002822789e-02f, -1.137332791e-03f }, + { -2.879609850e-02f, +9.895145159e-01f, +4.019411721e-02f, -1.143249541e-03f }, + { -2.888031318e-02f, +9.894392571e-01f, +4.036016230e-02f, -1.149180652e-03f }, + { -2.896439439e-02f, +9.893637326e-01f, +4.052636319e-02f, -1.155126140e-03f }, + { -2.904834218e-02f, +9.892879424e-01f, +4.069271988e-02f, -1.161086016e-03f }, + { -2.913215661e-02f, +9.892118865e-01f, +4.085923238e-02f, -1.167060297e-03f }, + { -2.921583776e-02f, +9.891355651e-01f, +4.102590072e-02f, -1.173048994e-03f }, + { -2.929938568e-02f, +9.890589780e-01f, +4.119272490e-02f, -1.179052123e-03f }, + { -2.938280043e-02f, +9.889821255e-01f, +4.135970494e-02f, -1.185069698e-03f }, + { -2.946608208e-02f, +9.889050075e-01f, +4.152684085e-02f, -1.191101731e-03f }, + { -2.954923069e-02f, +9.888276241e-01f, +4.169413264e-02f, -1.197148238e-03f }, + { -2.963224632e-02f, +9.887499753e-01f, +4.186158033e-02f, -1.203209232e-03f }, + { -2.971512904e-02f, +9.886720613e-01f, +4.202918393e-02f, -1.209284727e-03f }, + { -2.979787891e-02f, +9.885938819e-01f, +4.219694344e-02f, -1.215374737e-03f }, + { -2.988049599e-02f, +9.885154374e-01f, +4.236485889e-02f, -1.221479275e-03f }, + { -2.996298034e-02f, +9.884367276e-01f, +4.253293028e-02f, -1.227598357e-03f }, + { -3.004533202e-02f, +9.883577528e-01f, +4.270115763e-02f, -1.233731995e-03f }, + { -3.012755111e-02f, +9.882785129e-01f, +4.286954095e-02f, -1.239880203e-03f }, + { -3.020963766e-02f, +9.881990080e-01f, +4.303808025e-02f, -1.246042996e-03f }, + { -3.029159174e-02f, +9.881192381e-01f, +4.320677555e-02f, -1.252220388e-03f }, + { -3.037341341e-02f, +9.880392034e-01f, +4.337562684e-02f, -1.258412391e-03f }, + { -3.045510273e-02f, +9.879589037e-01f, +4.354463416e-02f, -1.264619020e-03f }, + { -3.053665977e-02f, +9.878783393e-01f, +4.371379750e-02f, -1.270840289e-03f }, + { -3.061808459e-02f, +9.877975101e-01f, +4.388311688e-02f, -1.277076211e-03f }, + { -3.069937725e-02f, +9.877164161e-01f, +4.405259231e-02f, -1.283326801e-03f }, + { -3.078053782e-02f, +9.876350576e-01f, +4.422222380e-02f, -1.289592072e-03f }, + { -3.086156636e-02f, +9.875534344e-01f, +4.439201136e-02f, -1.295872038e-03f }, + { -3.094246293e-02f, +9.874715467e-01f, +4.456195501e-02f, -1.302166714e-03f }, + { -3.102322761e-02f, +9.873893944e-01f, +4.473205475e-02f, -1.308476111e-03f }, + { -3.110386044e-02f, +9.873069778e-01f, +4.490231060e-02f, -1.314800245e-03f }, + { -3.118436150e-02f, +9.872242967e-01f, +4.507272256e-02f, -1.321139130e-03f }, + { -3.126473085e-02f, +9.871413513e-01f, +4.524329065e-02f, -1.327492778e-03f }, + { -3.134496856e-02f, +9.870581415e-01f, +4.541401487e-02f, -1.333861204e-03f }, + { -3.142507468e-02f, +9.869746676e-01f, +4.558489524e-02f, -1.340244422e-03f }, + { -3.150504929e-02f, +9.868909295e-01f, +4.575593177e-02f, -1.346642444e-03f }, + { -3.158489244e-02f, +9.868069272e-01f, +4.592712446e-02f, -1.353055286e-03f }, + { -3.166460421e-02f, +9.867226608e-01f, +4.609847333e-02f, -1.359482960e-03f }, + { -3.174418465e-02f, +9.866381305e-01f, +4.626997838e-02f, -1.365925481e-03f }, + { -3.182363382e-02f, +9.865533361e-01f, +4.644163964e-02f, -1.372382862e-03f }, + { -3.190295181e-02f, +9.864682779e-01f, +4.661345709e-02f, -1.378855117e-03f }, + { -3.198213866e-02f, +9.863829557e-01f, +4.678543077e-02f, -1.385342260e-03f }, + { -3.206119444e-02f, +9.862973698e-01f, +4.695756066e-02f, -1.391844303e-03f }, + { -3.214011922e-02f, +9.862115201e-01f, +4.712984679e-02f, -1.398361262e-03f }, + { -3.221891307e-02f, +9.861254067e-01f, +4.730228917e-02f, -1.404893149e-03f }, + { -3.229757604e-02f, +9.860390297e-01f, +4.747488779e-02f, -1.411439979e-03f }, + { -3.237610820e-02f, +9.859523890e-01f, +4.764764268e-02f, -1.418001764e-03f }, + { -3.245450962e-02f, +9.858654848e-01f, +4.782055384e-02f, -1.424578519e-03f }, + { -3.253278036e-02f, +9.857783172e-01f, +4.799362127e-02f, -1.431170257e-03f }, + { -3.261092049e-02f, +9.856908861e-01f, +4.816684499e-02f, -1.437776992e-03f }, + { -3.268893007e-02f, +9.856031917e-01f, +4.834022501e-02f, -1.444398738e-03f }, + { -3.276680917e-02f, +9.855152339e-01f, +4.851376133e-02f, -1.451035507e-03f }, + { -3.284455785e-02f, +9.854270129e-01f, +4.868745396e-02f, -1.457687314e-03f }, + { -3.292217617e-02f, +9.853385286e-01f, +4.886130292e-02f, -1.464354173e-03f }, + { -3.299966421e-02f, +9.852497812e-01f, +4.903530820e-02f, -1.471036096e-03f }, + { -3.307702203e-02f, +9.851607708e-01f, +4.920946982e-02f, -1.477733098e-03f }, + { -3.315424969e-02f, +9.850714973e-01f, +4.938378778e-02f, -1.484445192e-03f }, + { -3.323134726e-02f, +9.849819608e-01f, +4.955826209e-02f, -1.491172391e-03f }, + { -3.330831480e-02f, +9.848921614e-01f, +4.973289276e-02f, -1.497914710e-03f }, + { -3.338515239e-02f, +9.848020991e-01f, +4.990767980e-02f, -1.504672161e-03f }, + { -3.346186007e-02f, +9.847117740e-01f, +5.008262322e-02f, -1.511444759e-03f }, + { -3.353843793e-02f, +9.846211862e-01f, +5.025772301e-02f, -1.518232516e-03f }, + { -3.361488603e-02f, +9.845303356e-01f, +5.043297919e-02f, -1.525035446e-03f }, + { -3.369120443e-02f, +9.844392225e-01f, +5.060839177e-02f, -1.531853564e-03f }, + { -3.376739320e-02f, +9.843478467e-01f, +5.078396076e-02f, -1.538686881e-03f }, + { -3.384345240e-02f, +9.842562085e-01f, +5.095968615e-02f, -1.545535412e-03f }, + { -3.391938210e-02f, +9.841643077e-01f, +5.113556795e-02f, -1.552399171e-03f }, + { -3.399518237e-02f, +9.840721446e-01f, +5.131160618e-02f, -1.559278170e-03f }, + { -3.407085327e-02f, +9.839797191e-01f, +5.148780084e-02f, -1.566172424e-03f }, + { -3.414639488e-02f, +9.838870314e-01f, +5.166415193e-02f, -1.573081945e-03f }, + { -3.422180724e-02f, +9.837940814e-01f, +5.184065947e-02f, -1.580006747e-03f }, + { -3.429709044e-02f, +9.837008692e-01f, +5.201732345e-02f, -1.586946844e-03f }, + { -3.437224453e-02f, +9.836073950e-01f, +5.219414389e-02f, -1.593902249e-03f }, + { -3.444726959e-02f, +9.835136587e-01f, +5.237112079e-02f, -1.600872975e-03f }, + { -3.452216568e-02f, +9.834196603e-01f, +5.254825415e-02f, -1.607859036e-03f }, + { -3.459693287e-02f, +9.833254001e-01f, +5.272554398e-02f, -1.614860445e-03f }, + { -3.467157122e-02f, +9.832308780e-01f, +5.290299029e-02f, -1.621877216e-03f }, + { -3.474608080e-02f, +9.831360941e-01f, +5.308059308e-02f, -1.628909362e-03f }, + { -3.482046167e-02f, +9.830410484e-01f, +5.325835236e-02f, -1.635956896e-03f }, + { -3.489471391e-02f, +9.829457410e-01f, +5.343626813e-02f, -1.643019832e-03f }, + { -3.496883758e-02f, +9.828501720e-01f, +5.361434040e-02f, -1.650098183e-03f }, + { -3.504283275e-02f, +9.827543414e-01f, +5.379256918e-02f, -1.657191962e-03f }, + { -3.511669948e-02f, +9.826582494e-01f, +5.397095446e-02f, -1.664301183e-03f }, + { -3.519043784e-02f, +9.825618958e-01f, +5.414949625e-02f, -1.671425859e-03f }, + { -3.526404790e-02f, +9.824652809e-01f, +5.432819456e-02f, -1.678566004e-03f }, + { -3.533752973e-02f, +9.823684047e-01f, +5.450704939e-02f, -1.685721630e-03f }, + { -3.541088338e-02f, +9.822712671e-01f, +5.468606075e-02f, -1.692892751e-03f }, + { -3.548410894e-02f, +9.821738684e-01f, +5.486522863e-02f, -1.700079381e-03f }, + { -3.555720646e-02f, +9.820762086e-01f, +5.504455306e-02f, -1.707281532e-03f }, + { -3.563017602e-02f, +9.819782876e-01f, +5.522403402e-02f, -1.714499218e-03f }, + { -3.570301768e-02f, +9.818801056e-01f, +5.540367152e-02f, -1.721732452e-03f }, + { -3.577573150e-02f, +9.817816627e-01f, +5.558346557e-02f, -1.728981247e-03f }, + { -3.584831757e-02f, +9.816829589e-01f, +5.576341617e-02f, -1.736245617e-03f }, + { -3.592077593e-02f, +9.815839943e-01f, +5.594352333e-02f, -1.743525575e-03f }, + { -3.599310667e-02f, +9.814847688e-01f, +5.612378704e-02f, -1.750821133e-03f }, + { -3.606530984e-02f, +9.813852827e-01f, +5.630420731e-02f, -1.758132306e-03f }, + { -3.613738552e-02f, +9.812855360e-01f, +5.648478415e-02f, -1.765459107e-03f }, + { -3.620933378e-02f, +9.811855286e-01f, +5.666551755e-02f, -1.772801548e-03f }, + { -3.628115468e-02f, +9.810852607e-01f, +5.684640752e-02f, -1.780159642e-03f }, + { -3.635284829e-02f, +9.809847324e-01f, +5.702745407e-02f, -1.787533404e-03f }, + { -3.642441467e-02f, +9.808839437e-01f, +5.720865720e-02f, -1.794922846e-03f }, + { -3.649585390e-02f, +9.807828947e-01f, +5.739001690e-02f, -1.802327981e-03f }, + { -3.656716604e-02f, +9.806815854e-01f, +5.757153318e-02f, -1.809748823e-03f }, + { -3.663835117e-02f, +9.805800159e-01f, +5.775320605e-02f, -1.817185384e-03f }, + { -3.670940934e-02f, +9.804781863e-01f, +5.793503550e-02f, -1.824637677e-03f }, + { -3.678034064e-02f, +9.803760966e-01f, +5.811702155e-02f, -1.832105717e-03f }, + { -3.685114512e-02f, +9.802737469e-01f, +5.829916418e-02f, -1.839589515e-03f }, + { -3.692182285e-02f, +9.801711372e-01f, +5.848146341e-02f, -1.847089085e-03f }, + { -3.699237391e-02f, +9.800682677e-01f, +5.866391923e-02f, -1.854604440e-03f }, + { -3.706279835e-02f, +9.799651384e-01f, +5.884653165e-02f, -1.862135594e-03f }, + { -3.713309626e-02f, +9.798617493e-01f, +5.902930066e-02f, -1.869682558e-03f }, + { -3.720326769e-02f, +9.797581006e-01f, +5.921222628e-02f, -1.877245347e-03f }, + { -3.727331272e-02f, +9.796541922e-01f, +5.939530849e-02f, -1.884823973e-03f }, + { -3.734323142e-02f, +9.795500243e-01f, +5.957854731e-02f, -1.892418449e-03f }, + { -3.741302385e-02f, +9.794455969e-01f, +5.976194274e-02f, -1.900028788e-03f }, + { -3.748269008e-02f, +9.793409101e-01f, +5.994549476e-02f, -1.907655004e-03f }, + { -3.755223018e-02f, +9.792359640e-01f, +6.012920340e-02f, -1.915297108e-03f }, + { -3.762164423e-02f, +9.791307585e-01f, +6.031306864e-02f, -1.922955116e-03f }, + { -3.769093228e-02f, +9.790252939e-01f, +6.049709048e-02f, -1.930629038e-03f }, + { -3.776009441e-02f, +9.789195701e-01f, +6.068126894e-02f, -1.938318888e-03f }, + { -3.782913069e-02f, +9.788135872e-01f, +6.086560401e-02f, -1.946024680e-03f }, + { -3.789804118e-02f, +9.787073453e-01f, +6.105009568e-02f, -1.953746425e-03f }, + { -3.796682595e-02f, +9.786008444e-01f, +6.123474396e-02f, -1.961484138e-03f }, + { -3.803548508e-02f, +9.784940847e-01f, +6.141954886e-02f, -1.969237830e-03f }, + { -3.810401864e-02f, +9.783870661e-01f, +6.160451036e-02f, -1.977007515e-03f }, + { -3.817242668e-02f, +9.782797888e-01f, +6.178962847e-02f, -1.984793206e-03f }, + { -3.824070929e-02f, +9.781722528e-01f, +6.197490319e-02f, -1.992594915e-03f }, + { -3.830886653e-02f, +9.780644583e-01f, +6.216033452e-02f, -2.000412656e-03f }, + { -3.837689847e-02f, +9.779564051e-01f, +6.234592246e-02f, -2.008246441e-03f }, + { -3.844480518e-02f, +9.778480935e-01f, +6.253166701e-02f, -2.016096283e-03f }, + { -3.851258673e-02f, +9.777395235e-01f, +6.271756817e-02f, -2.023962196e-03f }, + { -3.858024318e-02f, +9.776306952e-01f, +6.290362593e-02f, -2.031844191e-03f }, + { -3.864777462e-02f, +9.775216086e-01f, +6.308984030e-02f, -2.039742281e-03f }, + { -3.871518110e-02f, +9.774122638e-01f, +6.327621127e-02f, -2.047656480e-03f }, + { -3.878246270e-02f, +9.773026608e-01f, +6.346273885e-02f, -2.055586801e-03f }, + { -3.884961949e-02f, +9.771927998e-01f, +6.364942303e-02f, -2.063533255e-03f }, + { -3.891665153e-02f, +9.770826809e-01f, +6.383626381e-02f, -2.071495856e-03f }, + { -3.898355890e-02f, +9.769723040e-01f, +6.402326120e-02f, -2.079474617e-03f }, + { -3.905034167e-02f, +9.768616692e-01f, +6.421041518e-02f, -2.087469549e-03f }, + { -3.911699991e-02f, +9.767507766e-01f, +6.439772576e-02f, -2.095480667e-03f }, + { -3.918353368e-02f, +9.766396264e-01f, +6.458519293e-02f, -2.103507983e-03f }, + { -3.924994306e-02f, +9.765282185e-01f, +6.477281670e-02f, -2.111551509e-03f }, + { -3.931622812e-02f, +9.764165530e-01f, +6.496059705e-02f, -2.119611258e-03f }, + { -3.938238892e-02f, +9.763046301e-01f, +6.514853400e-02f, -2.127687243e-03f }, + { -3.944842554e-02f, +9.761924497e-01f, +6.533662753e-02f, -2.135779477e-03f }, + { -3.951433805e-02f, +9.760800119e-01f, +6.552487765e-02f, -2.143887971e-03f }, + { -3.958012651e-02f, +9.759673169e-01f, +6.571328435e-02f, -2.152012740e-03f }, + { -3.964579101e-02f, +9.758543646e-01f, +6.590184763e-02f, -2.160153795e-03f }, + { -3.971133160e-02f, +9.757411552e-01f, +6.609056749e-02f, -2.168311149e-03f }, + { -3.977674836e-02f, +9.756276888e-01f, +6.627944392e-02f, -2.176484815e-03f }, + { -3.984204137e-02f, +9.755139653e-01f, +6.646847692e-02f, -2.184674805e-03f }, + { -3.990721068e-02f, +9.753999849e-01f, +6.665766648e-02f, -2.192881133e-03f }, + { -3.997225637e-02f, +9.752857476e-01f, +6.684701262e-02f, -2.201103809e-03f }, + { -4.003717851e-02f, +9.751712536e-01f, +6.703651531e-02f, -2.209342848e-03f }, + { -4.010197718e-02f, +9.750565028e-01f, +6.722617456e-02f, -2.217598262e-03f }, + { -4.016665244e-02f, +9.749414954e-01f, +6.741599037e-02f, -2.225870062e-03f }, + { -4.023120436e-02f, +9.748262314e-01f, +6.760596272e-02f, -2.234158263e-03f }, + { -4.029563302e-02f, +9.747107110e-01f, +6.779609163e-02f, -2.242462875e-03f }, + { -4.035993848e-02f, +9.745949341e-01f, +6.798637707e-02f, -2.250783913e-03f }, + { -4.042412082e-02f, +9.744789009e-01f, +6.817681906e-02f, -2.259121387e-03f }, + { -4.048818011e-02f, +9.743626113e-01f, +6.836741758e-02f, -2.267475312e-03f }, + { -4.055211641e-02f, +9.742460656e-01f, +6.855817263e-02f, -2.275845698e-03f }, + { -4.061592981e-02f, +9.741292638e-01f, +6.874908421e-02f, -2.284232560e-03f }, + { -4.067962036e-02f, +9.740122059e-01f, +6.894015231e-02f, -2.292635908e-03f }, + { -4.074318815e-02f, +9.738948920e-01f, +6.913137692e-02f, -2.301055756e-03f }, + { -4.080663324e-02f, +9.737773222e-01f, +6.932275805e-02f, -2.309492116e-03f }, + { -4.086995570e-02f, +9.736594966e-01f, +6.951429569e-02f, -2.317945001e-03f }, + { -4.093315561e-02f, +9.735414153e-01f, +6.970598983e-02f, -2.326414422e-03f }, + { -4.099623304e-02f, +9.734230782e-01f, +6.989784046e-02f, -2.334900392e-03f }, + { -4.105918805e-02f, +9.733044855e-01f, +7.008984759e-02f, -2.343402924e-03f }, + { -4.112202073e-02f, +9.731856373e-01f, +7.028201121e-02f, -2.351922030e-03f }, + { -4.118473113e-02f, +9.730665337e-01f, +7.047433131e-02f, -2.360457723e-03f }, + { -4.124731934e-02f, +9.729471746e-01f, +7.066680788e-02f, -2.369010014e-03f }, + { -4.130978543e-02f, +9.728275603e-01f, +7.085944093e-02f, -2.377578915e-03f }, + { -4.137212946e-02f, +9.727076907e-01f, +7.105223044e-02f, -2.386164441e-03f }, + { -4.143435151e-02f, +9.725875660e-01f, +7.124517640e-02f, -2.394766601e-03f }, + { -4.149645164e-02f, +9.724671862e-01f, +7.143827882e-02f, -2.403385410e-03f }, + { -4.155842994e-02f, +9.723465513e-01f, +7.163153769e-02f, -2.412020878e-03f }, + { -4.162028648e-02f, +9.722256616e-01f, +7.182495300e-02f, -2.420673020e-03f }, + { -4.168202131e-02f, +9.721045170e-01f, +7.201852474e-02f, -2.429341845e-03f }, + { -4.174363453e-02f, +9.719831176e-01f, +7.221225291e-02f, -2.438027368e-03f }, + { -4.180512620e-02f, +9.718614635e-01f, +7.240613750e-02f, -2.446729599e-03f }, + { -4.186649638e-02f, +9.717395548e-01f, +7.260017851e-02f, -2.455448552e-03f }, + { -4.192774516e-02f, +9.716173916e-01f, +7.279437592e-02f, -2.464184239e-03f }, + { -4.198887261e-02f, +9.714949738e-01f, +7.298872973e-02f, -2.472936671e-03f }, + { -4.204987879e-02f, +9.713723017e-01f, +7.318323994e-02f, -2.481705861e-03f }, + { -4.211076378e-02f, +9.712493753e-01f, +7.337790653e-02f, -2.490491821e-03f }, + { -4.217152766e-02f, +9.711261947e-01f, +7.357272950e-02f, -2.499294563e-03f }, + { -4.223217049e-02f, +9.710027598e-01f, +7.376770885e-02f, -2.508114099e-03f }, + { -4.229269235e-02f, +9.708790709e-01f, +7.396284455e-02f, -2.516950442e-03f }, + { -4.235309331e-02f, +9.707551280e-01f, +7.415813662e-02f, -2.525803603e-03f }, + { -4.241337343e-02f, +9.706309312e-01f, +7.435358503e-02f, -2.534673595e-03f }, + { -4.247353281e-02f, +9.705064805e-01f, +7.454918978e-02f, -2.543560430e-03f }, + { -4.253357150e-02f, +9.703817761e-01f, +7.474495086e-02f, -2.552464119e-03f }, + { -4.259348958e-02f, +9.702568180e-01f, +7.494086827e-02f, -2.561384675e-03f }, + { -4.265328712e-02f, +9.701316062e-01f, +7.513694200e-02f, -2.570322110e-03f }, + { -4.271296420e-02f, +9.700061410e-01f, +7.533317203e-02f, -2.579276435e-03f }, + { -4.277252088e-02f, +9.698804222e-01f, +7.552955836e-02f, -2.588247664e-03f }, + { -4.283195724e-02f, +9.697544501e-01f, +7.572610098e-02f, -2.597235807e-03f }, + { -4.289127336e-02f, +9.696282248e-01f, +7.592279989e-02f, -2.606240877e-03f }, + { -4.295046931e-02f, +9.695017462e-01f, +7.611965506e-02f, -2.615262886e-03f }, + { -4.300954515e-02f, +9.693750144e-01f, +7.631666650e-02f, -2.624301846e-03f }, + { -4.306850096e-02f, +9.692480296e-01f, +7.651383420e-02f, -2.633357769e-03f }, + { -4.312733682e-02f, +9.691207919e-01f, +7.671115814e-02f, -2.642430666e-03f }, + { -4.318605280e-02f, +9.689933012e-01f, +7.690863832e-02f, -2.651520549e-03f }, + { -4.324464897e-02f, +9.688655578e-01f, +7.710627472e-02f, -2.660627431e-03f }, + { -4.330312541e-02f, +9.687375615e-01f, +7.730406734e-02f, -2.669751324e-03f }, + { -4.336148218e-02f, +9.686093127e-01f, +7.750201617e-02f, -2.678892238e-03f }, + { -4.341971936e-02f, +9.684808113e-01f, +7.770012120e-02f, -2.688050187e-03f }, + { -4.347783703e-02f, +9.683520574e-01f, +7.789838241e-02f, -2.697225181e-03f }, + { -4.353583525e-02f, +9.682230510e-01f, +7.809679980e-02f, -2.706417234e-03f }, + { -4.359371410e-02f, +9.680937924e-01f, +7.829537336e-02f, -2.715626355e-03f }, + { -4.365147366e-02f, +9.679642815e-01f, +7.849410308e-02f, -2.724852558e-03f }, + { -4.370911400e-02f, +9.678345184e-01f, +7.869298894e-02f, -2.734095855e-03f }, + { -4.376663518e-02f, +9.677045033e-01f, +7.889203094e-02f, -2.743356256e-03f }, + { -4.382403729e-02f, +9.675742361e-01f, +7.909122907e-02f, -2.752633774e-03f }, + { -4.388132040e-02f, +9.674437171e-01f, +7.929058330e-02f, -2.761928420e-03f }, + { -4.393848458e-02f, +9.673129462e-01f, +7.949009365e-02f, -2.771240206e-03f }, + { -4.399552991e-02f, +9.671819235e-01f, +7.968976008e-02f, -2.780569145e-03f }, + { -4.405245646e-02f, +9.670506492e-01f, +7.988958260e-02f, -2.789915247e-03f }, + { -4.410926430e-02f, +9.669191233e-01f, +8.008956119e-02f, -2.799278524e-03f }, + { -4.416595350e-02f, +9.667873459e-01f, +8.028969584e-02f, -2.808658988e-03f }, + { -4.422252415e-02f, +9.666553170e-01f, +8.048998653e-02f, -2.818056650e-03f }, + { -4.427897631e-02f, +9.665230369e-01f, +8.069043326e-02f, -2.827471523e-03f }, + { -4.433531006e-02f, +9.663905054e-01f, +8.089103602e-02f, -2.836903618e-03f }, + { -4.439152547e-02f, +9.662577228e-01f, +8.109179479e-02f, -2.846352946e-03f }, + { -4.444762262e-02f, +9.661246891e-01f, +8.129270955e-02f, -2.855819519e-03f }, + { -4.450360157e-02f, +9.659914044e-01f, +8.149378031e-02f, -2.865303349e-03f }, + { -4.455946242e-02f, +9.658578688e-01f, +8.169500704e-02f, -2.874804447e-03f }, + { -4.461520522e-02f, +9.657240824e-01f, +8.189638974e-02f, -2.884322825e-03f }, + { -4.467083005e-02f, +9.655900451e-01f, +8.209792838e-02f, -2.893858495e-03f }, + { -4.472633699e-02f, +9.654557573e-01f, +8.229962297e-02f, -2.903411467e-03f }, + { -4.478172612e-02f, +9.653212188e-01f, +8.250147348e-02f, -2.912981754e-03f }, + { -4.483699749e-02f, +9.651864298e-01f, +8.270347990e-02f, -2.922569366e-03f }, + { -4.489215120e-02f, +9.650513905e-01f, +8.290564223e-02f, -2.932174316e-03f }, + { -4.494718732e-02f, +9.649161008e-01f, +8.310796044e-02f, -2.941796615e-03f }, + { -4.500210591e-02f, +9.647805608e-01f, +8.331043452e-02f, -2.951436274e-03f }, + { -4.505690705e-02f, +9.646447707e-01f, +8.351306447e-02f, -2.961093304e-03f }, + { -4.511159083e-02f, +9.645087305e-01f, +8.371585026e-02f, -2.970767718e-03f }, + { -4.516615730e-02f, +9.643724404e-01f, +8.391879188e-02f, -2.980459527e-03f }, + { -4.522060655e-02f, +9.642359003e-01f, +8.412188933e-02f, -2.990168741e-03f }, + { -4.527493866e-02f, +9.640991104e-01f, +8.432514258e-02f, -2.999895373e-03f }, + { -4.532915369e-02f, +9.639620708e-01f, +8.452855162e-02f, -3.009639433e-03f }, + { -4.538325172e-02f, +9.638247816e-01f, +8.473211644e-02f, -3.019400934e-03f }, + { -4.543723283e-02f, +9.636872427e-01f, +8.493583703e-02f, -3.029179886e-03f }, + { -4.549109708e-02f, +9.635494545e-01f, +8.513971336e-02f, -3.038976300e-03f }, + { -4.554484457e-02f, +9.634114168e-01f, +8.534374543e-02f, -3.048790189e-03f }, + { -4.559847535e-02f, +9.632731298e-01f, +8.554793322e-02f, -3.058621563e-03f }, + { -4.565198951e-02f, +9.631345937e-01f, +8.575227672e-02f, -3.068470433e-03f }, + { -4.570538712e-02f, +9.629958084e-01f, +8.595677591e-02f, -3.078336812e-03f }, + { -4.575866826e-02f, +9.628567741e-01f, +8.616143077e-02f, -3.088220709e-03f }, + { -4.581183299e-02f, +9.627174908e-01f, +8.636624129e-02f, -3.098122137e-03f }, + { -4.586488140e-02f, +9.625779587e-01f, +8.657120747e-02f, -3.108041106e-03f }, + { -4.591781356e-02f, +9.624381778e-01f, +8.677632927e-02f, -3.117977628e-03f }, + { -4.597062955e-02f, +9.622981482e-01f, +8.698160668e-02f, -3.127931713e-03f }, + { -4.602332944e-02f, +9.621578700e-01f, +8.718703970e-02f, -3.137903374e-03f }, + { -4.607591330e-02f, +9.620173433e-01f, +8.739262830e-02f, -3.147892621e-03f }, + { -4.612838122e-02f, +9.618765682e-01f, +8.759837247e-02f, -3.157899465e-03f }, + { -4.618073326e-02f, +9.617355447e-01f, +8.780427220e-02f, -3.167923918e-03f }, + { -4.623296951e-02f, +9.615942731e-01f, +8.801032746e-02f, -3.177965990e-03f }, + { -4.628509003e-02f, +9.614527532e-01f, +8.821653824e-02f, -3.188025693e-03f }, + { -4.633709491e-02f, +9.613109853e-01f, +8.842290452e-02f, -3.198103037e-03f }, + { -4.638898421e-02f, +9.611689695e-01f, +8.862942629e-02f, -3.208198035e-03f }, + { -4.644075802e-02f, +9.610267057e-01f, +8.883610354e-02f, -3.218310696e-03f }, + { -4.649241641e-02f, +9.608841941e-01f, +8.904293624e-02f, -3.228441031e-03f }, + { -4.654395945e-02f, +9.607414349e-01f, +8.924992437e-02f, -3.238589053e-03f }, + { -4.659538723e-02f, +9.605984280e-01f, +8.945706793e-02f, -3.248754771e-03f }, + { -4.664669981e-02f, +9.604551736e-01f, +8.966436689e-02f, -3.258938197e-03f }, + { -4.669789727e-02f, +9.603116718e-01f, +8.987182124e-02f, -3.269139342e-03f }, + { -4.674897969e-02f, +9.601679226e-01f, +9.007943096e-02f, -3.279358217e-03f }, + { -4.679994715e-02f, +9.600239261e-01f, +9.028719604e-02f, -3.289594832e-03f }, + { -4.685079971e-02f, +9.598796825e-01f, +9.049511645e-02f, -3.299849199e-03f }, + { -4.690153746e-02f, +9.597351919e-01f, +9.070319217e-02f, -3.310121328e-03f }, + { -4.695216048e-02f, +9.595904542e-01f, +9.091142320e-02f, -3.320411230e-03f }, + { -4.700266883e-02f, +9.594454696e-01f, +9.111980950e-02f, -3.330718916e-03f }, + { -4.705306259e-02f, +9.593002383e-01f, +9.132835108e-02f, -3.341044398e-03f }, + { -4.710334184e-02f, +9.591547602e-01f, +9.153704790e-02f, -3.351387685e-03f }, + { -4.715350666e-02f, +9.590090355e-01f, +9.174589994e-02f, -3.361748789e-03f }, + { -4.720355712e-02f, +9.588630643e-01f, +9.195490720e-02f, -3.372127720e-03f }, + { -4.725349330e-02f, +9.587168467e-01f, +9.216406964e-02f, -3.382524489e-03f }, + { -4.730331527e-02f, +9.585703827e-01f, +9.237338726e-02f, -3.392939107e-03f }, + { -4.735302311e-02f, +9.584236724e-01f, +9.258286004e-02f, -3.403371585e-03f }, + { -4.740261690e-02f, +9.582767160e-01f, +9.279248795e-02f, -3.413821934e-03f }, + { -4.745209672e-02f, +9.581295136e-01f, +9.300227097e-02f, -3.424290163e-03f }, + { -4.750146263e-02f, +9.579820651e-01f, +9.321220909e-02f, -3.434776284e-03f }, + { -4.755071471e-02f, +9.578343708e-01f, +9.342230229e-02f, -3.445280308e-03f }, + { -4.759985305e-02f, +9.576864307e-01f, +9.363255055e-02f, -3.455802245e-03f }, + { -4.764887772e-02f, +9.575382449e-01f, +9.384295385e-02f, -3.466342106e-03f }, + { -4.769778879e-02f, +9.573898135e-01f, +9.405351217e-02f, -3.476899901e-03f }, + { -4.774658634e-02f, +9.572411365e-01f, +9.426422548e-02f, -3.487475641e-03f }, + { -4.779527045e-02f, +9.570922142e-01f, +9.447509378e-02f, -3.498069337e-03f }, + { -4.784384120e-02f, +9.569430465e-01f, +9.468611704e-02f, -3.508680999e-03f }, + { -4.789229866e-02f, +9.567936336e-01f, +9.489729524e-02f, -3.519310638e-03f }, + { -4.794064290e-02f, +9.566439756e-01f, +9.510862835e-02f, -3.529958264e-03f }, + { -4.798887401e-02f, +9.564940726e-01f, +9.532011637e-02f, -3.540623888e-03f }, + { -4.803699206e-02f, +9.563439245e-01f, +9.553175927e-02f, -3.551307520e-03f }, + { -4.808499713e-02f, +9.561935317e-01f, +9.574355703e-02f, -3.562009171e-03f }, + { -4.813288929e-02f, +9.560428941e-01f, +9.595550962e-02f, -3.572728851e-03f }, + { -4.818066862e-02f, +9.558920118e-01f, +9.616761703e-02f, -3.583466571e-03f }, + { -4.822833521e-02f, +9.557408849e-01f, +9.637987924e-02f, -3.594222342e-03f }, + { -4.827588911e-02f, +9.555895136e-01f, +9.659229622e-02f, -3.604996173e-03f }, + { -4.832333042e-02f, +9.554378979e-01f, +9.680486796e-02f, -3.615788075e-03f }, + { -4.837065921e-02f, +9.552860379e-01f, +9.701759443e-02f, -3.626598058e-03f }, + { -4.841787556e-02f, +9.551339337e-01f, +9.723047561e-02f, -3.637426133e-03f }, + { -4.846497954e-02f, +9.549815854e-01f, +9.744351149e-02f, -3.648272311e-03f }, + { -4.851197123e-02f, +9.548289931e-01f, +9.765670203e-02f, -3.659136601e-03f }, + { -4.855885071e-02f, +9.546761570e-01f, +9.787004721e-02f, -3.670019013e-03f }, + { -4.860561805e-02f, +9.545230770e-01f, +9.808354703e-02f, -3.680919559e-03f }, + { -4.865227334e-02f, +9.543697533e-01f, +9.829720144e-02f, -3.691838248e-03f }, + { -4.869881664e-02f, +9.542161860e-01f, +9.851101044e-02f, -3.702775091e-03f }, + { -4.874524804e-02f, +9.540623752e-01f, +9.872497399e-02f, -3.713730097e-03f }, + { -4.879156762e-02f, +9.539083209e-01f, +9.893909208e-02f, -3.724703278e-03f }, + { -4.883777544e-02f, +9.537540234e-01f, +9.915336469e-02f, -3.735694643e-03f }, + { -4.888387160e-02f, +9.535994826e-01f, +9.936779178e-02f, -3.746704203e-03f }, + { -4.892985616e-02f, +9.534446987e-01f, +9.958237334e-02f, -3.757731967e-03f }, + { -4.897572920e-02f, +9.532896717e-01f, +9.979710935e-02f, -3.768777946e-03f }, + { -4.902149080e-02f, +9.531344018e-01f, +1.000119998e-01f, -3.779842151e-03f }, + { -4.906714105e-02f, +9.529788891e-01f, +1.002270446e-01f, -3.790924590e-03f }, + { -4.911268001e-02f, +9.528231336e-01f, +1.004422438e-01f, -3.802025274e-03f }, + { -4.915810776e-02f, +9.526671355e-01f, +1.006575974e-01f, -3.813144214e-03f }, + { -4.920342438e-02f, +9.525108949e-01f, +1.008731053e-01f, -3.824281419e-03f }, + { -4.924862995e-02f, +9.523544118e-01f, +1.010887674e-01f, -3.835436900e-03f }, + { -4.929372455e-02f, +9.521976863e-01f, +1.013045839e-01f, -3.846610666e-03f }, + { -4.933870825e-02f, +9.520407186e-01f, +1.015205546e-01f, -3.857802728e-03f }, + { -4.938358114e-02f, +9.518835087e-01f, +1.017366796e-01f, -3.869013095e-03f }, + { -4.942834328e-02f, +9.517260568e-01f, +1.019529588e-01f, -3.880241778e-03f }, + { -4.947299476e-02f, +9.515683630e-01f, +1.021693921e-01f, -3.891488786e-03f }, + { -4.951753566e-02f, +9.514104273e-01f, +1.023859797e-01f, -3.902754129e-03f }, + { -4.956196605e-02f, +9.512522498e-01f, +1.026027213e-01f, -3.914037818e-03f }, + { -4.960628601e-02f, +9.510938306e-01f, +1.028196171e-01f, -3.925339862e-03f }, + { -4.965049562e-02f, +9.509351700e-01f, +1.030366669e-01f, -3.936660271e-03f }, + { -4.969459496e-02f, +9.507762678e-01f, +1.032538708e-01f, -3.947999054e-03f }, + { -4.973858410e-02f, +9.506171243e-01f, +1.034712288e-01f, -3.959356223e-03f }, + { -4.978246313e-02f, +9.504577395e-01f, +1.036887408e-01f, -3.970731786e-03f }, + { -4.982623211e-02f, +9.502981136e-01f, +1.039064067e-01f, -3.982125754e-03f }, + { -4.986989114e-02f, +9.501382466e-01f, +1.041242266e-01f, -3.993538136e-03f }, + { -4.991344028e-02f, +9.499781386e-01f, +1.043422005e-01f, -4.004968942e-03f }, + { -4.995687962e-02f, +9.498177898e-01f, +1.045603282e-01f, -4.016418182e-03f }, + { -5.000020923e-02f, +9.496572003e-01f, +1.047786099e-01f, -4.027885865e-03f }, + { -5.004342920e-02f, +9.494963700e-01f, +1.049970454e-01f, -4.039372002e-03f }, + { -5.008653959e-02f, +9.493352993e-01f, +1.052156347e-01f, -4.050876601e-03f }, + { -5.012954049e-02f, +9.491739880e-01f, +1.054343779e-01f, -4.062399673e-03f }, + { -5.017243198e-02f, +9.490124364e-01f, +1.056532748e-01f, -4.073941228e-03f }, + { -5.021521414e-02f, +9.488506446e-01f, +1.058723254e-01f, -4.085501274e-03f }, + { -5.025788704e-02f, +9.486886126e-01f, +1.060915299e-01f, -4.097079822e-03f }, + { -5.030045076e-02f, +9.485263405e-01f, +1.063108880e-01f, -4.108676881e-03f }, + { -5.034290538e-02f, +9.483638285e-01f, +1.065303997e-01f, -4.120292461e-03f }, + { -5.038525098e-02f, +9.482010767e-01f, +1.067500652e-01f, -4.131926571e-03f }, + { -5.042748764e-02f, +9.480380851e-01f, +1.069698842e-01f, -4.143579220e-03f }, + { -5.046961543e-02f, +9.478748538e-01f, +1.071898568e-01f, -4.155250420e-03f }, + { -5.051163444e-02f, +9.477113830e-01f, +1.074099830e-01f, -4.166940178e-03f }, + { -5.055354474e-02f, +9.475476728e-01f, +1.076302628e-01f, -4.178648505e-03f }, + { -5.059534642e-02f, +9.473837233e-01f, +1.078506960e-01f, -4.190375409e-03f }, + { -5.063703954e-02f, +9.472195345e-01f, +1.080712828e-01f, -4.202120901e-03f }, + { -5.067862420e-02f, +9.470551065e-01f, +1.082920229e-01f, -4.213884989e-03f }, + { -5.072010046e-02f, +9.468904396e-01f, +1.085129166e-01f, -4.225667684e-03f }, + { -5.076146841e-02f, +9.467255337e-01f, +1.087339636e-01f, -4.237468994e-03f }, + { -5.080272812e-02f, +9.465603890e-01f, +1.089551640e-01f, -4.249288929e-03f }, + { -5.084387968e-02f, +9.463950056e-01f, +1.091765177e-01f, -4.261127499e-03f }, + { -5.088492316e-02f, +9.462293836e-01f, +1.093980247e-01f, -4.272984712e-03f }, + { -5.092585865e-02f, +9.460635230e-01f, +1.096196851e-01f, -4.284860578e-03f }, + { -5.096668621e-02f, +9.458974241e-01f, +1.098414987e-01f, -4.296755107e-03f }, + { -5.100740594e-02f, +9.457310868e-01f, +1.100634655e-01f, -4.308668306e-03f }, + { -5.104801790e-02f, +9.455645113e-01f, +1.102855855e-01f, -4.320600187e-03f }, + { -5.108852219e-02f, +9.453976978e-01f, +1.105078587e-01f, -4.332550758e-03f }, + { -5.112891887e-02f, +9.452306462e-01f, +1.107302850e-01f, -4.344520028e-03f }, + { -5.116920802e-02f, +9.450633568e-01f, +1.109528645e-01f, -4.356508006e-03f }, + { -5.120938973e-02f, +9.448958296e-01f, +1.111755970e-01f, -4.368514702e-03f }, + { -5.124946408e-02f, +9.447280647e-01f, +1.113984826e-01f, -4.380540125e-03f }, + { -5.128943114e-02f, +9.445600623e-01f, +1.116215212e-01f, -4.392584284e-03f }, + { -5.132929099e-02f, +9.443918223e-01f, +1.118447128e-01f, -4.404647188e-03f }, + { -5.136904371e-02f, +9.442233450e-01f, +1.120680573e-01f, -4.416728846e-03f }, + { -5.140868939e-02f, +9.440546305e-01f, +1.122915548e-01f, -4.428829267e-03f }, + { -5.144822810e-02f, +9.438856788e-01f, +1.125152052e-01f, -4.440948461e-03f }, + { -5.148765991e-02f, +9.437164901e-01f, +1.127390085e-01f, -4.453086436e-03f }, + { -5.152698491e-02f, +9.435470644e-01f, +1.129629646e-01f, -4.465243201e-03f }, + { -5.156620319e-02f, +9.433774019e-01f, +1.131870735e-01f, -4.477418765e-03f }, + { -5.160531481e-02f, +9.432075026e-01f, +1.134113352e-01f, -4.489613138e-03f }, + { -5.164431986e-02f, +9.430373667e-01f, +1.136357497e-01f, -4.501826329e-03f }, + { -5.168321841e-02f, +9.428669944e-01f, +1.138603169e-01f, -4.514058345e-03f }, + { -5.172201055e-02f, +9.426963856e-01f, +1.140850368e-01f, -4.526309197e-03f }, + { -5.176069636e-02f, +9.425255405e-01f, +1.143099093e-01f, -4.538578892e-03f }, + { -5.179927591e-02f, +9.423544592e-01f, +1.145349345e-01f, -4.550867441e-03f }, + { -5.183774929e-02f, +9.421831418e-01f, +1.147601122e-01f, -4.563174852e-03f }, + { -5.187611657e-02f, +9.420115885e-01f, +1.149854425e-01f, -4.575501133e-03f }, + { -5.191437783e-02f, +9.418397993e-01f, +1.152109254e-01f, -4.587846293e-03f }, + { -5.195253316e-02f, +9.416677743e-01f, +1.154365607e-01f, -4.600210342e-03f }, + { -5.199058263e-02f, +9.414955136e-01f, +1.156623486e-01f, -4.612593288e-03f }, + { -5.202852632e-02f, +9.413230174e-01f, +1.158882888e-01f, -4.624995140e-03f }, + { -5.206636432e-02f, +9.411502858e-01f, +1.161143815e-01f, -4.637415906e-03f }, + { -5.210409670e-02f, +9.409773188e-01f, +1.163406265e-01f, -4.649855595e-03f }, + { -5.214172354e-02f, +9.408041166e-01f, +1.165670239e-01f, -4.662314217e-03f }, + { -5.217924493e-02f, +9.406306792e-01f, +1.167935736e-01f, -4.674791779e-03f }, + { -5.221666093e-02f, +9.404570069e-01f, +1.170202755e-01f, -4.687288290e-03f }, + { -5.225397164e-02f, +9.402830997e-01f, +1.172471298e-01f, -4.699803759e-03f }, + { -5.229117713e-02f, +9.401089576e-01f, +1.174741362e-01f, -4.712338195e-03f }, + { -5.232827748e-02f, +9.399345809e-01f, +1.177012947e-01f, -4.724891606e-03f }, + { -5.236527277e-02f, +9.397599696e-01f, +1.179286055e-01f, -4.737464000e-03f }, + { -5.240216308e-02f, +9.395851238e-01f, +1.181560683e-01f, -4.750055387e-03f }, + { -5.243894849e-02f, +9.394100437e-01f, +1.183836832e-01f, -4.762665774e-03f }, + { -5.247562909e-02f, +9.392347294e-01f, +1.186114502e-01f, -4.775295171e-03f }, + { -5.251220495e-02f, +9.390591808e-01f, +1.188393692e-01f, -4.787943585e-03f }, + { -5.254867615e-02f, +9.388833983e-01f, +1.190674401e-01f, -4.800611026e-03f }, + { -5.258504277e-02f, +9.387073818e-01f, +1.192956630e-01f, -4.813297501e-03f }, + { -5.262130489e-02f, +9.385311316e-01f, +1.195240378e-01f, -4.826003020e-03f }, + { -5.265746259e-02f, +9.383546476e-01f, +1.197525644e-01f, -4.838727590e-03f }, + { -5.269351596e-02f, +9.381779301e-01f, +1.199812429e-01f, -4.851471219e-03f }, + { -5.272946506e-02f, +9.380009790e-01f, +1.202100732e-01f, -4.864233917e-03f }, + { -5.276531000e-02f, +9.378237946e-01f, +1.204390553e-01f, -4.877015692e-03f }, + { -5.280105083e-02f, +9.376463769e-01f, +1.206681891e-01f, -4.889816551e-03f }, + { -5.283668764e-02f, +9.374687261e-01f, +1.208974746e-01f, -4.902636504e-03f }, + { -5.287222052e-02f, +9.372908423e-01f, +1.211269118e-01f, -4.915475558e-03f }, + { -5.290764955e-02f, +9.371127255e-01f, +1.213565006e-01f, -4.928333721e-03f }, + { -5.294297479e-02f, +9.369343759e-01f, +1.215862410e-01f, -4.941211003e-03f }, + { -5.297819635e-02f, +9.367557936e-01f, +1.218161330e-01f, -4.954107411e-03f }, + { -5.301331428e-02f, +9.365769788e-01f, +1.220461765e-01f, -4.967022953e-03f }, + { -5.304832868e-02f, +9.363979314e-01f, +1.222763714e-01f, -4.979957637e-03f }, + { -5.308323963e-02f, +9.362186517e-01f, +1.225067179e-01f, -4.992911472e-03f }, + { -5.311804720e-02f, +9.360391397e-01f, +1.227372157e-01f, -5.005884466e-03f }, + { -5.315275148e-02f, +9.358593955e-01f, +1.229678649e-01f, -5.018876627e-03f }, + { -5.318735255e-02f, +9.356794194e-01f, +1.231986655e-01f, -5.031887963e-03f }, + { -5.322185049e-02f, +9.354992113e-01f, +1.234296174e-01f, -5.044918481e-03f }, + { -5.325624537e-02f, +9.353187714e-01f, +1.236607205e-01f, -5.057968191e-03f }, + { -5.329053728e-02f, +9.351380998e-01f, +1.238919749e-01f, -5.071037100e-03f }, + { -5.332472630e-02f, +9.349571966e-01f, +1.241233805e-01f, -5.084125216e-03f }, + { -5.335881251e-02f, +9.347760620e-01f, +1.243549372e-01f, -5.097232546e-03f }, + { -5.339279600e-02f, +9.345946960e-01f, +1.245866451e-01f, -5.110359100e-03f }, + { -5.342667683e-02f, +9.344130987e-01f, +1.248185041e-01f, -5.123504885e-03f }, + { -5.346045510e-02f, +9.342312704e-01f, +1.250505141e-01f, -5.136669908e-03f }, + { -5.349413088e-02f, +9.340492110e-01f, +1.252826751e-01f, -5.149854178e-03f }, + { -5.352770425e-02f, +9.338669207e-01f, +1.255149871e-01f, -5.163057703e-03f }, + { -5.356117530e-02f, +9.336843996e-01f, +1.257474501e-01f, -5.176280490e-03f }, + { -5.359454410e-02f, +9.335016478e-01f, +1.259800639e-01f, -5.189522547e-03f }, + { -5.362781074e-02f, +9.333186655e-01f, +1.262128286e-01f, -5.202783882e-03f }, + { -5.366097530e-02f, +9.331354527e-01f, +1.264457441e-01f, -5.216064503e-03f }, + { -5.369403785e-02f, +9.329520096e-01f, +1.266788105e-01f, -5.229364417e-03f }, + { -5.372699848e-02f, +9.327683363e-01f, +1.269120275e-01f, -5.242683633e-03f }, + { -5.375985728e-02f, +9.325844328e-01f, +1.271453953e-01f, -5.256022157e-03f }, + { -5.379261431e-02f, +9.324002994e-01f, +1.273789138e-01f, -5.269379998e-03f }, + { -5.382526966e-02f, +9.322159361e-01f, +1.276125829e-01f, -5.282757164e-03f }, + { -5.385782342e-02f, +9.320313430e-01f, +1.278464026e-01f, -5.296153661e-03f }, + { -5.389027566e-02f, +9.318465203e-01f, +1.280803728e-01f, -5.309569498e-03f }, + { -5.392262647e-02f, +9.316614680e-01f, +1.283144936e-01f, -5.323004682e-03f }, + { -5.395487592e-02f, +9.314761864e-01f, +1.285487648e-01f, -5.336459220e-03f }, + { -5.398702410e-02f, +9.312906754e-01f, +1.287831865e-01f, -5.349933121e-03f }, + { -5.401907109e-02f, +9.311049353e-01f, +1.290177586e-01f, -5.363426391e-03f }, + { -5.405101697e-02f, +9.309189660e-01f, +1.292524811e-01f, -5.376939039e-03f }, + { -5.408286181e-02f, +9.307327679e-01f, +1.294873538e-01f, -5.390471071e-03f }, + { -5.411460571e-02f, +9.305463408e-01f, +1.297223769e-01f, -5.404022496e-03f }, + { -5.414624875e-02f, +9.303596851e-01f, +1.299575502e-01f, -5.417593320e-03f }, + { -5.417779099e-02f, +9.301728008e-01f, +1.301928737e-01f, -5.431183551e-03f }, + { -5.420923253e-02f, +9.299856879e-01f, +1.304283474e-01f, -5.444793197e-03f }, + { -5.424057345e-02f, +9.297983467e-01f, +1.306639711e-01f, -5.458422264e-03f }, + { -5.427181382e-02f, +9.296107773e-01f, +1.308997450e-01f, -5.472070761e-03f }, + { -5.430295374e-02f, +9.294229797e-01f, +1.311356689e-01f, -5.485738694e-03f }, + { -5.433399327e-02f, +9.292349540e-01f, +1.313717428e-01f, -5.499426070e-03f }, + { -5.436493251e-02f, +9.290467005e-01f, +1.316079667e-01f, -5.513132898e-03f }, + { -5.439577153e-02f, +9.288582192e-01f, +1.318443405e-01f, -5.526859184e-03f }, + { -5.442651041e-02f, +9.286695102e-01f, +1.320808642e-01f, -5.540604935e-03f }, + { -5.445714924e-02f, +9.284805736e-01f, +1.323175377e-01f, -5.554370159e-03f }, + { -5.448768810e-02f, +9.282914097e-01f, +1.325543610e-01f, -5.568154863e-03f }, + { -5.451812706e-02f, +9.281020184e-01f, +1.327913341e-01f, -5.581959054e-03f }, + { -5.454846622e-02f, +9.279123998e-01f, +1.330284568e-01f, -5.595782739e-03f }, + { -5.457870565e-02f, +9.277225543e-01f, +1.332657293e-01f, -5.609625925e-03f }, + { -5.460884543e-02f, +9.275324817e-01f, +1.335031514e-01f, -5.623488619e-03f }, + { -5.463888565e-02f, +9.273421823e-01f, +1.337407230e-01f, -5.637370829e-03f }, + { -5.466882638e-02f, +9.271516562e-01f, +1.339784442e-01f, -5.651272561e-03f }, + { -5.469866771e-02f, +9.269609034e-01f, +1.342163150e-01f, -5.665193823e-03f }, + { -5.472840972e-02f, +9.267699242e-01f, +1.344543351e-01f, -5.679134621e-03f }, + { -5.475805249e-02f, +9.265787186e-01f, +1.346925048e-01f, -5.693094963e-03f }, + { -5.478759611e-02f, +9.263872867e-01f, +1.349308237e-01f, -5.707074854e-03f }, + { -5.481704064e-02f, +9.261956287e-01f, +1.351692920e-01f, -5.721074303e-03f }, + { -5.484638619e-02f, +9.260037447e-01f, +1.354079097e-01f, -5.735093317e-03f }, + { -5.487563282e-02f, +9.258116348e-01f, +1.356466765e-01f, -5.749131901e-03f }, + { -5.490478063e-02f, +9.256192991e-01f, +1.358855926e-01f, -5.763190063e-03f }, + { -5.493382968e-02f, +9.254267378e-01f, +1.361246578e-01f, -5.777267810e-03f }, + { -5.496278007e-02f, +9.252339509e-01f, +1.363638722e-01f, -5.791365148e-03f }, + { -5.499163187e-02f, +9.250409386e-01f, +1.366032356e-01f, -5.805482085e-03f }, + { -5.502038517e-02f, +9.248477010e-01f, +1.368427480e-01f, -5.819618626e-03f }, + { -5.504904005e-02f, +9.246542383e-01f, +1.370824095e-01f, -5.833774780e-03f }, + { -5.507759658e-02f, +9.244605504e-01f, +1.373222199e-01f, -5.847950552e-03f }, + { -5.510605486e-02f, +9.242666377e-01f, +1.375621792e-01f, -5.862145949e-03f }, + { -5.513441497e-02f, +9.240725001e-01f, +1.378022873e-01f, -5.876360977e-03f }, + { -5.516267698e-02f, +9.238781378e-01f, +1.380425443e-01f, -5.890595645e-03f }, + { -5.519084097e-02f, +9.236835509e-01f, +1.382829500e-01f, -5.904849957e-03f }, + { -5.521890704e-02f, +9.234887396e-01f, +1.385235045e-01f, -5.919123921e-03f }, + { -5.524687526e-02f, +9.232937039e-01f, +1.387642076e-01f, -5.933417543e-03f }, + { -5.527474572e-02f, +9.230984441e-01f, +1.390050594e-01f, -5.947730830e-03f }, + { -5.530251848e-02f, +9.229029601e-01f, +1.392460598e-01f, -5.962063788e-03f }, + { -5.533019365e-02f, +9.227072522e-01f, +1.394872087e-01f, -5.976416423e-03f }, + { -5.535777130e-02f, +9.225113204e-01f, +1.397285061e-01f, -5.990788743e-03f }, + { -5.538525151e-02f, +9.223151649e-01f, +1.399699520e-01f, -6.005180754e-03f }, + { -5.541263436e-02f, +9.221187858e-01f, +1.402115463e-01f, -6.019592461e-03f }, + { -5.543991994e-02f, +9.219221832e-01f, +1.404532889e-01f, -6.034023872e-03f }, + { -5.546710832e-02f, +9.217253573e-01f, +1.406951799e-01f, -6.048474993e-03f }, + { -5.549419960e-02f, +9.215283081e-01f, +1.409372192e-01f, -6.062945830e-03f }, + { -5.552119385e-02f, +9.213310358e-01f, +1.411794066e-01f, -6.077436389e-03f }, + { -5.554809115e-02f, +9.211335405e-01f, +1.414217423e-01f, -6.091946678e-03f }, + { -5.557489159e-02f, +9.209358223e-01f, +1.416642261e-01f, -6.106476701e-03f }, + { -5.560159525e-02f, +9.207378813e-01f, +1.419068580e-01f, -6.121026465e-03f }, + { -5.562820221e-02f, +9.205397178e-01f, +1.421496379e-01f, -6.135595977e-03f }, + { -5.565471255e-02f, +9.203413317e-01f, +1.423925658e-01f, -6.150185242e-03f }, + { -5.568112636e-02f, +9.201427233e-01f, +1.426356417e-01f, -6.164794268e-03f }, + { -5.570744371e-02f, +9.199438926e-01f, +1.428788655e-01f, -6.179423059e-03f }, + { -5.573366470e-02f, +9.197448398e-01f, +1.431222371e-01f, -6.194071622e-03f }, + { -5.575978940e-02f, +9.195455649e-01f, +1.433657566e-01f, -6.208739964e-03f }, + { -5.578581789e-02f, +9.193460682e-01f, +1.436094238e-01f, -6.223428090e-03f }, + { -5.581175026e-02f, +9.191463497e-01f, +1.438532387e-01f, -6.238136006e-03f }, + { -5.583758659e-02f, +9.189464096e-01f, +1.440972013e-01f, -6.252863718e-03f }, + { -5.586332696e-02f, +9.187462479e-01f, +1.443413115e-01f, -6.267611233e-03f }, + { -5.588897145e-02f, +9.185458649e-01f, +1.445855693e-01f, -6.282378556e-03f }, + { -5.591452015e-02f, +9.183452606e-01f, +1.448299746e-01f, -6.297165693e-03f }, + { -5.593997314e-02f, +9.181444351e-01f, +1.450745274e-01f, -6.311972650e-03f }, + { -5.596533050e-02f, +9.179433886e-01f, +1.453192276e-01f, -6.326799433e-03f }, + { -5.599059231e-02f, +9.177421213e-01f, +1.455640752e-01f, -6.341646048e-03f }, + { -5.601575866e-02f, +9.175406331e-01f, +1.458090702e-01f, -6.356512501e-03f }, + { -5.604082963e-02f, +9.173389243e-01f, +1.460542124e-01f, -6.371398797e-03f }, + { -5.606580530e-02f, +9.171369950e-01f, +1.462995018e-01f, -6.386304943e-03f }, + { -5.609068575e-02f, +9.169348454e-01f, +1.465449385e-01f, -6.401230944e-03f }, + { -5.611547107e-02f, +9.167324754e-01f, +1.467905223e-01f, -6.416176806e-03f }, + { -5.614016133e-02f, +9.165298853e-01f, +1.470362531e-01f, -6.431142534e-03f }, + { -5.616475663e-02f, +9.163270752e-01f, +1.472821311e-01f, -6.446128134e-03f }, + { -5.618925704e-02f, +9.161240451e-01f, +1.475281560e-01f, -6.461133612e-03f }, + { -5.621366265e-02f, +9.159207954e-01f, +1.477743278e-01f, -6.476158974e-03f }, + { -5.623797353e-02f, +9.157173259e-01f, +1.480206466e-01f, -6.491204225e-03f }, + { -5.626218978e-02f, +9.155136370e-01f, +1.482671122e-01f, -6.506269371e-03f }, + { -5.628631147e-02f, +9.153097287e-01f, +1.485137245e-01f, -6.521354417e-03f }, + { -5.631033869e-02f, +9.151056011e-01f, +1.487604837e-01f, -6.536459369e-03f }, + { -5.633427152e-02f, +9.149012543e-01f, +1.490073895e-01f, -6.551584232e-03f }, + { -5.635811004e-02f, +9.146966886e-01f, +1.492544420e-01f, -6.566729012e-03f }, + { -5.638185433e-02f, +9.144919040e-01f, +1.495016410e-01f, -6.581893714e-03f }, + { -5.640550448e-02f, +9.142869006e-01f, +1.497489866e-01f, -6.597078344e-03f }, + { -5.642906057e-02f, +9.140816786e-01f, +1.499964787e-01f, -6.612282907e-03f }, + { -5.645252268e-02f, +9.138762381e-01f, +1.502441173e-01f, -6.627507408e-03f }, + { -5.647589090e-02f, +9.136705792e-01f, +1.504919022e-01f, -6.642751853e-03f }, + { -5.649916531e-02f, +9.134647021e-01f, +1.507398335e-01f, -6.658016248e-03f }, + { -5.652234599e-02f, +9.132586068e-01f, +1.509879110e-01f, -6.673300597e-03f }, + { -5.654543302e-02f, +9.130522936e-01f, +1.512361348e-01f, -6.688604905e-03f }, + { -5.656842649e-02f, +9.128457625e-01f, +1.514845048e-01f, -6.703929179e-03f }, + { -5.659132648e-02f, +9.126390136e-01f, +1.517330210e-01f, -6.719273423e-03f }, + { -5.661413307e-02f, +9.124320471e-01f, +1.519816832e-01f, -6.734637642e-03f }, + { -5.663684634e-02f, +9.122248632e-01f, +1.522304914e-01f, -6.750021842e-03f }, + { -5.665946638e-02f, +9.120174619e-01f, +1.524794457e-01f, -6.765426027e-03f }, + { -5.668199328e-02f, +9.118098434e-01f, +1.527285458e-01f, -6.780850204e-03f }, + { -5.670442710e-02f, +9.116020078e-01f, +1.529777918e-01f, -6.796294376e-03f }, + { -5.672676795e-02f, +9.113939552e-01f, +1.532271837e-01f, -6.811758549e-03f }, + { -5.674901589e-02f, +9.111856858e-01f, +1.534767213e-01f, -6.827242728e-03f }, + { -5.677117101e-02f, +9.109771996e-01f, +1.537264047e-01f, -6.842746919e-03f }, + { -5.679323340e-02f, +9.107684969e-01f, +1.539762337e-01f, -6.858271125e-03f }, + { -5.681520314e-02f, +9.105595777e-01f, +1.542262084e-01f, -6.873815352e-03f }, + { -5.683708031e-02f, +9.103504422e-01f, +1.544763286e-01f, -6.889379605e-03f }, + { -5.685886499e-02f, +9.101410905e-01f, +1.547265943e-01f, -6.904963889e-03f }, + { -5.688055727e-02f, +9.099315228e-01f, +1.549770055e-01f, -6.920568209e-03f }, + { -5.690215723e-02f, +9.097217391e-01f, +1.552275620e-01f, -6.936192569e-03f }, + { -5.692366496e-02f, +9.095117396e-01f, +1.554782640e-01f, -6.951836974e-03f }, + { -5.694508053e-02f, +9.093015244e-01f, +1.557291112e-01f, -6.967501430e-03f }, + { -5.696640402e-02f, +9.090910937e-01f, +1.559801037e-01f, -6.983185940e-03f }, + { -5.698763554e-02f, +9.088804476e-01f, +1.562312413e-01f, -6.998890510e-03f }, + { -5.700877514e-02f, +9.086695861e-01f, +1.564825241e-01f, -7.014615145e-03f }, + { -5.702982292e-02f, +9.084585096e-01f, +1.567339520e-01f, -7.030359849e-03f }, + { -5.705077897e-02f, +9.082472180e-01f, +1.569855249e-01f, -7.046124626e-03f }, + { -5.707164336e-02f, +9.080357115e-01f, +1.572372428e-01f, -7.061909482e-03f }, + { -5.709241618e-02f, +9.078239902e-01f, +1.574891056e-01f, -7.077714420e-03f }, + { -5.711309750e-02f, +9.076120543e-01f, +1.577411133e-01f, -7.093539446e-03f }, + { -5.713368743e-02f, +9.073999039e-01f, +1.579932657e-01f, -7.109384565e-03f }, + { -5.715418602e-02f, +9.071875391e-01f, +1.582455630e-01f, -7.125249780e-03f }, + { -5.717459338e-02f, +9.069749601e-01f, +1.584980049e-01f, -7.141135096e-03f }, + { -5.719490958e-02f, +9.067621670e-01f, +1.587505915e-01f, -7.157040517e-03f }, + { -5.721513471e-02f, +9.065491599e-01f, +1.590033227e-01f, -7.172966049e-03f }, + { -5.723526885e-02f, +9.063359389e-01f, +1.592561984e-01f, -7.188911695e-03f }, + { -5.725531208e-02f, +9.061225043e-01f, +1.595092186e-01f, -7.204877460e-03f }, + { -5.727526448e-02f, +9.059088560e-01f, +1.597623832e-01f, -7.220863348e-03f }, + { -5.729512615e-02f, +9.056949943e-01f, +1.600156922e-01f, -7.236869364e-03f }, + { -5.731489716e-02f, +9.054809193e-01f, +1.602691455e-01f, -7.252895512e-03f }, + { -5.733457759e-02f, +9.052666311e-01f, +1.605227430e-01f, -7.268941796e-03f }, + { -5.735416753e-02f, +9.050521298e-01f, +1.607764848e-01f, -7.285008220e-03f }, + { -5.737366706e-02f, +9.048374156e-01f, +1.610303707e-01f, -7.301094788e-03f }, + { -5.739307627e-02f, +9.046224887e-01f, +1.612844007e-01f, -7.317201506e-03f }, + { -5.741239524e-02f, +9.044073490e-01f, +1.615385747e-01f, -7.333328376e-03f }, + { -5.743162405e-02f, +9.041919969e-01f, +1.617928927e-01f, -7.349475404e-03f }, + { -5.745076279e-02f, +9.039764323e-01f, +1.620473546e-01f, -7.365642593e-03f }, + { -5.746981153e-02f, +9.037606555e-01f, +1.623019604e-01f, -7.381829947e-03f }, + { -5.748877036e-02f, +9.035446666e-01f, +1.625567100e-01f, -7.398037471e-03f }, + { -5.750763937e-02f, +9.033284656e-01f, +1.628116034e-01f, -7.414265167e-03f }, + { -5.752641864e-02f, +9.031120528e-01f, +1.630666404e-01f, -7.430513042e-03f }, + { -5.754510825e-02f, +9.028954283e-01f, +1.633218211e-01f, -7.446781098e-03f }, + { -5.756370829e-02f, +9.026785922e-01f, +1.635771453e-01f, -7.463069339e-03f }, + { -5.758221883e-02f, +9.024615447e-01f, +1.638326131e-01f, -7.479377769e-03f }, + { -5.760063997e-02f, +9.022442858e-01f, +1.640882243e-01f, -7.495706392e-03f }, + { -5.761897178e-02f, +9.020268157e-01f, +1.643439789e-01f, -7.512055213e-03f }, + { -5.763721435e-02f, +9.018091345e-01f, +1.645998769e-01f, -7.528424234e-03f }, + { -5.765536777e-02f, +9.015912425e-01f, +1.648559182e-01f, -7.544813460e-03f }, + { -5.767343210e-02f, +9.013731396e-01f, +1.651121027e-01f, -7.561222894e-03f }, + { -5.769140745e-02f, +9.011548261e-01f, +1.653684303e-01f, -7.577652540e-03f }, + { -5.770929389e-02f, +9.009363021e-01f, +1.656249011e-01f, -7.594102403e-03f }, + { -5.772709151e-02f, +9.007175676e-01f, +1.658815150e-01f, -7.610572484e-03f }, + { -5.774480038e-02f, +9.004986230e-01f, +1.661382718e-01f, -7.627062789e-03f }, + { -5.776242060e-02f, +9.002794682e-01f, +1.663951716e-01f, -7.643573321e-03f }, + { -5.777995224e-02f, +9.000601034e-01f, +1.666522142e-01f, -7.660104084e-03f }, + { -5.779739540e-02f, +8.998405288e-01f, +1.669093997e-01f, -7.676655080e-03f }, + { -5.781475014e-02f, +8.996207445e-01f, +1.671667279e-01f, -7.693226314e-03f }, + { -5.783201657e-02f, +8.994007506e-01f, +1.674241988e-01f, -7.709817790e-03f }, + { -5.784919475e-02f, +8.991805472e-01f, +1.676818124e-01f, -7.726429509e-03f }, + { -5.786628478e-02f, +8.989601346e-01f, +1.679395686e-01f, -7.743061477e-03f }, + { -5.788328673e-02f, +8.987395128e-01f, +1.681974672e-01f, -7.759713697e-03f }, + { -5.790020070e-02f, +8.985186819e-01f, +1.684555084e-01f, -7.776386171e-03f }, + { -5.791702676e-02f, +8.982976422e-01f, +1.687136919e-01f, -7.793078904e-03f }, + { -5.793376500e-02f, +8.980763937e-01f, +1.689720178e-01f, -7.809791898e-03f }, + { -5.795041550e-02f, +8.978549365e-01f, +1.692304860e-01f, -7.826525157e-03f }, + { -5.796697834e-02f, +8.976332709e-01f, +1.694890963e-01f, -7.843278685e-03f }, + { -5.798345361e-02f, +8.974113969e-01f, +1.697478489e-01f, -7.860052484e-03f }, + { -5.799984140e-02f, +8.971893148e-01f, +1.700067435e-01f, -7.876846558e-03f }, + { -5.801614178e-02f, +8.969670245e-01f, +1.702657802e-01f, -7.893660909e-03f }, + { -5.803235484e-02f, +8.967445263e-01f, +1.705249588e-01f, -7.910495542e-03f }, + { -5.804848066e-02f, +8.965218203e-01f, +1.707842794e-01f, -7.927350459e-03f }, + { -5.806451933e-02f, +8.962989066e-01f, +1.710437419e-01f, -7.944225664e-03f }, + { -5.808047093e-02f, +8.960757854e-01f, +1.713033461e-01f, -7.961121159e-03f }, + { -5.809633554e-02f, +8.958524568e-01f, +1.715630920e-01f, -7.978036948e-03f }, + { -5.811211325e-02f, +8.956289209e-01f, +1.718229797e-01f, -7.994973033e-03f }, + { -5.812780414e-02f, +8.954051779e-01f, +1.720830089e-01f, -8.011929418e-03f }, + { -5.814340830e-02f, +8.951812279e-01f, +1.723431797e-01f, -8.028906105e-03f }, + { -5.815892580e-02f, +8.949570711e-01f, +1.726034920e-01f, -8.045903098e-03f }, + { -5.817435673e-02f, +8.947327076e-01f, +1.728639457e-01f, -8.062920399e-03f }, + { -5.818970119e-02f, +8.945081375e-01f, +1.731245407e-01f, -8.079958012e-03f }, + { -5.820495924e-02f, +8.942833610e-01f, +1.733852771e-01f, -8.097015938e-03f }, + { -5.822013097e-02f, +8.940583782e-01f, +1.736461547e-01f, -8.114094182e-03f }, + { -5.823521647e-02f, +8.938331892e-01f, +1.739071734e-01f, -8.131192745e-03f }, + { -5.825021582e-02f, +8.936077942e-01f, +1.741683333e-01f, -8.148311631e-03f }, + { -5.826512910e-02f, +8.933821934e-01f, +1.744296343e-01f, -8.165450843e-03f }, + { -5.827995640e-02f, +8.931563868e-01f, +1.746910762e-01f, -8.182610382e-03f }, + { -5.829469780e-02f, +8.929303746e-01f, +1.749526590e-01f, -8.199790252e-03f }, + { -5.830935339e-02f, +8.927041569e-01f, +1.752143827e-01f, -8.216990455e-03f }, + { -5.832392325e-02f, +8.924777339e-01f, +1.754762472e-01f, -8.234210994e-03f }, + { -5.833840746e-02f, +8.922511057e-01f, +1.757382524e-01f, -8.251451871e-03f }, + { -5.835280610e-02f, +8.920242725e-01f, +1.760003983e-01f, -8.268713090e-03f }, + { -5.836711927e-02f, +8.917972344e-01f, +1.762626848e-01f, -8.285994652e-03f }, + { -5.838134704e-02f, +8.915699915e-01f, +1.765251119e-01f, -8.303296561e-03f }, + { -5.839548949e-02f, +8.913425440e-01f, +1.767876794e-01f, -8.320618817e-03f }, + { -5.840954672e-02f, +8.911148920e-01f, +1.770503873e-01f, -8.337961425e-03f }, + { -5.842351880e-02f, +8.908870357e-01f, +1.773132356e-01f, -8.355324387e-03f }, + { -5.843740582e-02f, +8.906589751e-01f, +1.775762242e-01f, -8.372707704e-03f }, + { -5.845120786e-02f, +8.904307105e-01f, +1.778393529e-01f, -8.390111379e-03f }, + { -5.846492501e-02f, +8.902022419e-01f, +1.781026219e-01f, -8.407535414e-03f }, + { -5.847855735e-02f, +8.899735696e-01f, +1.783660309e-01f, -8.424979813e-03f }, + { -5.849210496e-02f, +8.897446936e-01f, +1.786295800e-01f, -8.442444576e-03f }, + { -5.850556793e-02f, +8.895156142e-01f, +1.788932690e-01f, -8.459929707e-03f }, + { -5.851894634e-02f, +8.892863313e-01f, +1.791570979e-01f, -8.477435207e-03f }, + { -5.853224028e-02f, +8.890568452e-01f, +1.794210666e-01f, -8.494961078e-03f }, + { -5.854544983e-02f, +8.888271561e-01f, +1.796851751e-01f, -8.512507324e-03f }, + { -5.855857506e-02f, +8.885972640e-01f, +1.799494234e-01f, -8.530073945e-03f }, + { -5.857161608e-02f, +8.883671691e-01f, +1.802138112e-01f, -8.547660944e-03f }, + { -5.858457295e-02f, +8.881368715e-01f, +1.804783386e-01f, -8.565268323e-03f }, + { -5.859744577e-02f, +8.879063714e-01f, +1.807430055e-01f, -8.582896084e-03f }, + { -5.861023462e-02f, +8.876756689e-01f, +1.810078118e-01f, -8.600544229e-03f }, + { -5.862293958e-02f, +8.874447642e-01f, +1.812727576e-01f, -8.618212759e-03f }, + { -5.863556073e-02f, +8.872136574e-01f, +1.815378426e-01f, -8.635901678e-03f }, + { -5.864809816e-02f, +8.869823487e-01f, +1.818030668e-01f, -8.653610986e-03f }, + { -5.866055196e-02f, +8.867508381e-01f, +1.820684302e-01f, -8.671340686e-03f }, + { -5.867292220e-02f, +8.865191259e-01f, +1.823339328e-01f, -8.689090780e-03f }, + { -5.868520898e-02f, +8.862872121e-01f, +1.825995743e-01f, -8.706861268e-03f }, + { -5.869741236e-02f, +8.860550970e-01f, +1.828653548e-01f, -8.724652154e-03f }, + { -5.870953245e-02f, +8.858227806e-01f, +1.831312743e-01f, -8.742463438e-03f }, + { -5.872156932e-02f, +8.855902631e-01f, +1.833973325e-01f, -8.760295123e-03f }, + { -5.873352306e-02f, +8.853575446e-01f, +1.836635296e-01f, -8.778147210e-03f }, + { -5.874539374e-02f, +8.851246253e-01f, +1.839298653e-01f, -8.796019700e-03f }, + { -5.875718146e-02f, +8.848915054e-01f, +1.841963397e-01f, -8.813912596e-03f }, + { -5.876888630e-02f, +8.846581849e-01f, +1.844629526e-01f, -8.831825899e-03f }, + { -5.878050834e-02f, +8.844246640e-01f, +1.847297040e-01f, -8.849759611e-03f }, + { -5.879204767e-02f, +8.841909429e-01f, +1.849965939e-01f, -8.867713732e-03f }, + { -5.880350436e-02f, +8.839570217e-01f, +1.852636221e-01f, -8.885688265e-03f }, + { -5.881487851e-02f, +8.837229005e-01f, +1.855307886e-01f, -8.903683211e-03f }, + { -5.882617019e-02f, +8.834885795e-01f, +1.857980933e-01f, -8.921698572e-03f }, + { -5.883737950e-02f, +8.832540589e-01f, +1.860655362e-01f, -8.939734348e-03f }, + { -5.884850651e-02f, +8.830193387e-01f, +1.863331172e-01f, -8.957790542e-03f }, + { -5.885955131e-02f, +8.827844191e-01f, +1.866008361e-01f, -8.975867154e-03f }, + { -5.887051398e-02f, +8.825493003e-01f, +1.868686931e-01f, -8.993964185e-03f }, + { -5.888139461e-02f, +8.823139824e-01f, +1.871366879e-01f, -9.012081638e-03f }, + { -5.889219328e-02f, +8.820784655e-01f, +1.874048205e-01f, -9.030219514e-03f }, + { -5.890291007e-02f, +8.818427498e-01f, +1.876730909e-01f, -9.048377812e-03f }, + { -5.891354507e-02f, +8.816068354e-01f, +1.879414989e-01f, -9.066556536e-03f }, + { -5.892409837e-02f, +8.813707226e-01f, +1.882100446e-01f, -9.084755685e-03f }, + { -5.893457003e-02f, +8.811344113e-01f, +1.884787277e-01f, -9.102975262e-03f }, + { -5.894496016e-02f, +8.808979018e-01f, +1.887475484e-01f, -9.121215266e-03f }, + { -5.895526884e-02f, +8.806611943e-01f, +1.890165064e-01f, -9.139475700e-03f }, + { -5.896549614e-02f, +8.804242888e-01f, +1.892856017e-01f, -9.157756564e-03f }, + { -5.897564215e-02f, +8.801871854e-01f, +1.895548343e-01f, -9.176057859e-03f }, + { -5.898570696e-02f, +8.799498845e-01f, +1.898242041e-01f, -9.194379586e-03f }, + { -5.899569065e-02f, +8.797123860e-01f, +1.900937110e-01f, -9.212721746e-03f }, + { -5.900559330e-02f, +8.794746902e-01f, +1.903633550e-01f, -9.231084340e-03f }, + { -5.901541499e-02f, +8.792367971e-01f, +1.906331359e-01f, -9.249467369e-03f }, + { -5.902515582e-02f, +8.789987070e-01f, +1.909030537e-01f, -9.267870833e-03f }, + { -5.903481587e-02f, +8.787604199e-01f, +1.911731083e-01f, -9.286294734e-03f }, + { -5.904439521e-02f, +8.785219361e-01f, +1.914432997e-01f, -9.304739072e-03f }, + { -5.905389393e-02f, +8.782832556e-01f, +1.917136278e-01f, -9.323203848e-03f }, + { -5.906331213e-02f, +8.780443786e-01f, +1.919840925e-01f, -9.341689062e-03f }, + { -5.907264987e-02f, +8.778053053e-01f, +1.922546937e-01f, -9.360194716e-03f }, + { -5.908190725e-02f, +8.775660358e-01f, +1.925254314e-01f, -9.378720810e-03f }, + { -5.909108434e-02f, +8.773265703e-01f, +1.927963055e-01f, -9.397267344e-03f }, + { -5.910018124e-02f, +8.770869088e-01f, +1.930673159e-01f, -9.415834320e-03f }, + { -5.910919802e-02f, +8.768470516e-01f, +1.933384626e-01f, -9.434421737e-03f }, + { -5.911813478e-02f, +8.766069987e-01f, +1.936097455e-01f, -9.453029596e-03f }, + { -5.912699159e-02f, +8.763667504e-01f, +1.938811645e-01f, -9.471657898e-03f }, + { -5.913576853e-02f, +8.761263068e-01f, +1.941527195e-01f, -9.490306643e-03f }, + { -5.914446570e-02f, +8.758856680e-01f, +1.944244105e-01f, -9.508975831e-03f }, + { -5.915308317e-02f, +8.756448342e-01f, +1.946962373e-01f, -9.527665464e-03f }, + { -5.916162104e-02f, +8.754038055e-01f, +1.949682000e-01f, -9.546375540e-03f }, + { -5.917007938e-02f, +8.751625821e-01f, +1.952402985e-01f, -9.565106062e-03f }, + { -5.917845827e-02f, +8.749211640e-01f, +1.955125326e-01f, -9.583857028e-03f }, + { -5.918675781e-02f, +8.746795516e-01f, +1.957849023e-01f, -9.602628439e-03f }, + { -5.919497807e-02f, +8.744377448e-01f, +1.960574076e-01f, -9.621420295e-03f }, + { -5.920311914e-02f, +8.741957439e-01f, +1.963300483e-01f, -9.640232597e-03f }, + { -5.921118110e-02f, +8.739535491e-01f, +1.966028244e-01f, -9.659065344e-03f }, + { -5.921916404e-02f, +8.737111603e-01f, +1.968757357e-01f, -9.677918538e-03f }, + { -5.922706804e-02f, +8.734685779e-01f, +1.971487824e-01f, -9.696792177e-03f }, + { -5.923489319e-02f, +8.732258019e-01f, +1.974219642e-01f, -9.715686262e-03f }, + { -5.924263957e-02f, +8.729828325e-01f, +1.976952810e-01f, -9.734600793e-03f }, + { -5.925030726e-02f, +8.727396699e-01f, +1.979687329e-01f, -9.753535770e-03f }, + { -5.925789634e-02f, +8.724963141e-01f, +1.982423197e-01f, -9.772491192e-03f }, + { -5.926540690e-02f, +8.722527654e-01f, +1.985160414e-01f, -9.791467061e-03f }, + { -5.927283903e-02f, +8.720090239e-01f, +1.987898979e-01f, -9.810463375e-03f }, + { -5.928019281e-02f, +8.717650897e-01f, +1.990638891e-01f, -9.829480135e-03f }, + { -5.928746832e-02f, +8.715209630e-01f, +1.993380149e-01f, -9.848517340e-03f }, + { -5.929466565e-02f, +8.712766439e-01f, +1.996122753e-01f, -9.867574990e-03f }, + { -5.930178487e-02f, +8.710321326e-01f, +1.998866701e-01f, -9.886653086e-03f }, + { -5.930882608e-02f, +8.707874293e-01f, +2.001611994e-01f, -9.905751626e-03f }, + { -5.931578936e-02f, +8.705425340e-01f, +2.004358631e-01f, -9.924870610e-03f }, + { -5.932267479e-02f, +8.702974470e-01f, +2.007106609e-01f, -9.944010038e-03f }, + { -5.932948245e-02f, +8.700521683e-01f, +2.009855930e-01f, -9.963169910e-03f }, + { -5.933621243e-02f, +8.698066982e-01f, +2.012606592e-01f, -9.982350225e-03f }, + { -5.934286482e-02f, +8.695610368e-01f, +2.015358594e-01f, -1.000155098e-02f }, + { -5.934943969e-02f, +8.693151841e-01f, +2.018111936e-01f, -1.002077218e-02f }, + { -5.935593714e-02f, +8.690691405e-01f, +2.020866616e-01f, -1.004001383e-02f }, + { -5.936235724e-02f, +8.688229060e-01f, +2.023622635e-01f, -1.005927591e-02f }, + { -5.936870008e-02f, +8.685764808e-01f, +2.026379991e-01f, -1.007855843e-02f }, + { -5.937496574e-02f, +8.683298650e-01f, +2.029138683e-01f, -1.009786140e-02f }, + { -5.938115430e-02f, +8.680830587e-01f, +2.031898712e-01f, -1.011718480e-02f }, + { -5.938726586e-02f, +8.678360622e-01f, +2.034660075e-01f, -1.013652864e-02f }, + { -5.939330049e-02f, +8.675888756e-01f, +2.037422772e-01f, -1.015589292e-02f }, + { -5.939925828e-02f, +8.673414990e-01f, +2.040186803e-01f, -1.017527764e-02f }, + { -5.940513931e-02f, +8.670939326e-01f, +2.042952167e-01f, -1.019468279e-02f }, + { -5.941094367e-02f, +8.668461765e-01f, +2.045718862e-01f, -1.021410838e-02f }, + { -5.941667144e-02f, +8.665982309e-01f, +2.048486889e-01f, -1.023355441e-02f }, + { -5.942232269e-02f, +8.663500959e-01f, +2.051256246e-01f, -1.025302087e-02f }, + { -5.942789753e-02f, +8.661017718e-01f, +2.054026933e-01f, -1.027250776e-02f }, + { -5.943339603e-02f, +8.658532585e-01f, +2.056798948e-01f, -1.029201508e-02f }, + { -5.943881827e-02f, +8.656045563e-01f, +2.059572292e-01f, -1.031154284e-02f }, + { -5.944416434e-02f, +8.653556654e-01f, +2.062346962e-01f, -1.033109103e-02f }, + { -5.944943433e-02f, +8.651065858e-01f, +2.065122959e-01f, -1.035065964e-02f }, + { -5.945462831e-02f, +8.648573178e-01f, +2.067900282e-01f, -1.037024868e-02f }, + { -5.945974637e-02f, +8.646078615e-01f, +2.070678930e-01f, -1.038985815e-02f }, + { -5.946478859e-02f, +8.643582170e-01f, +2.073458902e-01f, -1.040948805e-02f }, + { -5.946975506e-02f, +8.641083845e-01f, +2.076240197e-01f, -1.042913837e-02f }, + { -5.947464586e-02f, +8.638583642e-01f, +2.079022815e-01f, -1.044880911e-02f }, + { -5.947946108e-02f, +8.636081562e-01f, +2.081806754e-01f, -1.046850028e-02f }, + { -5.948420080e-02f, +8.633577606e-01f, +2.084592015e-01f, -1.048821187e-02f }, + { -5.948886510e-02f, +8.631071776e-01f, +2.087378595e-01f, -1.050794387e-02f }, + { -5.949345407e-02f, +8.628564073e-01f, +2.090166495e-01f, -1.052769630e-02f }, + { -5.949796779e-02f, +8.626054500e-01f, +2.092955714e-01f, -1.054746914e-02f }, + { -5.950240634e-02f, +8.623543057e-01f, +2.095746250e-01f, -1.056726239e-02f }, + { -5.950676981e-02f, +8.621029746e-01f, +2.098538103e-01f, -1.058707606e-02f }, + { -5.951105828e-02f, +8.618514569e-01f, +2.101331273e-01f, -1.060691015e-02f }, + { -5.951527184e-02f, +8.615997527e-01f, +2.104125758e-01f, -1.062676464e-02f }, + { -5.951941056e-02f, +8.613478622e-01f, +2.106921557e-01f, -1.064663954e-02f }, + { -5.952347454e-02f, +8.610957855e-01f, +2.109718671e-01f, -1.066653486e-02f }, + { -5.952746386e-02f, +8.608435227e-01f, +2.112517097e-01f, -1.068645057e-02f }, + { -5.953137860e-02f, +8.605910741e-01f, +2.115316835e-01f, -1.070638669e-02f }, + { -5.953521884e-02f, +8.603384398e-01f, +2.118117885e-01f, -1.072634322e-02f }, + { -5.953898467e-02f, +8.600856199e-01f, +2.120920245e-01f, -1.074632015e-02f }, + { -5.954267617e-02f, +8.598326146e-01f, +2.123723915e-01f, -1.076631747e-02f }, + { -5.954629343e-02f, +8.595794240e-01f, +2.126528894e-01f, -1.078633519e-02f }, + { -5.954983652e-02f, +8.593260484e-01f, +2.129335181e-01f, -1.080637331e-02f }, + { -5.955330554e-02f, +8.590724878e-01f, +2.132142776e-01f, -1.082643182e-02f }, + { -5.955670057e-02f, +8.588187423e-01f, +2.134951677e-01f, -1.084651073e-02f }, + { -5.956002168e-02f, +8.585648123e-01f, +2.137761883e-01f, -1.086661002e-02f }, + { -5.956326897e-02f, +8.583106977e-01f, +2.140573395e-01f, -1.088672970e-02f }, + { -5.956644252e-02f, +8.580563988e-01f, +2.143386210e-01f, -1.090686977e-02f }, + { -5.956954241e-02f, +8.578019157e-01f, +2.146200329e-01f, -1.092703022e-02f }, + { -5.957256872e-02f, +8.575472486e-01f, +2.149015750e-01f, -1.094721106e-02f }, + { -5.957552154e-02f, +8.572923976e-01f, +2.151832473e-01f, -1.096741227e-02f }, + { -5.957840096e-02f, +8.570373629e-01f, +2.154650497e-01f, -1.098763386e-02f }, + { -5.958120705e-02f, +8.567821446e-01f, +2.157469820e-01f, -1.100787583e-02f }, + { -5.958393990e-02f, +8.565267430e-01f, +2.160290443e-01f, -1.102813817e-02f }, + { -5.958659959e-02f, +8.562711580e-01f, +2.163112364e-01f, -1.104842088e-02f }, + { -5.958918621e-02f, +8.560153900e-01f, +2.165935582e-01f, -1.106872396e-02f }, + { -5.959169984e-02f, +8.557594390e-01f, +2.168760097e-01f, -1.108904740e-02f }, + { -5.959414057e-02f, +8.555033052e-01f, +2.171585908e-01f, -1.110939121e-02f }, + { -5.959650847e-02f, +8.552469888e-01f, +2.174413013e-01f, -1.112975538e-02f }, + { -5.959880364e-02f, +8.549904899e-01f, +2.177241413e-01f, -1.115013991e-02f }, + { -5.960102614e-02f, +8.547338087e-01f, +2.180071107e-01f, -1.117054480e-02f }, + { -5.960317608e-02f, +8.544769453e-01f, +2.182902092e-01f, -1.119097004e-02f }, + { -5.960525353e-02f, +8.542198999e-01f, +2.185734369e-01f, -1.121141563e-02f }, + { -5.960725858e-02f, +8.539626726e-01f, +2.188567938e-01f, -1.123188157e-02f }, + { -5.960919130e-02f, +8.537052637e-01f, +2.191402796e-01f, -1.125236786e-02f }, + { -5.961105179e-02f, +8.534476731e-01f, +2.194238943e-01f, -1.127287449e-02f }, + { -5.961284013e-02f, +8.531899012e-01f, +2.197076378e-01f, -1.129340147e-02f }, + { -5.961455639e-02f, +8.529319481e-01f, +2.199915101e-01f, -1.131394878e-02f }, + { -5.961620067e-02f, +8.526738139e-01f, +2.202755110e-01f, -1.133451643e-02f }, + { -5.961777305e-02f, +8.524154987e-01f, +2.205596406e-01f, -1.135510441e-02f }, + { -5.961927360e-02f, +8.521570028e-01f, +2.208438986e-01f, -1.137571272e-02f }, + { -5.962070242e-02f, +8.518983262e-01f, +2.211282850e-01f, -1.139634135e-02f }, + { -5.962205959e-02f, +8.516394693e-01f, +2.214127997e-01f, -1.141699032e-02f }, + { -5.962334519e-02f, +8.513804320e-01f, +2.216974426e-01f, -1.143765960e-02f }, + { -5.962455930e-02f, +8.511212145e-01f, +2.219822138e-01f, -1.145834920e-02f }, + { -5.962570201e-02f, +8.508618171e-01f, +2.222671129e-01f, -1.147905912e-02f }, + { -5.962677341e-02f, +8.506022399e-01f, +2.225521401e-01f, -1.149978935e-02f }, + { -5.962777357e-02f, +8.503424830e-01f, +2.228372951e-01f, -1.152053989e-02f }, + { -5.962870257e-02f, +8.500825465e-01f, +2.231225780e-01f, -1.154131073e-02f }, + { -5.962956051e-02f, +8.498224307e-01f, +2.234079885e-01f, -1.156210188e-02f }, + { -5.963034747e-02f, +8.495621358e-01f, +2.236935267e-01f, -1.158291333e-02f }, + { -5.963106352e-02f, +8.493016617e-01f, +2.239791925e-01f, -1.160374507e-02f }, + { -5.963170876e-02f, +8.490410088e-01f, +2.242649857e-01f, -1.162459711e-02f }, + { -5.963228326e-02f, +8.487801771e-01f, +2.245509063e-01f, -1.164546944e-02f }, + { -5.963278711e-02f, +8.485191669e-01f, +2.248369542e-01f, -1.166636205e-02f }, + { -5.963322039e-02f, +8.482579783e-01f, +2.251231293e-01f, -1.168727495e-02f }, + { -5.963358319e-02f, +8.479966114e-01f, +2.254094315e-01f, -1.170820813e-02f }, + { -5.963387559e-02f, +8.477350664e-01f, +2.256958607e-01f, -1.172916159e-02f }, + { -5.963409767e-02f, +8.474733435e-01f, +2.259824169e-01f, -1.175013531e-02f }, + { -5.963424952e-02f, +8.472114428e-01f, +2.262690999e-01f, -1.177112931e-02f }, + { -5.963433122e-02f, +8.469493644e-01f, +2.265559097e-01f, -1.179214358e-02f }, + { -5.963434285e-02f, +8.466871086e-01f, +2.268428462e-01f, -1.181317810e-02f }, + { -5.963428449e-02f, +8.464246755e-01f, +2.271299092e-01f, -1.183423289e-02f }, + { -5.963415624e-02f, +8.461620653e-01f, +2.274170988e-01f, -1.185530793e-02f }, + { -5.963395817e-02f, +8.458992780e-01f, +2.277044148e-01f, -1.187640322e-02f }, + { -5.963369036e-02f, +8.456363139e-01f, +2.279918571e-01f, -1.189751876e-02f }, + { -5.963335291e-02f, +8.453731732e-01f, +2.282794257e-01f, -1.191865455e-02f }, + { -5.963294588e-02f, +8.451098559e-01f, +2.285671204e-01f, -1.193981057e-02f }, + { -5.963246938e-02f, +8.448463623e-01f, +2.288549412e-01f, -1.196098683e-02f }, + { -5.963192347e-02f, +8.445826924e-01f, +2.291428879e-01f, -1.198218333e-02f }, + { -5.963130824e-02f, +8.443188466e-01f, +2.294309606e-01f, -1.200340005e-02f }, + { -5.963062378e-02f, +8.440548248e-01f, +2.297191590e-01f, -1.202463700e-02f }, + { -5.962987017e-02f, +8.437906274e-01f, +2.300074831e-01f, -1.204589416e-02f }, + { -5.962904749e-02f, +8.435262543e-01f, +2.302959329e-01f, -1.206717155e-02f }, + { -5.962815583e-02f, +8.432617059e-01f, +2.305845082e-01f, -1.208846914e-02f }, + { -5.962719526e-02f, +8.429969822e-01f, +2.308732090e-01f, -1.210978695e-02f }, + { -5.962616588e-02f, +8.427320835e-01f, +2.311620351e-01f, -1.213112496e-02f }, + { -5.962506776e-02f, +8.424670098e-01f, +2.314509865e-01f, -1.215248317e-02f }, + { -5.962390099e-02f, +8.422017613e-01f, +2.317400630e-01f, -1.217386158e-02f }, + { -5.962266566e-02f, +8.419363383e-01f, +2.320292646e-01f, -1.219526018e-02f }, + { -5.962136183e-02f, +8.416707408e-01f, +2.323185913e-01f, -1.221667896e-02f }, + { -5.961998961e-02f, +8.414049690e-01f, +2.326080428e-01f, -1.223811793e-02f }, + { -5.961854906e-02f, +8.411390231e-01f, +2.328976192e-01f, -1.225957708e-02f }, + { -5.961704028e-02f, +8.408729033e-01f, +2.331873202e-01f, -1.228105640e-02f }, + { -5.961546335e-02f, +8.406066096e-01f, +2.334771460e-01f, -1.230255589e-02f }, + { -5.961381834e-02f, +8.403401423e-01f, +2.337670962e-01f, -1.232407555e-02f }, + { -5.961210535e-02f, +8.400735015e-01f, +2.340571709e-01f, -1.234561537e-02f }, + { -5.961032446e-02f, +8.398066874e-01f, +2.343473700e-01f, -1.236717535e-02f }, + { -5.960847575e-02f, +8.395397001e-01f, +2.346376934e-01f, -1.238875548e-02f }, + { -5.960655929e-02f, +8.392725398e-01f, +2.349281409e-01f, -1.241035575e-02f }, + { -5.960457519e-02f, +8.390052067e-01f, +2.352187125e-01f, -1.243197617e-02f }, + { -5.960252351e-02f, +8.387377009e-01f, +2.355094081e-01f, -1.245361672e-02f }, + { -5.960040434e-02f, +8.384700225e-01f, +2.358002277e-01f, -1.247527741e-02f }, + { -5.959821777e-02f, +8.382021718e-01f, +2.360911710e-01f, -1.249695823e-02f }, + { -5.959596388e-02f, +8.379341490e-01f, +2.363822381e-01f, -1.251865917e-02f }, + { -5.959364274e-02f, +8.376659540e-01f, +2.366734288e-01f, -1.254038023e-02f }, + { -5.959125445e-02f, +8.373975872e-01f, +2.369647431e-01f, -1.256212141e-02f }, + { -5.958879909e-02f, +8.371290487e-01f, +2.372561808e-01f, -1.258388269e-02f }, + { -5.958627674e-02f, +8.368603387e-01f, +2.375477418e-01f, -1.260566408e-02f }, + { -5.958368747e-02f, +8.365914572e-01f, +2.378394262e-01f, -1.262746557e-02f }, + { -5.958103139e-02f, +8.363224045e-01f, +2.381312337e-01f, -1.264928715e-02f }, + { -5.957830856e-02f, +8.360531808e-01f, +2.384231642e-01f, -1.267112882e-02f }, + { -5.957551907e-02f, +8.357837861e-01f, +2.387152178e-01f, -1.269299057e-02f }, + { -5.957266301e-02f, +8.355142207e-01f, +2.390073943e-01f, -1.271487241e-02f }, + { -5.956974045e-02f, +8.352444848e-01f, +2.392996936e-01f, -1.273677432e-02f }, + { -5.956675149e-02f, +8.349745784e-01f, +2.395921155e-01f, -1.275869629e-02f }, + { -5.956369619e-02f, +8.347045017e-01f, +2.398846601e-01f, -1.278063833e-02f }, + { -5.956057466e-02f, +8.344342550e-01f, +2.401773273e-01f, -1.280260043e-02f }, + { -5.955738696e-02f, +8.341638383e-01f, +2.404701168e-01f, -1.282458258e-02f }, + { -5.955413318e-02f, +8.338932518e-01f, +2.407630287e-01f, -1.284658477e-02f }, + { -5.955081340e-02f, +8.336224957e-01f, +2.410560629e-01f, -1.286860701e-02f }, + { -5.954742771e-02f, +8.333515702e-01f, +2.413492191e-01f, -1.289064929e-02f }, + { -5.954397620e-02f, +8.330804754e-01f, +2.416424975e-01f, -1.291271159e-02f }, + { -5.954045893e-02f, +8.328092115e-01f, +2.419358978e-01f, -1.293479392e-02f }, + { -5.953687600e-02f, +8.325377786e-01f, +2.422294200e-01f, -1.295689627e-02f }, + { -5.953322748e-02f, +8.322661770e-01f, +2.425230639e-01f, -1.297901864e-02f }, + { -5.952951347e-02f, +8.319944067e-01f, +2.428168296e-01f, -1.300116101e-02f }, + { -5.952573404e-02f, +8.317224679e-01f, +2.431107168e-01f, -1.302332339e-02f }, + { -5.952188928e-02f, +8.314503608e-01f, +2.434047255e-01f, -1.304550576e-02f }, + { -5.951797926e-02f, +8.311780856e-01f, +2.436988556e-01f, -1.306770813e-02f }, + { -5.951400408e-02f, +8.309056424e-01f, +2.439931070e-01f, -1.308993048e-02f }, + { -5.950996381e-02f, +8.306330313e-01f, +2.442874796e-01f, -1.311217281e-02f }, + { -5.950585853e-02f, +8.303602527e-01f, +2.445819733e-01f, -1.313443511e-02f }, + { -5.950168834e-02f, +8.300873065e-01f, +2.448765881e-01f, -1.315671739e-02f }, + { -5.949745330e-02f, +8.298141930e-01f, +2.451713237e-01f, -1.317901962e-02f }, + { -5.949315351e-02f, +8.295409124e-01f, +2.454661802e-01f, -1.320134181e-02f }, + { -5.948878905e-02f, +8.292674647e-01f, +2.457611574e-01f, -1.322368395e-02f }, + { -5.948436000e-02f, +8.289938502e-01f, +2.460562553e-01f, -1.324604604e-02f }, + { -5.947986644e-02f, +8.287200691e-01f, +2.463514737e-01f, -1.326842806e-02f }, + { -5.947530845e-02f, +8.284461214e-01f, +2.466468125e-01f, -1.329083001e-02f }, + { -5.947068612e-02f, +8.281720074e-01f, +2.469422717e-01f, -1.331325190e-02f }, + { -5.946599953e-02f, +8.278977272e-01f, +2.472378511e-01f, -1.333569370e-02f }, + { -5.946124877e-02f, +8.276232810e-01f, +2.475335507e-01f, -1.335815541e-02f }, + { -5.945643390e-02f, +8.273486689e-01f, +2.478293703e-01f, -1.338063703e-02f }, + { -5.945155503e-02f, +8.270738912e-01f, +2.481253099e-01f, -1.340313855e-02f }, + { -5.944661222e-02f, +8.267989479e-01f, +2.484213694e-01f, -1.342565996e-02f }, + { -5.944160557e-02f, +8.265238393e-01f, +2.487175486e-01f, -1.344820127e-02f }, + { -5.943653515e-02f, +8.262485655e-01f, +2.490138475e-01f, -1.347076245e-02f }, + { -5.943140104e-02f, +8.259731267e-01f, +2.493102660e-01f, -1.349334351e-02f }, + { -5.942620334e-02f, +8.256975230e-01f, +2.496068040e-01f, -1.351594444e-02f }, + { -5.942094212e-02f, +8.254217546e-01f, +2.499034613e-01f, -1.353856523e-02f }, + { -5.941561746e-02f, +8.251458217e-01f, +2.502002379e-01f, -1.356120587e-02f }, + { -5.941022944e-02f, +8.248697244e-01f, +2.504971337e-01f, -1.358386636e-02f }, + { -5.940477816e-02f, +8.245934629e-01f, +2.507941486e-01f, -1.360654670e-02f }, + { -5.939926369e-02f, +8.243170373e-01f, +2.510912825e-01f, -1.362924687e-02f }, + { -5.939368611e-02f, +8.240404479e-01f, +2.513885353e-01f, -1.365196686e-02f }, + { -5.938804550e-02f, +8.237636948e-01f, +2.516859068e-01f, -1.367470668e-02f }, + { -5.938234196e-02f, +8.234867781e-01f, +2.519833971e-01f, -1.369746632e-02f }, + { -5.937657555e-02f, +8.232096981e-01f, +2.522810059e-01f, -1.372024576e-02f }, + { -5.937074636e-02f, +8.229324548e-01f, +2.525787333e-01f, -1.374304500e-02f }, + { -5.936485448e-02f, +8.226550485e-01f, +2.528765790e-01f, -1.376586404e-02f }, + { -5.935889999e-02f, +8.223774794e-01f, +2.531745431e-01f, -1.378870286e-02f }, + { -5.935288297e-02f, +8.220997475e-01f, +2.534726253e-01f, -1.381156147e-02f }, + { -5.934680349e-02f, +8.218218531e-01f, +2.537708257e-01f, -1.383443984e-02f }, + { -5.934066165e-02f, +8.215437962e-01f, +2.540691440e-01f, -1.385733799e-02f }, + { -5.933445753e-02f, +8.212655772e-01f, +2.543675803e-01f, -1.388025589e-02f }, + { -5.932819120e-02f, +8.209871961e-01f, +2.546661344e-01f, -1.390319354e-02f }, + { -5.932186275e-02f, +8.207086532e-01f, +2.549648062e-01f, -1.392615094e-02f }, + { -5.931547226e-02f, +8.204299485e-01f, +2.552635955e-01f, -1.394912807e-02f }, + { -5.930901982e-02f, +8.201510823e-01f, +2.555625024e-01f, -1.397212493e-02f }, + { -5.930250550e-02f, +8.198720547e-01f, +2.558615267e-01f, -1.399514152e-02f }, + { -5.929592939e-02f, +8.195928658e-01f, +2.561606683e-01f, -1.401817782e-02f }, + { -5.928929157e-02f, +8.193135159e-01f, +2.564599271e-01f, -1.404123383e-02f }, + { -5.928259213e-02f, +8.190340052e-01f, +2.567593031e-01f, -1.406430953e-02f }, + { -5.927583113e-02f, +8.187543337e-01f, +2.570587960e-01f, -1.408740493e-02f }, + { -5.926900867e-02f, +8.184745017e-01f, +2.573584058e-01f, -1.411052002e-02f }, + { -5.926212483e-02f, +8.181945092e-01f, +2.576581325e-01f, -1.413365478e-02f }, + { -5.925517969e-02f, +8.179143566e-01f, +2.579579758e-01f, -1.415680921e-02f }, + { -5.924817333e-02f, +8.176340439e-01f, +2.582579358e-01f, -1.417998331e-02f }, + { -5.924110584e-02f, +8.173535714e-01f, +2.585580122e-01f, -1.420317705e-02f }, + { -5.923397729e-02f, +8.170729391e-01f, +2.588582051e-01f, -1.422639045e-02f }, + { -5.922678777e-02f, +8.167921473e-01f, +2.591585142e-01f, -1.424962348e-02f }, + { -5.921953735e-02f, +8.165111960e-01f, +2.594589396e-01f, -1.427287614e-02f }, + { -5.921222613e-02f, +8.162300856e-01f, +2.597594810e-01f, -1.429614843e-02f }, + { -5.920485418e-02f, +8.159488162e-01f, +2.600601385e-01f, -1.431944033e-02f }, + { -5.919742158e-02f, +8.156673878e-01f, +2.603609118e-01f, -1.434275184e-02f }, + { -5.918992842e-02f, +8.153858007e-01f, +2.606618010e-01f, -1.436608295e-02f }, + { -5.918237478e-02f, +8.151040551e-01f, +2.609628058e-01f, -1.438943365e-02f }, + { -5.917476074e-02f, +8.148221512e-01f, +2.612639263e-01f, -1.441280393e-02f }, + { -5.916708638e-02f, +8.145400890e-01f, +2.615651622e-01f, -1.443619379e-02f }, + { -5.915935179e-02f, +8.142578688e-01f, +2.618665135e-01f, -1.445960321e-02f }, + { -5.915155704e-02f, +8.139754907e-01f, +2.621679801e-01f, -1.448303220e-02f }, + { -5.914370221e-02f, +8.136929549e-01f, +2.624695618e-01f, -1.450648073e-02f }, + { -5.913578740e-02f, +8.134102615e-01f, +2.627712587e-01f, -1.452994881e-02f }, + { -5.912781267e-02f, +8.131274108e-01f, +2.630730705e-01f, -1.455343641e-02f }, + { -5.911977812e-02f, +8.128444029e-01f, +2.633749972e-01f, -1.457694355e-02f }, + { -5.911168382e-02f, +8.125612380e-01f, +2.636770386e-01f, -1.460047020e-02f }, + { -5.910352985e-02f, +8.122779162e-01f, +2.639791948e-01f, -1.462401636e-02f }, + { -5.909531630e-02f, +8.119944377e-01f, +2.642814655e-01f, -1.464758202e-02f }, + { -5.908704325e-02f, +8.117108027e-01f, +2.645838506e-01f, -1.467116717e-02f }, + { -5.907871078e-02f, +8.114270114e-01f, +2.648863501e-01f, -1.469477181e-02f }, + { -5.907031897e-02f, +8.111430638e-01f, +2.651889639e-01f, -1.471839591e-02f }, + { -5.906186790e-02f, +8.108589603e-01f, +2.654916918e-01f, -1.474203949e-02f }, + { -5.905335765e-02f, +8.105747008e-01f, +2.657945338e-01f, -1.476570252e-02f }, + { -5.904478831e-02f, +8.102902857e-01f, +2.660974897e-01f, -1.478938500e-02f }, + { -5.903615996e-02f, +8.100057151e-01f, +2.664005594e-01f, -1.481308692e-02f }, + { -5.902747268e-02f, +8.097209892e-01f, +2.667037429e-01f, -1.483680827e-02f }, + { -5.901872654e-02f, +8.094361081e-01f, +2.670070400e-01f, -1.486054904e-02f }, + { -5.900992164e-02f, +8.091510719e-01f, +2.673104506e-01f, -1.488430923e-02f }, + { -5.900105805e-02f, +8.088658810e-01f, +2.676139746e-01f, -1.490808882e-02f }, + { -5.899213585e-02f, +8.085805354e-01f, +2.679176120e-01f, -1.493188780e-02f }, + { -5.898315513e-02f, +8.082950352e-01f, +2.682213626e-01f, -1.495570618e-02f }, + { -5.897411596e-02f, +8.080093808e-01f, +2.685252263e-01f, -1.497954392e-02f }, + { -5.896501843e-02f, +8.077235722e-01f, +2.688292029e-01f, -1.500340104e-02f }, + { -5.895586262e-02f, +8.074376096e-01f, +2.691332925e-01f, -1.502727751e-02f }, + { -5.894664861e-02f, +8.071514932e-01f, +2.694374949e-01f, -1.505117334e-02f }, + { -5.893737648e-02f, +8.068652231e-01f, +2.697418099e-01f, -1.507508850e-02f }, + { -5.892804632e-02f, +8.065787996e-01f, +2.700462376e-01f, -1.509902300e-02f }, + { -5.891865819e-02f, +8.062922227e-01f, +2.703507777e-01f, -1.512297682e-02f }, + { -5.890921220e-02f, +8.060054928e-01f, +2.706554301e-01f, -1.514694995e-02f }, + { -5.889970841e-02f, +8.057186098e-01f, +2.709601949e-01f, -1.517094238e-02f }, + { -5.889014690e-02f, +8.054315741e-01f, +2.712650718e-01f, -1.519495411e-02f }, + { -5.888052777e-02f, +8.051443857e-01f, +2.715700607e-01f, -1.521898512e-02f }, + { -5.887085108e-02f, +8.048570449e-01f, +2.718751616e-01f, -1.524303541e-02f }, + { -5.886111692e-02f, +8.045695518e-01f, +2.721803743e-01f, -1.526710496e-02f }, + { -5.885132538e-02f, +8.042819066e-01f, +2.724856987e-01f, -1.529119377e-02f }, + { -5.884147653e-02f, +8.039941094e-01f, +2.727911348e-01f, -1.531530183e-02f }, + { -5.883157045e-02f, +8.037061604e-01f, +2.730966824e-01f, -1.533942912e-02f }, + { -5.882160722e-02f, +8.034180599e-01f, +2.734023414e-01f, -1.536357563e-02f }, + { -5.881158693e-02f, +8.031298079e-01f, +2.737081117e-01f, -1.538774137e-02f }, + { -5.880150966e-02f, +8.028414047e-01f, +2.740139932e-01f, -1.541192631e-02f }, + { -5.879137549e-02f, +8.025528503e-01f, +2.743199858e-01f, -1.543613045e-02f }, + { -5.878118449e-02f, +8.022641451e-01f, +2.746260894e-01f, -1.546035377e-02f }, + { -5.877093675e-02f, +8.019752891e-01f, +2.749323038e-01f, -1.548459628e-02f }, + { -5.876063235e-02f, +8.016862825e-01f, +2.752386291e-01f, -1.550885795e-02f }, + { -5.875027137e-02f, +8.013971255e-01f, +2.755450649e-01f, -1.553313878e-02f }, + { -5.873985390e-02f, +8.011078183e-01f, +2.758516114e-01f, -1.555743875e-02f }, + { -5.872938000e-02f, +8.008183610e-01f, +2.761582682e-01f, -1.558175787e-02f }, + { -5.871884977e-02f, +8.005287538e-01f, +2.764650354e-01f, -1.560609611e-02f }, + { -5.870826329e-02f, +8.002389969e-01f, +2.767719129e-01f, -1.563045347e-02f }, + { -5.869762062e-02f, +7.999490904e-01f, +2.770789004e-01f, -1.565482993e-02f }, + { -5.868692187e-02f, +7.996590346e-01f, +2.773859980e-01f, -1.567922549e-02f }, + { -5.867616710e-02f, +7.993688295e-01f, +2.776932054e-01f, -1.570364014e-02f }, + { -5.866535639e-02f, +7.990784754e-01f, +2.780005227e-01f, -1.572807386e-02f }, + { -5.865448983e-02f, +7.987879725e-01f, +2.783079496e-01f, -1.575252665e-02f }, + { -5.864356750e-02f, +7.984973209e-01f, +2.786154861e-01f, -1.577699850e-02f }, + { -5.863258948e-02f, +7.982065207e-01f, +2.789231321e-01f, -1.580148939e-02f }, + { -5.862155585e-02f, +7.979155722e-01f, +2.792308874e-01f, -1.582599931e-02f }, + { -5.861046669e-02f, +7.976244755e-01f, +2.795387520e-01f, -1.585052826e-02f }, + { -5.859932207e-02f, +7.973332308e-01f, +2.798467258e-01f, -1.587507622e-02f }, + { -5.858812209e-02f, +7.970418383e-01f, +2.801548085e-01f, -1.589964318e-02f }, + { -5.857686682e-02f, +7.967502981e-01f, +2.804630002e-01f, -1.592422914e-02f }, + { -5.856555634e-02f, +7.964586105e-01f, +2.807713007e-01f, -1.594883407e-02f }, + { -5.855419074e-02f, +7.961667755e-01f, +2.810797098e-01f, -1.597345798e-02f }, + { -5.854277008e-02f, +7.958747933e-01f, +2.813882276e-01f, -1.599810084e-02f }, + { -5.853129446e-02f, +7.955826642e-01f, +2.816968539e-01f, -1.602276266e-02f }, + { -5.851976395e-02f, +7.952903884e-01f, +2.820055885e-01f, -1.604744341e-02f }, + { -5.850817864e-02f, +7.949979658e-01f, +2.823144314e-01f, -1.607214309e-02f }, + { -5.849653859e-02f, +7.947053969e-01f, +2.826233824e-01f, -1.609686168e-02f }, + { -5.848484391e-02f, +7.944126816e-01f, +2.829324415e-01f, -1.612159918e-02f }, + { -5.847309465e-02f, +7.941198202e-01f, +2.832416085e-01f, -1.614635558e-02f }, + { -5.846129092e-02f, +7.938268129e-01f, +2.835508833e-01f, -1.617113085e-02f }, + { -5.844943277e-02f, +7.935336599e-01f, +2.838602658e-01f, -1.619592500e-02f }, + { -5.843752031e-02f, +7.932403612e-01f, +2.841697559e-01f, -1.622073801e-02f }, + { -5.842555359e-02f, +7.929469172e-01f, +2.844793535e-01f, -1.624556986e-02f }, + { -5.841353272e-02f, +7.926533279e-01f, +2.847890584e-01f, -1.627042056e-02f }, + { -5.840145776e-02f, +7.923595935e-01f, +2.850988707e-01f, -1.629529008e-02f }, + { -5.838932879e-02f, +7.920657142e-01f, +2.854087900e-01f, -1.632017842e-02f }, + { -5.837714590e-02f, +7.917716902e-01f, +2.857188164e-01f, -1.634508556e-02f }, + { -5.836490917e-02f, +7.914775217e-01f, +2.860289498e-01f, -1.637001149e-02f }, + { -5.835261867e-02f, +7.911832088e-01f, +2.863391899e-01f, -1.639495620e-02f }, + { -5.834027449e-02f, +7.908887516e-01f, +2.866495368e-01f, -1.641991969e-02f }, + { -5.832787671e-02f, +7.905941505e-01f, +2.869599902e-01f, -1.644490193e-02f }, + { -5.831542540e-02f, +7.902994055e-01f, +2.872705501e-01f, -1.646990291e-02f }, + { -5.830292065e-02f, +7.900045168e-01f, +2.875812164e-01f, -1.649492264e-02f }, + { -5.829036253e-02f, +7.897094846e-01f, +2.878919890e-01f, -1.651996108e-02f }, + { -5.827775113e-02f, +7.894143091e-01f, +2.882028676e-01f, -1.654501824e-02f }, + { -5.826508653e-02f, +7.891189904e-01f, +2.885138523e-01f, -1.657009409e-02f }, + { -5.825236880e-02f, +7.888235287e-01f, +2.888249429e-01f, -1.659518863e-02f }, + { -5.823959802e-02f, +7.885279242e-01f, +2.891361394e-01f, -1.662030185e-02f }, + { -5.822677428e-02f, +7.882321771e-01f, +2.894474415e-01f, -1.664543373e-02f }, + { -5.821389766e-02f, +7.879362875e-01f, +2.897588491e-01f, -1.667058426e-02f }, + { -5.820096823e-02f, +7.876402556e-01f, +2.900703623e-01f, -1.669575344e-02f }, + { -5.818798608e-02f, +7.873440816e-01f, +2.903819808e-01f, -1.672094124e-02f }, + { -5.817495128e-02f, +7.870477656e-01f, +2.906937045e-01f, -1.674614765e-02f }, + { -5.816186392e-02f, +7.867513079e-01f, +2.910055333e-01f, -1.677137267e-02f }, + { -5.814872407e-02f, +7.864547086e-01f, +2.913174672e-01f, -1.679661628e-02f }, + { -5.813553181e-02f, +7.861579679e-01f, +2.916295059e-01f, -1.682187847e-02f }, + { -5.812228722e-02f, +7.858610859e-01f, +2.919416495e-01f, -1.684715923e-02f }, + { -5.810899039e-02f, +7.855640629e-01f, +2.922538976e-01f, -1.687245854e-02f }, + { -5.809564139e-02f, +7.852668990e-01f, +2.925662504e-01f, -1.689777639e-02f }, + { -5.808224030e-02f, +7.849695943e-01f, +2.928787076e-01f, -1.692311278e-02f }, + { -5.806878721e-02f, +7.846721491e-01f, +2.931912691e-01f, -1.694846768e-02f }, + { -5.805528218e-02f, +7.843745636e-01f, +2.935039348e-01f, -1.697384108e-02f }, + { -5.804172530e-02f, +7.840768378e-01f, +2.938167045e-01f, -1.699923298e-02f }, + { -5.802811666e-02f, +7.837789720e-01f, +2.941295783e-01f, -1.702464336e-02f }, + { -5.801445632e-02f, +7.834809664e-01f, +2.944425560e-01f, -1.705007220e-02f }, + { -5.800074437e-02f, +7.831828211e-01f, +2.947556373e-01f, -1.707551950e-02f }, + { -5.798698089e-02f, +7.828845363e-01f, +2.950688223e-01f, -1.710098524e-02f }, + { -5.797316596e-02f, +7.825861121e-01f, +2.953821109e-01f, -1.712646941e-02f }, + { -5.795929965e-02f, +7.822875489e-01f, +2.956955028e-01f, -1.715197200e-02f }, + { -5.794538205e-02f, +7.819888466e-01f, +2.960089980e-01f, -1.717749299e-02f }, + { -5.793141324e-02f, +7.816900056e-01f, +2.963225964e-01f, -1.720303237e-02f }, + { -5.791739329e-02f, +7.813910260e-01f, +2.966362979e-01f, -1.722859012e-02f }, + { -5.790332228e-02f, +7.810919079e-01f, +2.969501022e-01f, -1.725416625e-02f }, + { -5.788920029e-02f, +7.807926515e-01f, +2.972640094e-01f, -1.727976072e-02f }, + { -5.787502741e-02f, +7.804932570e-01f, +2.975780194e-01f, -1.730537353e-02f }, + { -5.786080371e-02f, +7.801937247e-01f, +2.978921319e-01f, -1.733100467e-02f }, + { -5.784652927e-02f, +7.798940546e-01f, +2.982063468e-01f, -1.735665412e-02f }, + { -5.783220417e-02f, +7.795942469e-01f, +2.985206642e-01f, -1.738232187e-02f }, + { -5.781782849e-02f, +7.792943018e-01f, +2.988350837e-01f, -1.740800791e-02f }, + { -5.780340230e-02f, +7.789942195e-01f, +2.991496054e-01f, -1.743371222e-02f }, + { -5.778892569e-02f, +7.786940002e-01f, +2.994642291e-01f, -1.745943479e-02f }, + { -5.777439874e-02f, +7.783936440e-01f, +2.997789547e-01f, -1.748517560e-02f }, + { -5.775982152e-02f, +7.780931511e-01f, +3.000937821e-01f, -1.751093465e-02f }, + { -5.774519411e-02f, +7.777925218e-01f, +3.004087111e-01f, -1.753671192e-02f }, + { -5.773051660e-02f, +7.774917560e-01f, +3.007237417e-01f, -1.756250739e-02f }, + { -5.771578906e-02f, +7.771908542e-01f, +3.010388736e-01f, -1.758832105e-02f }, + { -5.770101157e-02f, +7.768898163e-01f, +3.013541069e-01f, -1.761415290e-02f }, + { -5.768618420e-02f, +7.765886426e-01f, +3.016694414e-01f, -1.764000291e-02f }, + { -5.767130705e-02f, +7.762873333e-01f, +3.019848769e-01f, -1.766587107e-02f }, + { -5.765638018e-02f, +7.759858886e-01f, +3.023004134e-01f, -1.769175736e-02f }, + { -5.764140368e-02f, +7.756843086e-01f, +3.026160507e-01f, -1.771766179e-02f }, + { -5.762637762e-02f, +7.753825935e-01f, +3.029317887e-01f, -1.774358432e-02f }, + { -5.761130208e-02f, +7.750807434e-01f, +3.032476274e-01f, -1.776952495e-02f }, + { -5.759617715e-02f, +7.747787586e-01f, +3.035635665e-01f, -1.779548366e-02f }, + { -5.758100289e-02f, +7.744766393e-01f, +3.038796059e-01f, -1.782146044e-02f }, + { -5.756577939e-02f, +7.741743855e-01f, +3.041957456e-01f, -1.784745527e-02f }, + { -5.755050673e-02f, +7.738719975e-01f, +3.045119855e-01f, -1.787346814e-02f }, + { -5.753518499e-02f, +7.735694755e-01f, +3.048283253e-01f, -1.789949905e-02f }, + { -5.751981424e-02f, +7.732668197e-01f, +3.051447650e-01f, -1.792554796e-02f }, + { -5.750439457e-02f, +7.729640301e-01f, +3.054613045e-01f, -1.795161487e-02f }, + { -5.748892604e-02f, +7.726611070e-01f, +3.057779436e-01f, -1.797769977e-02f }, + { -5.747340875e-02f, +7.723580506e-01f, +3.060946822e-01f, -1.800380263e-02f }, + { -5.745784276e-02f, +7.720548611e-01f, +3.064115203e-01f, -1.802992345e-02f }, + { -5.744222816e-02f, +7.717515386e-01f, +3.067284576e-01f, -1.805606221e-02f }, + { -5.742656503e-02f, +7.714480832e-01f, +3.070454941e-01f, -1.808221890e-02f }, + { -5.741085343e-02f, +7.711444953e-01f, +3.073626297e-01f, -1.810839350e-02f }, + { -5.739509346e-02f, +7.708407749e-01f, +3.076798642e-01f, -1.813458600e-02f }, + { -5.737928519e-02f, +7.705369222e-01f, +3.079971975e-01f, -1.816079639e-02f }, + { -5.736342870e-02f, +7.702329374e-01f, +3.083146294e-01f, -1.818702464e-02f }, + { -5.734752407e-02f, +7.699288208e-01f, +3.086321600e-01f, -1.821327074e-02f }, + { -5.733157137e-02f, +7.696245724e-01f, +3.089497890e-01f, -1.823953469e-02f }, + { -5.731557068e-02f, +7.693201924e-01f, +3.092675163e-01f, -1.826581646e-02f }, + { -5.729952209e-02f, +7.690156811e-01f, +3.095853418e-01f, -1.829211604e-02f }, + { -5.728342566e-02f, +7.687110385e-01f, +3.099032654e-01f, -1.831843341e-02f }, + { -5.726728148e-02f, +7.684062649e-01f, +3.102212870e-01f, -1.834476857e-02f }, + { -5.725108962e-02f, +7.681013605e-01f, +3.105394064e-01f, -1.837112149e-02f }, + { -5.723485017e-02f, +7.677963254e-01f, +3.108576236e-01f, -1.839749217e-02f }, + { -5.721856321e-02f, +7.674911598e-01f, +3.111759383e-01f, -1.842388058e-02f }, + { -5.720222880e-02f, +7.671858639e-01f, +3.114943506e-01f, -1.845028671e-02f }, + { -5.718584702e-02f, +7.668804379e-01f, +3.118128601e-01f, -1.847671054e-02f }, + { -5.716941797e-02f, +7.665748819e-01f, +3.121314670e-01f, -1.850315207e-02f }, + { -5.715294170e-02f, +7.662691962e-01f, +3.124501709e-01f, -1.852961127e-02f }, + { -5.713641831e-02f, +7.659633808e-01f, +3.127689718e-01f, -1.855608813e-02f }, + { -5.711984787e-02f, +7.656574360e-01f, +3.130878696e-01f, -1.858258264e-02f }, + { -5.710323045e-02f, +7.653513620e-01f, +3.134068642e-01f, -1.860909478e-02f }, + { -5.708656614e-02f, +7.650451589e-01f, +3.137259554e-01f, -1.863562453e-02f }, + { -5.706985501e-02f, +7.647388269e-01f, +3.140451431e-01f, -1.866217188e-02f }, + { -5.705309714e-02f, +7.644323662e-01f, +3.143644272e-01f, -1.868873682e-02f }, + { -5.703629260e-02f, +7.641257769e-01f, +3.146838075e-01f, -1.871531932e-02f }, + { -5.701944149e-02f, +7.638190593e-01f, +3.150032840e-01f, -1.874191938e-02f }, + { -5.700254386e-02f, +7.635122136e-01f, +3.153228565e-01f, -1.876853697e-02f }, + { -5.698559981e-02f, +7.632052398e-01f, +3.156425249e-01f, -1.879517209e-02f }, + { -5.696860941e-02f, +7.628981382e-01f, +3.159622890e-01f, -1.882182471e-02f }, + { -5.695157273e-02f, +7.625909090e-01f, +3.162821488e-01f, -1.884849482e-02f }, + { -5.693448985e-02f, +7.622835524e-01f, +3.166021042e-01f, -1.887518241e-02f }, + { -5.691736086e-02f, +7.619760684e-01f, +3.169221549e-01f, -1.890188745e-02f }, + { -5.690018582e-02f, +7.616684574e-01f, +3.172423009e-01f, -1.892860994e-02f }, + { -5.688296482e-02f, +7.613607194e-01f, +3.175625421e-01f, -1.895534986e-02f }, + { -5.686569793e-02f, +7.610528546e-01f, +3.178828783e-01f, -1.898210719e-02f }, + { -5.684838523e-02f, +7.607448634e-01f, +3.182033094e-01f, -1.900888191e-02f }, + { -5.683102681e-02f, +7.604367457e-01f, +3.185238353e-01f, -1.903567401e-02f }, + { -5.681362272e-02f, +7.601285018e-01f, +3.188444558e-01f, -1.906248348e-02f }, + { -5.679617306e-02f, +7.598201319e-01f, +3.191651709e-01f, -1.908931029e-02f }, + { -5.677867790e-02f, +7.595116361e-01f, +3.194859804e-01f, -1.911615443e-02f }, + { -5.676113731e-02f, +7.592030147e-01f, +3.198068842e-01f, -1.914301589e-02f }, + { -5.674355138e-02f, +7.588942678e-01f, +3.201278822e-01f, -1.916989465e-02f }, + { -5.672592019e-02f, +7.585853955e-01f, +3.204489742e-01f, -1.919679069e-02f }, + { -5.670824380e-02f, +7.582763982e-01f, +3.207701601e-01f, -1.922370400e-02f }, + { -5.669052229e-02f, +7.579672759e-01f, +3.210914398e-01f, -1.925063455e-02f }, + { -5.667275575e-02f, +7.576580288e-01f, +3.214128132e-01f, -1.927758234e-02f }, + { -5.665494425e-02f, +7.573486571e-01f, +3.217342801e-01f, -1.930454735e-02f }, + { -5.663708786e-02f, +7.570391610e-01f, +3.220558404e-01f, -1.933152956e-02f }, + { -5.661918667e-02f, +7.567295407e-01f, +3.223774940e-01f, -1.935852895e-02f }, + { -5.660124075e-02f, +7.564197963e-01f, +3.226992408e-01f, -1.938554550e-02f }, + { -5.658325018e-02f, +7.561099280e-01f, +3.230210806e-01f, -1.941257921e-02f }, + { -5.656521503e-02f, +7.557999361e-01f, +3.233430133e-01f, -1.943963005e-02f }, + { -5.654713538e-02f, +7.554898206e-01f, +3.236650389e-01f, -1.946669801e-02f }, + { -5.652901131e-02f, +7.551795818e-01f, +3.239871571e-01f, -1.949378307e-02f }, + { -5.651084290e-02f, +7.548692198e-01f, +3.243093678e-01f, -1.952088522e-02f }, + { -5.649263022e-02f, +7.545587349e-01f, +3.246316709e-01f, -1.954800443e-02f }, + { -5.647437335e-02f, +7.542481271e-01f, +3.249540663e-01f, -1.957514069e-02f }, + { -5.645607236e-02f, +7.539373968e-01f, +3.252765539e-01f, -1.960229398e-02f }, + { -5.643772734e-02f, +7.536265440e-01f, +3.255991335e-01f, -1.962946429e-02f }, + { -5.641933835e-02f, +7.533155690e-01f, +3.259218051e-01f, -1.965665160e-02f }, + { -5.640090548e-02f, +7.530044718e-01f, +3.262445684e-01f, -1.968385589e-02f }, + { -5.638242880e-02f, +7.526932528e-01f, +3.265674233e-01f, -1.971107714e-02f }, + { -5.636390839e-02f, +7.523819121e-01f, +3.268903698e-01f, -1.973831534e-02f }, + { -5.634534432e-02f, +7.520704498e-01f, +3.272134077e-01f, -1.976557047e-02f }, + { -5.632673668e-02f, +7.517588662e-01f, +3.275365369e-01f, -1.979284251e-02f }, + { -5.630808553e-02f, +7.514471614e-01f, +3.278597572e-01f, -1.982013145e-02f }, + { -5.628939096e-02f, +7.511353356e-01f, +3.281830685e-01f, -1.984743727e-02f }, + { -5.627065304e-02f, +7.508233890e-01f, +3.285064707e-01f, -1.987475995e-02f }, + { -5.625187185e-02f, +7.505113218e-01f, +3.288299637e-01f, -1.990209947e-02f }, + { -5.623304746e-02f, +7.501991341e-01f, +3.291535473e-01f, -1.992945582e-02f }, + { -5.621417995e-02f, +7.498868261e-01f, +3.294772215e-01f, -1.995682897e-02f }, + { -5.619526939e-02f, +7.495743981e-01f, +3.298009860e-01f, -1.998421892e-02f }, + { -5.617631587e-02f, +7.492618501e-01f, +3.301248407e-01f, -2.001162564e-02f }, + { -5.615731946e-02f, +7.489491824e-01f, +3.304487856e-01f, -2.003904911e-02f }, + { -5.613828023e-02f, +7.486363951e-01f, +3.307728205e-01f, -2.006648932e-02f }, + { -5.611919827e-02f, +7.483234885e-01f, +3.310969453e-01f, -2.009394625e-02f }, + { -5.610007364e-02f, +7.480104627e-01f, +3.314211598e-01f, -2.012141988e-02f }, + { -5.608090642e-02f, +7.476973179e-01f, +3.317454639e-01f, -2.014891020e-02f }, + { -5.606169669e-02f, +7.473840543e-01f, +3.320698576e-01f, -2.017641718e-02f }, + { -5.604244453e-02f, +7.470706720e-01f, +3.323943405e-01f, -2.020394081e-02f }, + { -5.602315001e-02f, +7.467571712e-01f, +3.327189127e-01f, -2.023148107e-02f }, + { -5.600381321e-02f, +7.464435522e-01f, +3.330435740e-01f, -2.025903794e-02f }, + { -5.598443420e-02f, +7.461298151e-01f, +3.333683243e-01f, -2.028661141e-02f }, + { -5.596501306e-02f, +7.458159600e-01f, +3.336931634e-01f, -2.031420145e-02f }, + { -5.594554986e-02f, +7.455019872e-01f, +3.340180912e-01f, -2.034180804e-02f }, + { -5.592604469e-02f, +7.451878969e-01f, +3.343431076e-01f, -2.036943118e-02f }, + { -5.590649761e-02f, +7.448736891e-01f, +3.346682125e-01f, -2.039707084e-02f }, + { -5.588690871e-02f, +7.445593642e-01f, +3.349934057e-01f, -2.042472700e-02f }, + { -5.586727805e-02f, +7.442449222e-01f, +3.353186871e-01f, -2.045239964e-02f }, + { -5.584760571e-02f, +7.439303635e-01f, +3.356440565e-01f, -2.048008875e-02f }, + { -5.582789178e-02f, +7.436156880e-01f, +3.359695139e-01f, -2.050779431e-02f }, + { -5.580813632e-02f, +7.433008961e-01f, +3.362950591e-01f, -2.053551629e-02f }, + { -5.578833941e-02f, +7.429859879e-01f, +3.366206920e-01f, -2.056325469e-02f }, + { -5.576850113e-02f, +7.426709636e-01f, +3.369464124e-01f, -2.059100947e-02f }, + { -5.574862155e-02f, +7.423558234e-01f, +3.372722202e-01f, -2.061878063e-02f }, + { -5.572870075e-02f, +7.420405674e-01f, +3.375981153e-01f, -2.064656814e-02f }, + { -5.570873880e-02f, +7.417251959e-01f, +3.379240976e-01f, -2.067437199e-02f }, + { -5.568873578e-02f, +7.414097090e-01f, +3.382501669e-01f, -2.070219216e-02f }, + { -5.566869176e-02f, +7.410941069e-01f, +3.385763231e-01f, -2.073002862e-02f }, + { -5.564860682e-02f, +7.407783897e-01f, +3.389025660e-01f, -2.075788136e-02f }, + { -5.562848104e-02f, +7.404625577e-01f, +3.392288956e-01f, -2.078575035e-02f }, + { -5.560831448e-02f, +7.401466111e-01f, +3.395553117e-01f, -2.081363559e-02f }, + { -5.558810723e-02f, +7.398305500e-01f, +3.398818142e-01f, -2.084153705e-02f }, + { -5.556785936e-02f, +7.395143746e-01f, +3.402084029e-01f, -2.086945472e-02f }, + { -5.554757095e-02f, +7.391980851e-01f, +3.405350777e-01f, -2.089738856e-02f }, + { -5.552724207e-02f, +7.388816817e-01f, +3.408618385e-01f, -2.092533857e-02f }, + { -5.550687279e-02f, +7.385651645e-01f, +3.411886851e-01f, -2.095330472e-02f }, + { -5.548646320e-02f, +7.382485338e-01f, +3.415156174e-01f, -2.098128700e-02f }, + { -5.546601336e-02f, +7.379317896e-01f, +3.418426354e-01f, -2.100928539e-02f }, + { -5.544552335e-02f, +7.376149323e-01f, +3.421697387e-01f, -2.103729986e-02f }, + { -5.542499324e-02f, +7.372979620e-01f, +3.424969274e-01f, -2.106533040e-02f }, + { -5.540442312e-02f, +7.369808788e-01f, +3.428242013e-01f, -2.109337699e-02f }, + { -5.538381306e-02f, +7.366636830e-01f, +3.431515602e-01f, -2.112143960e-02f }, + { -5.536316312e-02f, +7.363463747e-01f, +3.434790041e-01f, -2.114951822e-02f }, + { -5.534247339e-02f, +7.360289541e-01f, +3.438065327e-01f, -2.117761283e-02f }, + { -5.532174395e-02f, +7.357114214e-01f, +3.441341461e-01f, -2.120572342e-02f }, + { -5.530097485e-02f, +7.353937768e-01f, +3.444618439e-01f, -2.123384995e-02f }, + { -5.528016619e-02f, +7.350760204e-01f, +3.447896261e-01f, -2.126199241e-02f }, + { -5.525931803e-02f, +7.347581525e-01f, +3.451174926e-01f, -2.129015078e-02f }, + { -5.523843046e-02f, +7.344401732e-01f, +3.454454432e-01f, -2.131832504e-02f }, + { -5.521750353e-02f, +7.341220827e-01f, +3.457734778e-01f, -2.134651517e-02f }, + { -5.519653734e-02f, +7.338038812e-01f, +3.461015962e-01f, -2.137472115e-02f }, + { -5.517553195e-02f, +7.334855689e-01f, +3.464297984e-01f, -2.140294296e-02f }, + { -5.515448744e-02f, +7.331671459e-01f, +3.467580842e-01f, -2.143118058e-02f }, + { -5.513340388e-02f, +7.328486125e-01f, +3.470864534e-01f, -2.145943399e-02f }, + { -5.511228134e-02f, +7.325299688e-01f, +3.474149060e-01f, -2.148770317e-02f }, + { -5.509111991e-02f, +7.322112150e-01f, +3.477434418e-01f, -2.151598810e-02f }, + { -5.506991966e-02f, +7.318923513e-01f, +3.480720606e-01f, -2.154428875e-02f }, + { -5.504868065e-02f, +7.315733778e-01f, +3.484007623e-01f, -2.157260512e-02f }, + { -5.502740298e-02f, +7.312542948e-01f, +3.487295469e-01f, -2.160093718e-02f }, + { -5.500608670e-02f, +7.309351024e-01f, +3.490584141e-01f, -2.162928490e-02f }, + { -5.498473189e-02f, +7.306158008e-01f, +3.493873638e-01f, -2.165764827e-02f }, + { -5.496333863e-02f, +7.302963903e-01f, +3.497163959e-01f, -2.168602727e-02f }, + { -5.494190699e-02f, +7.299768709e-01f, +3.500455102e-01f, -2.171442188e-02f }, + { -5.492043705e-02f, +7.296572429e-01f, +3.503747067e-01f, -2.174283207e-02f }, + { -5.489892888e-02f, +7.293375064e-01f, +3.507039852e-01f, -2.177125783e-02f }, + { -5.487738256e-02f, +7.290176616e-01f, +3.510333455e-01f, -2.179969913e-02f }, + { -5.485579815e-02f, +7.286977088e-01f, +3.513627875e-01f, -2.182815596e-02f }, + { -5.483417574e-02f, +7.283776481e-01f, +3.516923111e-01f, -2.185662829e-02f }, + { -5.481251539e-02f, +7.280574796e-01f, +3.520219162e-01f, -2.188511610e-02f }, + { -5.479081718e-02f, +7.277372036e-01f, +3.523516026e-01f, -2.191361938e-02f }, + { -5.476908119e-02f, +7.274168203e-01f, +3.526813701e-01f, -2.194213809e-02f }, + { -5.474730748e-02f, +7.270963298e-01f, +3.530112187e-01f, -2.197067223e-02f }, + { -5.472549614e-02f, +7.267757323e-01f, +3.533411482e-01f, -2.199922176e-02f }, + { -5.470364724e-02f, +7.264550280e-01f, +3.536711584e-01f, -2.202778667e-02f }, + { -5.468176084e-02f, +7.261342170e-01f, +3.540012493e-01f, -2.205636694e-02f }, + { -5.465983703e-02f, +7.258132997e-01f, +3.543314207e-01f, -2.208496254e-02f }, + { -5.463787587e-02f, +7.254922761e-01f, +3.546616725e-01f, -2.211357346e-02f }, + { -5.461587745e-02f, +7.251711464e-01f, +3.549920045e-01f, -2.214219967e-02f }, + { -5.459384183e-02f, +7.248499108e-01f, +3.553224165e-01f, -2.217084115e-02f }, + { -5.457176909e-02f, +7.245285695e-01f, +3.556529085e-01f, -2.219949788e-02f }, + { -5.454965931e-02f, +7.242071227e-01f, +3.559834804e-01f, -2.222816984e-02f }, + { -5.452751254e-02f, +7.238855706e-01f, +3.563141319e-01f, -2.225685701e-02f }, + { -5.450532888e-02f, +7.235639133e-01f, +3.566448630e-01f, -2.228555936e-02f }, + { -5.448310839e-02f, +7.232421510e-01f, +3.569756734e-01f, -2.231427688e-02f }, + { -5.446085115e-02f, +7.229202840e-01f, +3.573065632e-01f, -2.234300954e-02f }, + { -5.443855722e-02f, +7.225983123e-01f, +3.576375321e-01f, -2.237175733e-02f }, + { -5.441622669e-02f, +7.222762363e-01f, +3.579685799e-01f, -2.240052021e-02f }, + { -5.439385962e-02f, +7.219540560e-01f, +3.582997067e-01f, -2.242929816e-02f }, + { -5.437145610e-02f, +7.216317716e-01f, +3.586309121e-01f, -2.245809118e-02f }, + { -5.434901618e-02f, +7.213093834e-01f, +3.589621962e-01f, -2.248689923e-02f }, + { -5.432653996e-02f, +7.209868915e-01f, +3.592935587e-01f, -2.251572229e-02f }, + { -5.430402749e-02f, +7.206642961e-01f, +3.596249995e-01f, -2.254456034e-02f }, + { -5.428147885e-02f, +7.203415974e-01f, +3.599565185e-01f, -2.257341336e-02f }, + { -5.425889412e-02f, +7.200187955e-01f, +3.602881155e-01f, -2.260228132e-02f }, + { -5.423627337e-02f, +7.196958907e-01f, +3.606197904e-01f, -2.263116421e-02f }, + { -5.421361667e-02f, +7.193728831e-01f, +3.609515431e-01f, -2.266006200e-02f }, + { -5.419092410e-02f, +7.190497730e-01f, +3.612833734e-01f, -2.268897467e-02f }, + { -5.416819572e-02f, +7.187265605e-01f, +3.616152812e-01f, -2.271790220e-02f }, + { -5.414543161e-02f, +7.184032457e-01f, +3.619472663e-01f, -2.274684456e-02f }, + { -5.412263185e-02f, +7.180798289e-01f, +3.622793287e-01f, -2.277580174e-02f }, + { -5.409979650e-02f, +7.177563103e-01f, +3.626114681e-01f, -2.280477371e-02f }, + { -5.407692564e-02f, +7.174326900e-01f, +3.629436844e-01f, -2.283376044e-02f }, + { -5.405401935e-02f, +7.171089682e-01f, +3.632759775e-01f, -2.286276192e-02f }, + { -5.403107768e-02f, +7.167851452e-01f, +3.636083473e-01f, -2.289177812e-02f }, + { -5.400810073e-02f, +7.164612210e-01f, +3.639407936e-01f, -2.292080903e-02f }, + { -5.398508856e-02f, +7.161371959e-01f, +3.642733163e-01f, -2.294985461e-02f }, + { -5.396204124e-02f, +7.158130701e-01f, +3.646059152e-01f, -2.297891485e-02f }, + { -5.393895884e-02f, +7.154888437e-01f, +3.649385903e-01f, -2.300798972e-02f }, + { -5.391584144e-02f, +7.151645170e-01f, +3.652713412e-01f, -2.303707919e-02f }, + { -5.389268911e-02f, +7.148400900e-01f, +3.656041680e-01f, -2.306618326e-02f }, + { -5.386950193e-02f, +7.145155631e-01f, +3.659370705e-01f, -2.309530189e-02f }, + { -5.384627996e-02f, +7.141909364e-01f, +3.662700485e-01f, -2.312443506e-02f }, + { -5.382302328e-02f, +7.138662100e-01f, +3.666031020e-01f, -2.315358275e-02f }, + { -5.379973196e-02f, +7.135413841e-01f, +3.669362306e-01f, -2.318274493e-02f }, + { -5.377640607e-02f, +7.132164590e-01f, +3.672694344e-01f, -2.321192159e-02f }, + { -5.375304569e-02f, +7.128914348e-01f, +3.676027132e-01f, -2.324111270e-02f }, + { -5.372965088e-02f, +7.125663118e-01f, +3.679360669e-01f, -2.327031823e-02f }, + { -5.370622173e-02f, +7.122410900e-01f, +3.682694952e-01f, -2.329953816e-02f }, + { -5.368275829e-02f, +7.119157697e-01f, +3.686029981e-01f, -2.332877247e-02f }, + { -5.365926065e-02f, +7.115903510e-01f, +3.689365754e-01f, -2.335802114e-02f }, + { -5.363572888e-02f, +7.112648342e-01f, +3.692702270e-01f, -2.338728414e-02f }, + { -5.361216304e-02f, +7.109392194e-01f, +3.696039527e-01f, -2.341656145e-02f }, + { -5.358856321e-02f, +7.106135068e-01f, +3.699377525e-01f, -2.344585305e-02f }, + { -5.356492947e-02f, +7.102876966e-01f, +3.702716261e-01f, -2.347515891e-02f }, + { -5.354126188e-02f, +7.099617891e-01f, +3.706055734e-01f, -2.350447901e-02f }, + { -5.351756051e-02f, +7.096357842e-01f, +3.709395943e-01f, -2.353381332e-02f }, + { -5.349382545e-02f, +7.093096823e-01f, +3.712736886e-01f, -2.356316182e-02f }, + { -5.347005675e-02f, +7.089834836e-01f, +3.716078562e-01f, -2.359252450e-02f }, + { -5.344625449e-02f, +7.086571882e-01f, +3.719420970e-01f, -2.362190131e-02f }, + { -5.342241875e-02f, +7.083307963e-01f, +3.722764108e-01f, -2.365129225e-02f }, + { -5.339854959e-02f, +7.080043080e-01f, +3.726107975e-01f, -2.368069728e-02f }, + { -5.337464709e-02f, +7.076777237e-01f, +3.729452569e-01f, -2.371011639e-02f }, + { -5.335071132e-02f, +7.073510434e-01f, +3.732797888e-01f, -2.373954954e-02f }, + { -5.332674235e-02f, +7.070242673e-01f, +3.736143933e-01f, -2.376899672e-02f }, + { -5.330274025e-02f, +7.066973957e-01f, +3.739490700e-01f, -2.379845790e-02f }, + { -5.327870509e-02f, +7.063704287e-01f, +3.742838189e-01f, -2.382793305e-02f }, + { -5.325463695e-02f, +7.060433665e-01f, +3.746186398e-01f, -2.385742216e-02f }, + { -5.323053590e-02f, +7.057162093e-01f, +3.749535326e-01f, -2.388692520e-02f }, + { -5.320640200e-02f, +7.053889572e-01f, +3.752884971e-01f, -2.391644214e-02f }, + { -5.318223533e-02f, +7.050616105e-01f, +3.756235333e-01f, -2.394597296e-02f }, + { -5.315803596e-02f, +7.047341694e-01f, +3.759586408e-01f, -2.397551763e-02f }, + { -5.313380397e-02f, +7.044066339e-01f, +3.762938197e-01f, -2.400507614e-02f }, + { -5.310953941e-02f, +7.040790044e-01f, +3.766290698e-01f, -2.403464845e-02f }, + { -5.308524237e-02f, +7.037512810e-01f, +3.769643909e-01f, -2.406423454e-02f }, + { -5.306091292e-02f, +7.034234638e-01f, +3.772997828e-01f, -2.409383439e-02f }, + { -5.303655112e-02f, +7.030955531e-01f, +3.776352455e-01f, -2.412344797e-02f }, + { -5.301215705e-02f, +7.027675491e-01f, +3.779707788e-01f, -2.415307527e-02f }, + { -5.298773078e-02f, +7.024394519e-01f, +3.783063825e-01f, -2.418271624e-02f }, + { -5.296327238e-02f, +7.021112617e-01f, +3.786420566e-01f, -2.421237087e-02f }, + { -5.293878193e-02f, +7.017829788e-01f, +3.789778008e-01f, -2.424203914e-02f }, + { -5.291425948e-02f, +7.014546032e-01f, +3.793136151e-01f, -2.427172102e-02f }, + { -5.288970511e-02f, +7.011261352e-01f, +3.796494992e-01f, -2.430141648e-02f }, + { -5.286511890e-02f, +7.007975749e-01f, +3.799854530e-01f, -2.433112550e-02f }, + { -5.284050092e-02f, +7.004689226e-01f, +3.803214765e-01f, -2.436084805e-02f }, + { -5.281585123e-02f, +7.001401785e-01f, +3.806575694e-01f, -2.439058412e-02f }, + { -5.279116991e-02f, +6.998113426e-01f, +3.809937316e-01f, -2.442033366e-02f }, + { -5.276645702e-02f, +6.994824153e-01f, +3.813299629e-01f, -2.445009667e-02f }, + { -5.274171264e-02f, +6.991533966e-01f, +3.816662633e-01f, -2.447987311e-02f }, + { -5.271693684e-02f, +6.988242869e-01f, +3.820026325e-01f, -2.450966296e-02f }, + { -5.269212969e-02f, +6.984950861e-01f, +3.823390705e-01f, -2.453946619e-02f }, + { -5.266729126e-02f, +6.981657947e-01f, +3.826755771e-01f, -2.456928278e-02f }, + { -5.264242161e-02f, +6.978364126e-01f, +3.830121520e-01f, -2.459911271e-02f }, + { -5.261752083e-02f, +6.975069402e-01f, +3.833487953e-01f, -2.462895594e-02f }, + { -5.259258898e-02f, +6.971773775e-01f, +3.836855068e-01f, -2.465881245e-02f }, + { -5.256762613e-02f, +6.968477249e-01f, +3.840222862e-01f, -2.468868221e-02f }, + { -5.254263236e-02f, +6.965179824e-01f, +3.843591335e-01f, -2.471856521e-02f }, + { -5.251760772e-02f, +6.961881503e-01f, +3.846960485e-01f, -2.474846141e-02f }, + { -5.249255230e-02f, +6.958582288e-01f, +3.850330311e-01f, -2.477837080e-02f }, + { -5.246746616e-02f, +6.955282179e-01f, +3.853700811e-01f, -2.480829333e-02f }, + { -5.244234938e-02f, +6.951981180e-01f, +3.857071983e-01f, -2.483822900e-02f }, + { -5.241720201e-02f, +6.948679292e-01f, +3.860443828e-01f, -2.486817776e-02f }, + { -5.239202415e-02f, +6.945376516e-01f, +3.863816342e-01f, -2.489813960e-02f }, + { -5.236681584e-02f, +6.942072855e-01f, +3.867189524e-01f, -2.492811449e-02f }, + { -5.234157717e-02f, +6.938768311e-01f, +3.870563373e-01f, -2.495810241e-02f }, + { -5.231630820e-02f, +6.935462886e-01f, +3.873937888e-01f, -2.498810332e-02f }, + { -5.229100900e-02f, +6.932156580e-01f, +3.877313067e-01f, -2.501811720e-02f }, + { -5.226567965e-02f, +6.928849397e-01f, +3.880688909e-01f, -2.504814403e-02f }, + { -5.224032022e-02f, +6.925541338e-01f, +3.884065411e-01f, -2.507818379e-02f }, + { -5.221493076e-02f, +6.922232404e-01f, +3.887442574e-01f, -2.510823643e-02f }, + { -5.218951136e-02f, +6.918922599e-01f, +3.890820394e-01f, -2.513830194e-02f }, + { -5.216406208e-02f, +6.915611922e-01f, +3.894198871e-01f, -2.516838029e-02f }, + { -5.213858300e-02f, +6.912300378e-01f, +3.897578004e-01f, -2.519847146e-02f }, + { -5.211307417e-02f, +6.908987966e-01f, +3.900957790e-01f, -2.522857541e-02f }, + { -5.208753568e-02f, +6.905674690e-01f, +3.904338229e-01f, -2.525869212e-02f }, + { -5.206196759e-02f, +6.902360551e-01f, +3.907719318e-01f, -2.528882157e-02f }, + { -5.203636997e-02f, +6.899045550e-01f, +3.911101057e-01f, -2.531896373e-02f }, + { -5.201074290e-02f, +6.895729691e-01f, +3.914483444e-01f, -2.534911857e-02f }, + { -5.198508643e-02f, +6.892412974e-01f, +3.917866477e-01f, -2.537928607e-02f }, + { -5.195940064e-02f, +6.889095401e-01f, +3.921250156e-01f, -2.540946619e-02f }, + { -5.193368560e-02f, +6.885776975e-01f, +3.924634478e-01f, -2.543965891e-02f }, + { -5.190794138e-02f, +6.882457697e-01f, +3.928019442e-01f, -2.546986421e-02f }, + { -5.188216805e-02f, +6.879137568e-01f, +3.931405046e-01f, -2.550008206e-02f }, + { -5.185636568e-02f, +6.875816592e-01f, +3.934791290e-01f, -2.553031243e-02f }, + { -5.183053433e-02f, +6.872494769e-01f, +3.938178171e-01f, -2.556055529e-02f }, + { -5.180467408e-02f, +6.869172102e-01f, +3.941565688e-01f, -2.559081062e-02f }, + { -5.177878499e-02f, +6.865848593e-01f, +3.944953840e-01f, -2.562107838e-02f }, + { -5.175286714e-02f, +6.862524243e-01f, +3.948342626e-01f, -2.565135856e-02f }, + { -5.172692059e-02f, +6.859199054e-01f, +3.951732042e-01f, -2.568165113e-02f }, + { -5.170094541e-02f, +6.855873028e-01f, +3.955122090e-01f, -2.571195605e-02f }, + { -5.167494167e-02f, +6.852546167e-01f, +3.958512766e-01f, -2.574227331e-02f }, + { -5.164890945e-02f, +6.849218472e-01f, +3.961904069e-01f, -2.577260287e-02f }, + { -5.162284880e-02f, +6.845889947e-01f, +3.965295998e-01f, -2.580294470e-02f }, + { -5.159675980e-02f, +6.842560591e-01f, +3.968688551e-01f, -2.583329878e-02f }, + { -5.157064252e-02f, +6.839230409e-01f, +3.972081727e-01f, -2.586366508e-02f }, + { -5.154449702e-02f, +6.835899400e-01f, +3.975475525e-01f, -2.589404358e-02f }, + { -5.151832338e-02f, +6.832567567e-01f, +3.978869942e-01f, -2.592443425e-02f }, + { -5.149212166e-02f, +6.829234913e-01f, +3.982264977e-01f, -2.595483705e-02f }, + { -5.146589193e-02f, +6.825901438e-01f, +3.985660630e-01f, -2.598525196e-02f }, + { -5.143963427e-02f, +6.822567144e-01f, +3.989056898e-01f, -2.601567895e-02f }, + { -5.141334873e-02f, +6.819232035e-01f, +3.992453779e-01f, -2.604611800e-02f }, + { -5.138703539e-02f, +6.815896110e-01f, +3.995851274e-01f, -2.607656908e-02f }, + { -5.136069431e-02f, +6.812559373e-01f, +3.999249379e-01f, -2.610703216e-02f }, + { -5.133432558e-02f, +6.809221825e-01f, +4.002648093e-01f, -2.613750720e-02f }, + { -5.130792924e-02f, +6.805883468e-01f, +4.006047415e-01f, -2.616799420e-02f }, + { -5.128150537e-02f, +6.802544304e-01f, +4.009447344e-01f, -2.619849310e-02f }, + { -5.125505405e-02f, +6.799204334e-01f, +4.012847878e-01f, -2.622900390e-02f }, + { -5.122857533e-02f, +6.795863561e-01f, +4.016249015e-01f, -2.625952655e-02f }, + { -5.120206929e-02f, +6.792521986e-01f, +4.019650754e-01f, -2.629006103e-02f }, + { -5.117553600e-02f, +6.789179612e-01f, +4.023053093e-01f, -2.632060732e-02f }, + { -5.114897551e-02f, +6.785836440e-01f, +4.026456031e-01f, -2.635116538e-02f }, + { -5.112238791e-02f, +6.782492471e-01f, +4.029859567e-01f, -2.638173519e-02f }, + { -5.109577326e-02f, +6.779147709e-01f, +4.033263699e-01f, -2.641231671e-02f }, + { -5.106913162e-02f, +6.775802154e-01f, +4.036668425e-01f, -2.644290992e-02f }, + { -5.104246307e-02f, +6.772455809e-01f, +4.040073744e-01f, -2.647351480e-02f }, + { -5.101576767e-02f, +6.769108675e-01f, +4.043479654e-01f, -2.650413130e-02f }, + { -5.098904550e-02f, +6.765760755e-01f, +4.046886155e-01f, -2.653475941e-02f }, + { -5.096229661e-02f, +6.762412050e-01f, +4.050293243e-01f, -2.656539910e-02f }, + { -5.093552108e-02f, +6.759062562e-01f, +4.053700919e-01f, -2.659605033e-02f }, + { -5.090871897e-02f, +6.755712292e-01f, +4.057109180e-01f, -2.662671308e-02f }, + { -5.088189036e-02f, +6.752361244e-01f, +4.060518025e-01f, -2.665738731e-02f }, + { -5.085503531e-02f, +6.749009418e-01f, +4.063927452e-01f, -2.668807301e-02f }, + { -5.082815388e-02f, +6.745656817e-01f, +4.067337460e-01f, -2.671877013e-02f }, + { -5.080124615e-02f, +6.742303442e-01f, +4.070748047e-01f, -2.674947866e-02f }, + { -5.077431218e-02f, +6.738949295e-01f, +4.074159212e-01f, -2.678019856e-02f }, + { -5.074735205e-02f, +6.735594378e-01f, +4.077570954e-01f, -2.681092981e-02f }, + { -5.072036581e-02f, +6.732238693e-01f, +4.080983270e-01f, -2.684167237e-02f }, + { -5.069335353e-02f, +6.728882242e-01f, +4.084396159e-01f, -2.687242621e-02f }, + { -5.066631529e-02f, +6.725525027e-01f, +4.087809621e-01f, -2.690319131e-02f }, + { -5.063925115e-02f, +6.722167049e-01f, +4.091223652e-01f, -2.693396764e-02f }, + { -5.061216118e-02f, +6.718808311e-01f, +4.094638252e-01f, -2.696475516e-02f }, + { -5.058504544e-02f, +6.715448814e-01f, +4.098053420e-01f, -2.699555385e-02f }, + { -5.055790401e-02f, +6.712088560e-01f, +4.101469153e-01f, -2.702636369e-02f }, + { -5.053073694e-02f, +6.708727551e-01f, +4.104885450e-01f, -2.705718463e-02f }, + { -5.050354431e-02f, +6.705365788e-01f, +4.108302310e-01f, -2.708801665e-02f }, + { -5.047632619e-02f, +6.702003275e-01f, +4.111719731e-01f, -2.711885972e-02f }, + { -5.044908263e-02f, +6.698640012e-01f, +4.115137711e-01f, -2.714971381e-02f }, + { -5.042181372e-02f, +6.695276002e-01f, +4.118556250e-01f, -2.718057889e-02f }, + { -5.039451951e-02f, +6.691911246e-01f, +4.121975345e-01f, -2.721145493e-02f }, + { -5.036720007e-02f, +6.688545746e-01f, +4.125394995e-01f, -2.724234191e-02f }, + { -5.033985546e-02f, +6.685179504e-01f, +4.128815199e-01f, -2.727323979e-02f }, + { -5.031248577e-02f, +6.681812522e-01f, +4.132235955e-01f, -2.730414853e-02f }, + { -5.028509105e-02f, +6.678444802e-01f, +4.135657261e-01f, -2.733506812e-02f }, + { -5.025767136e-02f, +6.675076346e-01f, +4.139079116e-01f, -2.736599852e-02f }, + { -5.023022678e-02f, +6.671707155e-01f, +4.142501518e-01f, -2.739693971e-02f }, + { -5.020275738e-02f, +6.668337231e-01f, +4.145924466e-01f, -2.742789164e-02f }, + { -5.017526321e-02f, +6.664966577e-01f, +4.149347959e-01f, -2.745885430e-02f }, + { -5.014774435e-02f, +6.661595193e-01f, +4.152771994e-01f, -2.748982764e-02f }, + { -5.012020087e-02f, +6.658223083e-01f, +4.156196570e-01f, -2.752081165e-02f }, + { -5.009263282e-02f, +6.654850247e-01f, +4.159621686e-01f, -2.755180629e-02f }, + { -5.006504027e-02f, +6.651476689e-01f, +4.163047340e-01f, -2.758281153e-02f }, + { -5.003742330e-02f, +6.648102408e-01f, +4.166473531e-01f, -2.761382734e-02f }, + { -5.000978197e-02f, +6.644727409e-01f, +4.169900257e-01f, -2.764485368e-02f }, + { -4.998211634e-02f, +6.641351691e-01f, +4.173327517e-01f, -2.767589054e-02f }, + { -4.995442649e-02f, +6.637975258e-01f, +4.176755308e-01f, -2.770693788e-02f }, + { -4.992671247e-02f, +6.634598110e-01f, +4.180183630e-01f, -2.773799566e-02f }, + { -4.989897435e-02f, +6.631220251e-01f, +4.183612481e-01f, -2.776906386e-02f }, + { -4.987121220e-02f, +6.627841681e-01f, +4.187041859e-01f, -2.780014245e-02f }, + { -4.984342609e-02f, +6.624462403e-01f, +4.190471763e-01f, -2.783123139e-02f }, + { -4.981561608e-02f, +6.621082419e-01f, +4.193902192e-01f, -2.786233066e-02f }, + { -4.978778224e-02f, +6.617701729e-01f, +4.197333143e-01f, -2.789344022e-02f }, + { -4.975992463e-02f, +6.614320337e-01f, +4.200764615e-01f, -2.792456005e-02f }, + { -4.973204333e-02f, +6.610938245e-01f, +4.204196607e-01f, -2.795569010e-02f }, + { -4.970413838e-02f, +6.607555453e-01f, +4.207629117e-01f, -2.798683036e-02f }, + { -4.967620987e-02f, +6.604171963e-01f, +4.211062143e-01f, -2.801798079e-02f }, + { -4.964825786e-02f, +6.600787779e-01f, +4.214495685e-01f, -2.804914136e-02f }, + { -4.962028241e-02f, +6.597402901e-01f, +4.217929740e-01f, -2.808031203e-02f }, + { -4.959228359e-02f, +6.594017331e-01f, +4.221364307e-01f, -2.811149279e-02f }, + { -4.956426147e-02f, +6.590631072e-01f, +4.224799384e-01f, -2.814268358e-02f }, + { -4.953621610e-02f, +6.587244125e-01f, +4.228234970e-01f, -2.817388439e-02f }, + { -4.950814756e-02f, +6.583856492e-01f, +4.231671063e-01f, -2.820509519e-02f }, + { -4.948005591e-02f, +6.580468175e-01f, +4.235107662e-01f, -2.823631593e-02f }, + { -4.945194122e-02f, +6.577079175e-01f, +4.238544765e-01f, -2.826754660e-02f }, + { -4.942380356e-02f, +6.573689495e-01f, +4.241982371e-01f, -2.829878715e-02f }, + { -4.939564297e-02f, +6.570299137e-01f, +4.245420477e-01f, -2.833003756e-02f }, + { -4.936745955e-02f, +6.566908102e-01f, +4.248859083e-01f, -2.836129779e-02f }, + { -4.933925334e-02f, +6.563516392e-01f, +4.252298187e-01f, -2.839256782e-02f }, + { -4.931102441e-02f, +6.560124009e-01f, +4.255737788e-01f, -2.842384761e-02f }, + { -4.928277284e-02f, +6.556730955e-01f, +4.259177883e-01f, -2.845513713e-02f }, + { -4.925449868e-02f, +6.553337232e-01f, +4.262618471e-01f, -2.848643635e-02f }, + { -4.922620200e-02f, +6.549942842e-01f, +4.266059551e-01f, -2.851774523e-02f }, + { -4.919788286e-02f, +6.546547786e-01f, +4.269501121e-01f, -2.854906375e-02f }, + { -4.916954133e-02f, +6.543152066e-01f, +4.272943179e-01f, -2.858039187e-02f }, + { -4.914117748e-02f, +6.539755685e-01f, +4.276385725e-01f, -2.861172956e-02f }, + { -4.911279137e-02f, +6.536358644e-01f, +4.279828756e-01f, -2.864307678e-02f }, + { -4.908438306e-02f, +6.532960945e-01f, +4.283272270e-01f, -2.867443352e-02f }, + { -4.905595262e-02f, +6.529562589e-01f, +4.286716267e-01f, -2.870579972e-02f }, + { -4.902750012e-02f, +6.526163580e-01f, +4.290160745e-01f, -2.873717537e-02f }, + { -4.899902562e-02f, +6.522763918e-01f, +4.293605701e-01f, -2.876856043e-02f }, + { -4.897052918e-02f, +6.519363605e-01f, +4.297051136e-01f, -2.879995486e-02f }, + { -4.894201087e-02f, +6.515962644e-01f, +4.300497046e-01f, -2.883135864e-02f }, + { -4.891347075e-02f, +6.512561036e-01f, +4.303943430e-01f, -2.886277173e-02f }, + { -4.888490889e-02f, +6.509158783e-01f, +4.307390288e-01f, -2.889419410e-02f }, + { -4.885632535e-02f, +6.505755887e-01f, +4.310837617e-01f, -2.892562571e-02f }, + { -4.882772020e-02f, +6.502352350e-01f, +4.314285415e-01f, -2.895706654e-02f }, + { -4.879909350e-02f, +6.498948173e-01f, +4.317733681e-01f, -2.898851656e-02f }, + { -4.877044532e-02f, +6.495543359e-01f, +4.321182414e-01f, -2.901997572e-02f }, + { -4.874177572e-02f, +6.492137910e-01f, +4.324631612e-01f, -2.905144399e-02f }, + { -4.871308476e-02f, +6.488731826e-01f, +4.328081273e-01f, -2.908292135e-02f }, + { -4.868437251e-02f, +6.485325111e-01f, +4.331531396e-01f, -2.911440776e-02f }, + { -4.865563904e-02f, +6.481917765e-01f, +4.334981980e-01f, -2.914590319e-02f }, + { -4.862688440e-02f, +6.478509792e-01f, +4.338433021e-01f, -2.917740760e-02f }, + { -4.859810867e-02f, +6.475101192e-01f, +4.341884520e-01f, -2.920892096e-02f }, + { -4.856931190e-02f, +6.471691968e-01f, +4.345336475e-01f, -2.924044325e-02f }, + { -4.854049416e-02f, +6.468282121e-01f, +4.348788883e-01f, -2.927197441e-02f }, + { -4.851165552e-02f, +6.464871653e-01f, +4.352241743e-01f, -2.930351443e-02f }, + { -4.848279603e-02f, +6.461460567e-01f, +4.355695055e-01f, -2.933506327e-02f }, + { -4.845391577e-02f, +6.458048863e-01f, +4.359148815e-01f, -2.936662089e-02f }, + { -4.842501479e-02f, +6.454636545e-01f, +4.362603023e-01f, -2.939818727e-02f }, + { -4.839609316e-02f, +6.451223613e-01f, +4.366057677e-01f, -2.942976236e-02f }, + { -4.836715094e-02f, +6.447810070e-01f, +4.369512775e-01f, -2.946134614e-02f }, + { -4.833818821e-02f, +6.444395917e-01f, +4.372968316e-01f, -2.949293857e-02f }, + { -4.830920501e-02f, +6.440981157e-01f, +4.376424298e-01f, -2.952453962e-02f }, + { -4.828020142e-02f, +6.437565791e-01f, +4.379880720e-01f, -2.955614925e-02f }, + { -4.825117750e-02f, +6.434149821e-01f, +4.383337580e-01f, -2.958776743e-02f }, + { -4.822213331e-02f, +6.430733249e-01f, +4.386794876e-01f, -2.961939414e-02f }, + { -4.819306891e-02f, +6.427316077e-01f, +4.390252607e-01f, -2.965102932e-02f }, + { -4.816398438e-02f, +6.423898306e-01f, +4.393710771e-01f, -2.968267296e-02f }, + { -4.813487976e-02f, +6.420479939e-01f, +4.397169367e-01f, -2.971432501e-02f }, + { -4.810575513e-02f, +6.417060978e-01f, +4.400628392e-01f, -2.974598544e-02f }, + { -4.807661056e-02f, +6.413641423e-01f, +4.404087847e-01f, -2.977765422e-02f }, + { -4.804744609e-02f, +6.410221278e-01f, +4.407547728e-01f, -2.980933131e-02f }, + { -4.801826180e-02f, +6.406800544e-01f, +4.411008034e-01f, -2.984101669e-02f }, + { -4.798905775e-02f, +6.403379223e-01f, +4.414468764e-01f, -2.987271031e-02f }, + { -4.795983400e-02f, +6.399957316e-01f, +4.417929916e-01f, -2.990441214e-02f }, + { -4.793059062e-02f, +6.396534826e-01f, +4.421391489e-01f, -2.993612215e-02f }, + { -4.790132766e-02f, +6.393111754e-01f, +4.424853480e-01f, -2.996784030e-02f }, + { -4.787204520e-02f, +6.389688103e-01f, +4.428315888e-01f, -2.999956656e-02f }, + { -4.784274329e-02f, +6.386263874e-01f, +4.431778713e-01f, -3.003130090e-02f }, + { -4.781342200e-02f, +6.382839069e-01f, +4.435241951e-01f, -3.006304328e-02f }, + { -4.778408139e-02f, +6.379413690e-01f, +4.438705601e-01f, -3.009479366e-02f }, + { -4.775472152e-02f, +6.375987738e-01f, +4.442169663e-01f, -3.012655201e-02f }, + { -4.772534246e-02f, +6.372561217e-01f, +4.445634133e-01f, -3.015831830e-02f }, + { -4.769594427e-02f, +6.369134126e-01f, +4.449099012e-01f, -3.019009249e-02f }, + { -4.766652701e-02f, +6.365706469e-01f, +4.452564296e-01f, -3.022187454e-02f }, + { -4.763709074e-02f, +6.362278248e-01f, +4.456029984e-01f, -3.025366443e-02f }, + { -4.760763553e-02f, +6.358849463e-01f, +4.459496076e-01f, -3.028546212e-02f }, + { -4.757816144e-02f, +6.355420117e-01f, +4.462962568e-01f, -3.031726757e-02f }, + { -4.754866853e-02f, +6.351990212e-01f, +4.466429460e-01f, -3.034908075e-02f }, + { -4.751915687e-02f, +6.348559750e-01f, +4.469896750e-01f, -3.038090162e-02f }, + { -4.748962651e-02f, +6.345128733e-01f, +4.473364437e-01f, -3.041273015e-02f }, + { -4.746007752e-02f, +6.341697161e-01f, +4.476832518e-01f, -3.044456630e-02f }, + { -4.743050997e-02f, +6.338265038e-01f, +4.480300992e-01f, -3.047641003e-02f }, + { -4.740092391e-02f, +6.334832365e-01f, +4.483769858e-01f, -3.050826133e-02f }, + { -4.737131940e-02f, +6.331399144e-01f, +4.487239113e-01f, -3.054012013e-02f }, + { -4.734169651e-02f, +6.327965377e-01f, +4.490708757e-01f, -3.057198642e-02f }, + { -4.731205530e-02f, +6.324531066e-01f, +4.494178788e-01f, -3.060386016e-02f }, + { -4.728239584e-02f, +6.321096212e-01f, +4.497649203e-01f, -3.063574131e-02f }, + { -4.725271818e-02f, +6.317660818e-01f, +4.501120002e-01f, -3.066762983e-02f }, + { -4.722302238e-02f, +6.314224885e-01f, +4.504591183e-01f, -3.069952570e-02f }, + { -4.719330852e-02f, +6.310788415e-01f, +4.508062744e-01f, -3.073142887e-02f }, + { -4.716357665e-02f, +6.307351410e-01f, +4.511534683e-01f, -3.076333930e-02f }, + { -4.713382682e-02f, +6.303913872e-01f, +4.515006999e-01f, -3.079525698e-02f }, + { -4.710405912e-02f, +6.300475802e-01f, +4.518479691e-01f, -3.082718185e-02f }, + { -4.707427359e-02f, +6.297037204e-01f, +4.521952756e-01f, -3.085911388e-02f }, + { -4.704447029e-02f, +6.293598077e-01f, +4.525426193e-01f, -3.089105304e-02f }, + { -4.701464930e-02f, +6.290158425e-01f, +4.528900001e-01f, -3.092299929e-02f }, + { -4.698481067e-02f, +6.286718249e-01f, +4.532374178e-01f, -3.095495259e-02f }, + { -4.695495446e-02f, +6.283277552e-01f, +4.535848721e-01f, -3.098691291e-02f }, + { -4.692508073e-02f, +6.279836334e-01f, +4.539323631e-01f, -3.101888022e-02f }, + { -4.689518955e-02f, +6.276394598e-01f, +4.542798904e-01f, -3.105085447e-02f }, + { -4.686528098e-02f, +6.272952345e-01f, +4.546274539e-01f, -3.108283564e-02f }, + { -4.683535507e-02f, +6.269509578e-01f, +4.549750535e-01f, -3.111482367e-02f }, + { -4.680541190e-02f, +6.266066299e-01f, +4.553226890e-01f, -3.114681855e-02f }, + { -4.677545152e-02f, +6.262622508e-01f, +4.556703603e-01f, -3.117882023e-02f }, + { -4.674547399e-02f, +6.259178209e-01f, +4.560180671e-01f, -3.121082867e-02f }, + { -4.671547937e-02f, +6.255733402e-01f, +4.563658094e-01f, -3.124284384e-02f }, + { -4.668546773e-02f, +6.252288091e-01f, +4.567135869e-01f, -3.127486571e-02f }, + { -4.665543913e-02f, +6.248842275e-01f, +4.570613994e-01f, -3.130689423e-02f }, + { -4.662539362e-02f, +6.245395959e-01f, +4.574092469e-01f, -3.133892937e-02f }, + { -4.659533127e-02f, +6.241949143e-01f, +4.577571292e-01f, -3.137097110e-02f }, + { -4.656525215e-02f, +6.238501829e-01f, +4.581050460e-01f, -3.140301937e-02f }, + { -4.653515630e-02f, +6.235054019e-01f, +4.584529973e-01f, -3.143507415e-02f }, + { -4.650504379e-02f, +6.231605715e-01f, +4.588009829e-01f, -3.146713541e-02f }, + { -4.647491468e-02f, +6.228156918e-01f, +4.591490025e-01f, -3.149920310e-02f }, + { -4.644476904e-02f, +6.224707632e-01f, +4.594970561e-01f, -3.153127720e-02f }, + { -4.641460692e-02f, +6.221257857e-01f, +4.598451435e-01f, -3.156335765e-02f }, + { -4.638442839e-02f, +6.217807595e-01f, +4.601932645e-01f, -3.159544443e-02f }, + { -4.635423350e-02f, +6.214356849e-01f, +4.605414189e-01f, -3.162753750e-02f }, + { -4.632402231e-02f, +6.210905619e-01f, +4.608896066e-01f, -3.165963682e-02f }, + { -4.629379489e-02f, +6.207453909e-01f, +4.612378274e-01f, -3.169174236e-02f }, + { -4.626355130e-02f, +6.204001719e-01f, +4.615860812e-01f, -3.172385407e-02f }, + { -4.623329159e-02f, +6.200549052e-01f, +4.619343678e-01f, -3.175597193e-02f }, + { -4.620301584e-02f, +6.197095909e-01f, +4.622826870e-01f, -3.178809589e-02f }, + { -4.617272409e-02f, +6.193642293e-01f, +4.626310387e-01f, -3.182022591e-02f }, + { -4.614241641e-02f, +6.190188205e-01f, +4.629794226e-01f, -3.185236196e-02f }, + { -4.611209285e-02f, +6.186733647e-01f, +4.633278387e-01f, -3.188450401e-02f }, + { -4.608175349e-02f, +6.183278621e-01f, +4.636762867e-01f, -3.191665200e-02f }, + { -4.605139837e-02f, +6.179823129e-01f, +4.640247666e-01f, -3.194880592e-02f }, + { -4.602102757e-02f, +6.176367173e-01f, +4.643732781e-01f, -3.198096571e-02f }, + { -4.599064113e-02f, +6.172910754e-01f, +4.647218210e-01f, -3.201313134e-02f }, + { -4.596023912e-02f, +6.169453874e-01f, +4.650703953e-01f, -3.204530278e-02f }, + { -4.592982160e-02f, +6.165996536e-01f, +4.654190007e-01f, -3.207747998e-02f }, + { -4.589938863e-02f, +6.162538740e-01f, +4.657676371e-01f, -3.210966291e-02f }, + { -4.586894027e-02f, +6.159080490e-01f, +4.661163043e-01f, -3.214185153e-02f }, + { -4.583847658e-02f, +6.155621786e-01f, +4.664650021e-01f, -3.217404580e-02f }, + { -4.580799762e-02f, +6.152162631e-01f, +4.668137304e-01f, -3.220624568e-02f }, + { -4.577750344e-02f, +6.148703026e-01f, +4.671624891e-01f, -3.223845114e-02f }, + { -4.574699411e-02f, +6.145242974e-01f, +4.675112778e-01f, -3.227066214e-02f }, + { -4.571646969e-02f, +6.141782476e-01f, +4.678600966e-01f, -3.230287864e-02f }, + { -4.568593024e-02f, +6.138321534e-01f, +4.682089452e-01f, -3.233510060e-02f }, + { -4.565537582e-02f, +6.134860150e-01f, +4.685578234e-01f, -3.236732799e-02f }, + { -4.562480648e-02f, +6.131398326e-01f, +4.689067311e-01f, -3.239956076e-02f }, + { -4.559422228e-02f, +6.127936063e-01f, +4.692556681e-01f, -3.243179888e-02f }, + { -4.556362330e-02f, +6.124473364e-01f, +4.696046343e-01f, -3.246404230e-02f }, + { -4.553300957e-02f, +6.121010230e-01f, +4.699536294e-01f, -3.249629100e-02f }, + { -4.550238117e-02f, +6.117546663e-01f, +4.703026534e-01f, -3.252854493e-02f }, + { -4.547173816e-02f, +6.114082665e-01f, +4.706517061e-01f, -3.256080405e-02f }, + { -4.544108058e-02f, +6.110618238e-01f, +4.710007872e-01f, -3.259306833e-02f }, + { -4.541040851e-02f, +6.107153384e-01f, +4.713498966e-01f, -3.262533772e-02f }, + { -4.537972200e-02f, +6.103688104e-01f, +4.716990342e-01f, -3.265761219e-02f }, + { -4.534902111e-02f, +6.100222401e-01f, +4.720481998e-01f, -3.268989170e-02f }, + { -4.531830590e-02f, +6.096756276e-01f, +4.723973932e-01f, -3.272217621e-02f }, + { -4.528757642e-02f, +6.093289732e-01f, +4.727466142e-01f, -3.275446568e-02f }, + { -4.525683274e-02f, +6.089822769e-01f, +4.730958628e-01f, -3.278676008e-02f }, + { -4.522607492e-02f, +6.086355390e-01f, +4.734451386e-01f, -3.281905935e-02f }, + { -4.519530301e-02f, +6.082887597e-01f, +4.737944416e-01f, -3.285136347e-02f }, + { -4.516451708e-02f, +6.079419391e-01f, +4.741437716e-01f, -3.288367240e-02f }, + { -4.513371718e-02f, +6.075950775e-01f, +4.744931285e-01f, -3.291598609e-02f }, + { -4.510290336e-02f, +6.072481750e-01f, +4.748425119e-01f, -3.294830451e-02f }, + { -4.507207570e-02f, +6.069012318e-01f, +4.751919219e-01f, -3.298062762e-02f }, + { -4.504123425e-02f, +6.065542481e-01f, +4.755413581e-01f, -3.301295538e-02f }, + { -4.501037906e-02f, +6.062072240e-01f, +4.758908206e-01f, -3.304528775e-02f }, + { -4.497951020e-02f, +6.058601599e-01f, +4.762403090e-01f, -3.307762468e-02f }, + { -4.494862772e-02f, +6.055130558e-01f, +4.765898232e-01f, -3.310996615e-02f }, + { -4.491773168e-02f, +6.051659119e-01f, +4.769393630e-01f, -3.314231211e-02f }, + { -4.488682214e-02f, +6.048187284e-01f, +4.772889284e-01f, -3.317466252e-02f }, + { -4.485589916e-02f, +6.044715056e-01f, +4.776385190e-01f, -3.320701734e-02f }, + { -4.482496280e-02f, +6.041242435e-01f, +4.779881348e-01f, -3.323937653e-02f }, + { -4.479401311e-02f, +6.037769424e-01f, +4.783377756e-01f, -3.327174006e-02f }, + { -4.476305016e-02f, +6.034296025e-01f, +4.786874411e-01f, -3.330410788e-02f }, + { -4.473207400e-02f, +6.030822239e-01f, +4.790371313e-01f, -3.333647996e-02f }, + { -4.470108468e-02f, +6.027348068e-01f, +4.793868460e-01f, -3.336885624e-02f }, + { -4.467008228e-02f, +6.023873514e-01f, +4.797365850e-01f, -3.340123671e-02f }, + { -4.463906683e-02f, +6.020398580e-01f, +4.800863481e-01f, -3.343362130e-02f }, + { -4.460803842e-02f, +6.016923266e-01f, +4.804361352e-01f, -3.346600999e-02f }, + { -4.457699708e-02f, +6.013447575e-01f, +4.807859461e-01f, -3.349840273e-02f }, + { -4.454594288e-02f, +6.009971508e-01f, +4.811357806e-01f, -3.353079949e-02f }, + { -4.451487588e-02f, +6.006495068e-01f, +4.814856386e-01f, -3.356320022e-02f }, + { -4.448379613e-02f, +6.003018256e-01f, +4.818355198e-01f, -3.359560488e-02f }, + { -4.445270370e-02f, +5.999541074e-01f, +4.821854242e-01f, -3.362801344e-02f }, + { -4.442159863e-02f, +5.996063524e-01f, +4.825353516e-01f, -3.366042585e-02f }, + { -4.439048099e-02f, +5.992585607e-01f, +4.828853017e-01f, -3.369284207e-02f }, + { -4.435935084e-02f, +5.989107327e-01f, +4.832352745e-01f, -3.372526206e-02f }, + { -4.432820823e-02f, +5.985628683e-01f, +4.835852697e-01f, -3.375768579e-02f }, + { -4.429705321e-02f, +5.982149679e-01f, +4.839352871e-01f, -3.379011321e-02f }, + { -4.426588586e-02f, +5.978670316e-01f, +4.842853267e-01f, -3.382254427e-02f }, + { -4.423470622e-02f, +5.975190596e-01f, +4.846353882e-01f, -3.385497895e-02f }, + { -4.420351435e-02f, +5.971710521e-01f, +4.849854715e-01f, -3.388741720e-02f }, + { -4.417231031e-02f, +5.968230092e-01f, +4.853355764e-01f, -3.391985897e-02f }, + { -4.414109415e-02f, +5.964749312e-01f, +4.856857028e-01f, -3.395230423e-02f }, + { -4.410986594e-02f, +5.961268182e-01f, +4.860358504e-01f, -3.398475294e-02f }, + { -4.407862573e-02f, +5.957786704e-01f, +4.863860191e-01f, -3.401720506e-02f }, + { -4.404737358e-02f, +5.954304881e-01f, +4.867362087e-01f, -3.404966054e-02f }, + { -4.401610954e-02f, +5.950822713e-01f, +4.870864191e-01f, -3.408211934e-02f }, + { -4.398483367e-02f, +5.947340203e-01f, +4.874366500e-01f, -3.411458143e-02f }, + { -4.395354603e-02f, +5.943857352e-01f, +4.877869014e-01f, -3.414704676e-02f }, + { -4.392224667e-02f, +5.940374163e-01f, +4.881371730e-01f, -3.417951529e-02f }, + { -4.389093566e-02f, +5.936890637e-01f, +4.884874647e-01f, -3.421198698e-02f }, + { -4.385961304e-02f, +5.933406776e-01f, +4.888377763e-01f, -3.424446179e-02f }, + { -4.382827888e-02f, +5.929922582e-01f, +4.891881076e-01f, -3.427693968e-02f }, + { -4.379693323e-02f, +5.926438057e-01f, +4.895384585e-01f, -3.430942060e-02f }, + { -4.376557615e-02f, +5.922953202e-01f, +4.898888288e-01f, -3.434190452e-02f }, + { -4.373420769e-02f, +5.919468020e-01f, +4.902392184e-01f, -3.437439139e-02f }, + { -4.370282792e-02f, +5.915982512e-01f, +4.905896269e-01f, -3.440688117e-02f }, + { -4.367143688e-02f, +5.912496680e-01f, +4.909400544e-01f, -3.443937382e-02f }, + { -4.364003464e-02f, +5.909010526e-01f, +4.912905006e-01f, -3.447186930e-02f }, + { -4.360862124e-02f, +5.905524052e-01f, +4.916409653e-01f, -3.450436756e-02f }, + { -4.357719676e-02f, +5.902037260e-01f, +4.919914484e-01f, -3.453686857e-02f }, + { -4.354576123e-02f, +5.898550151e-01f, +4.923419497e-01f, -3.456937229e-02f }, + { -4.351431473e-02f, +5.895062727e-01f, +4.926924690e-01f, -3.460187866e-02f }, + { -4.348285730e-02f, +5.891574990e-01f, +4.930430062e-01f, -3.463438766e-02f }, + { -4.345138900e-02f, +5.888086942e-01f, +4.933935611e-01f, -3.466689923e-02f }, + { -4.341990989e-02f, +5.884598586e-01f, +4.937441335e-01f, -3.469941334e-02f }, + { -4.338842003e-02f, +5.881109921e-01f, +4.940947233e-01f, -3.473192994e-02f }, + { -4.335691946e-02f, +5.877620952e-01f, +4.944453302e-01f, -3.476444900e-02f }, + { -4.332540825e-02f, +5.874131678e-01f, +4.947959542e-01f, -3.479697046e-02f }, + { -4.329388645e-02f, +5.870642103e-01f, +4.951465949e-01f, -3.482949429e-02f }, + { -4.326235411e-02f, +5.867152227e-01f, +4.954972524e-01f, -3.486202044e-02f }, + { -4.323081130e-02f, +5.863662054e-01f, +4.958479263e-01f, -3.489454888e-02f }, + { -4.319925807e-02f, +5.860171584e-01f, +4.961986166e-01f, -3.492707956e-02f }, + { -4.316769447e-02f, +5.856680820e-01f, +4.965493230e-01f, -3.495961243e-02f }, + { -4.313612056e-02f, +5.853189763e-01f, +4.969000454e-01f, -3.499214746e-02f }, + { -4.310453640e-02f, +5.849698415e-01f, +4.972507836e-01f, -3.502468461e-02f }, + { -4.307294203e-02f, +5.846206778e-01f, +4.976015374e-01f, -3.505722382e-02f }, + { -4.304133752e-02f, +5.842714854e-01f, +4.979523067e-01f, -3.508976506e-02f }, + { -4.300972293e-02f, +5.839222644e-01f, +4.983030913e-01f, -3.512230829e-02f }, + { -4.297809830e-02f, +5.835730151e-01f, +4.986538910e-01f, -3.515485346e-02f }, + { -4.294646369e-02f, +5.832237377e-01f, +4.990047056e-01f, -3.518740053e-02f }, + { -4.291481916e-02f, +5.828744322e-01f, +4.993555351e-01f, -3.521994946e-02f }, + { -4.288316476e-02f, +5.825250990e-01f, +4.997063791e-01f, -3.525250020e-02f }, + { -4.285150055e-02f, +5.821757381e-01f, +5.000572376e-01f, -3.528505271e-02f }, + { -4.281982659e-02f, +5.818263498e-01f, +5.004081103e-01f, -3.531760695e-02f }, + { -4.278814292e-02f, +5.814769342e-01f, +5.007589972e-01f, -3.535016287e-02f }, + { -4.275644960e-02f, +5.811274916e-01f, +5.011098979e-01f, -3.538272044e-02f }, + { -4.272474669e-02f, +5.807780221e-01f, +5.014608124e-01f, -3.541527960e-02f }, + { -4.269303424e-02f, +5.804285259e-01f, +5.018117405e-01f, -3.544784032e-02f }, + { -4.266131231e-02f, +5.800790031e-01f, +5.021626819e-01f, -3.548040255e-02f }, + { -4.262958096e-02f, +5.797294541e-01f, +5.025136366e-01f, -3.551296626e-02f }, + { -4.259784023e-02f, +5.793798788e-01f, +5.028646044e-01f, -3.554553138e-02f }, + { -4.256609018e-02f, +5.790302776e-01f, +5.032155850e-01f, -3.557809789e-02f }, + { -4.253433087e-02f, +5.786806507e-01f, +5.035665783e-01f, -3.561066574e-02f }, + { -4.250256235e-02f, +5.783309981e-01f, +5.039175842e-01f, -3.564323489e-02f }, + { -4.247078467e-02f, +5.779813201e-01f, +5.042686025e-01f, -3.567580528e-02f }, + { -4.243899790e-02f, +5.776316168e-01f, +5.046196329e-01f, -3.570837689e-02f }, + { -4.240720208e-02f, +5.772818885e-01f, +5.049706753e-01f, -3.574094966e-02f }, + { -4.237539726e-02f, +5.769321353e-01f, +5.053217296e-01f, -3.577352355e-02f }, + { -4.234358351e-02f, +5.765823574e-01f, +5.056727956e-01f, -3.580609851e-02f }, + { -4.231176088e-02f, +5.762325550e-01f, +5.060238731e-01f, -3.583867451e-02f }, + { -4.227992942e-02f, +5.758827283e-01f, +5.063749619e-01f, -3.587125150e-02f }, + { -4.224808919e-02f, +5.755328774e-01f, +5.067260619e-01f, -3.590382944e-02f }, + { -4.221624023e-02f, +5.751830026e-01f, +5.070771728e-01f, -3.593640828e-02f }, + { -4.218438261e-02f, +5.748331040e-01f, +5.074282945e-01f, -3.596898797e-02f }, + { -4.215251638e-02f, +5.744831818e-01f, +5.077794269e-01f, -3.600156848e-02f }, + { -4.212064159e-02f, +5.741332362e-01f, +5.081305697e-01f, -3.603414976e-02f }, + { -4.208875830e-02f, +5.737832673e-01f, +5.084817229e-01f, -3.606673176e-02f }, + { -4.205686655e-02f, +5.734332754e-01f, +5.088328861e-01f, -3.609931444e-02f }, + { -4.202496641e-02f, +5.730832607e-01f, +5.091840593e-01f, -3.613189776e-02f }, + { -4.199305793e-02f, +5.727332232e-01f, +5.095352422e-01f, -3.616448168e-02f }, + { -4.196114116e-02f, +5.723831633e-01f, +5.098864348e-01f, -3.619706614e-02f }, + { -4.192921615e-02f, +5.720330810e-01f, +5.102376367e-01f, -3.622965110e-02f }, + { -4.189728297e-02f, +5.716829766e-01f, +5.105888479e-01f, -3.626223652e-02f }, + { -4.186534165e-02f, +5.713328502e-01f, +5.109400682e-01f, -3.629482236e-02f }, + { -4.183339226e-02f, +5.709827020e-01f, +5.112912974e-01f, -3.632740857e-02f }, + { -4.180143485e-02f, +5.706325323e-01f, +5.116425353e-01f, -3.635999510e-02f }, + { -4.176946947e-02f, +5.702823411e-01f, +5.119937817e-01f, -3.639258191e-02f }, + { -4.173749618e-02f, +5.699321287e-01f, +5.123450366e-01f, -3.642516896e-02f }, + { -4.170551503e-02f, +5.695818953e-01f, +5.126962996e-01f, -3.645775620e-02f }, + { -4.167352607e-02f, +5.692316410e-01f, +5.130475706e-01f, -3.649034358e-02f }, + { -4.164152936e-02f, +5.688813660e-01f, +5.133988495e-01f, -3.652293107e-02f }, + { -4.160952494e-02f, +5.685310706e-01f, +5.137501361e-01f, -3.655551861e-02f }, + { -4.157751288e-02f, +5.681807548e-01f, +5.141014302e-01f, -3.658810617e-02f }, + { -4.154549322e-02f, +5.678304188e-01f, +5.144527316e-01f, -3.662069369e-02f }, + { -4.151346602e-02f, +5.674800629e-01f, +5.148040402e-01f, -3.665328113e-02f }, + { -4.148143133e-02f, +5.671296873e-01f, +5.151553558e-01f, -3.668586844e-02f }, + { -4.144938921e-02f, +5.667792920e-01f, +5.155066781e-01f, -3.671845559e-02f }, + { -4.141733970e-02f, +5.664288773e-01f, +5.158580071e-01f, -3.675104252e-02f }, + { -4.138528287e-02f, +5.660784434e-01f, +5.162093426e-01f, -3.678362919e-02f }, + { -4.135321875e-02f, +5.657279905e-01f, +5.165606843e-01f, -3.681621556e-02f }, + { -4.132114741e-02f, +5.653775186e-01f, +5.169120321e-01f, -3.684880158e-02f }, + { -4.128906890e-02f, +5.650270281e-01f, +5.172633859e-01f, -3.688138720e-02f }, + { -4.125698327e-02f, +5.646765191e-01f, +5.176147454e-01f, -3.691397237e-02f }, + { -4.122489058e-02f, +5.643259918e-01f, +5.179661105e-01f, -3.694655706e-02f }, + { -4.119279087e-02f, +5.639754463e-01f, +5.183174810e-01f, -3.697914122e-02f }, + { -4.116068419e-02f, +5.636248829e-01f, +5.186688568e-01f, -3.701172480e-02f }, + { -4.112857061e-02f, +5.632743017e-01f, +5.190202376e-01f, -3.704430775e-02f }, + { -4.109645017e-02f, +5.629237029e-01f, +5.193716233e-01f, -3.707689003e-02f }, + { -4.106432293e-02f, +5.625730867e-01f, +5.197230137e-01f, -3.710947160e-02f }, + { -4.103218893e-02f, +5.622224532e-01f, +5.200744086e-01f, -3.714205241e-02f }, + { -4.100004824e-02f, +5.618718027e-01f, +5.204258079e-01f, -3.717463240e-02f }, + { -4.096790089e-02f, +5.615211353e-01f, +5.207772113e-01f, -3.720721154e-02f }, + { -4.093574695e-02f, +5.611704512e-01f, +5.211286188e-01f, -3.723978979e-02f }, + { -4.090358647e-02f, +5.608197506e-01f, +5.214800301e-01f, -3.727236708e-02f }, + { -4.087141949e-02f, +5.604690337e-01f, +5.218314450e-01f, -3.730494338e-02f }, + { -4.083924608e-02f, +5.601183006e-01f, +5.221828634e-01f, -3.733751865e-02f }, + { -4.080706628e-02f, +5.597675516e-01f, +5.225342852e-01f, -3.737009283e-02f }, + { -4.077488014e-02f, +5.594167868e-01f, +5.228857100e-01f, -3.740266587e-02f }, + { -4.074268771e-02f, +5.590660064e-01f, +5.232371378e-01f, -3.743523774e-02f }, + { -4.071048906e-02f, +5.587152105e-01f, +5.235885684e-01f, -3.746780839e-02f }, + { -4.067828422e-02f, +5.583643994e-01f, +5.239400015e-01f, -3.750037777e-02f }, + { -4.064607325e-02f, +5.580135732e-01f, +5.242914371e-01f, -3.753294582e-02f }, + { -4.061385621e-02f, +5.576627322e-01f, +5.246428750e-01f, -3.756551252e-02f }, + { -4.058163314e-02f, +5.573118764e-01f, +5.249943149e-01f, -3.759807780e-02f }, + { -4.054940409e-02f, +5.569610062e-01f, +5.253457567e-01f, -3.763064163e-02f }, + { -4.051716913e-02f, +5.566101215e-01f, +5.256972002e-01f, -3.766320395e-02f }, + { -4.048492829e-02f, +5.562592228e-01f, +5.260486453e-01f, -3.769576473e-02f }, + { -4.045268163e-02f, +5.559083100e-01f, +5.264000917e-01f, -3.772832390e-02f }, + { -4.042042920e-02f, +5.555573834e-01f, +5.267515394e-01f, -3.776088143e-02f }, + { -4.038817105e-02f, +5.552064433e-01f, +5.271029880e-01f, -3.779343727e-02f }, + { -4.035590724e-02f, +5.548554896e-01f, +5.274544375e-01f, -3.782599137e-02f }, + { -4.032363781e-02f, +5.545045228e-01f, +5.278058876e-01f, -3.785854369e-02f }, + { -4.029136282e-02f, +5.541535428e-01f, +5.281573382e-01f, -3.789109417e-02f }, + { -4.025908231e-02f, +5.538025499e-01f, +5.285087891e-01f, -3.792364277e-02f }, + { -4.022679634e-02f, +5.534515443e-01f, +5.288602402e-01f, -3.795618945e-02f }, + { -4.019450496e-02f, +5.531005262e-01f, +5.292116912e-01f, -3.798873415e-02f }, + { -4.016220822e-02f, +5.527494957e-01f, +5.295631419e-01f, -3.802127683e-02f }, + { -4.012990617e-02f, +5.523984531e-01f, +5.299145923e-01f, -3.805381745e-02f }, + { -4.009759887e-02f, +5.520473984e-01f, +5.302660421e-01f, -3.808635594e-02f }, + { -4.006528635e-02f, +5.516963319e-01f, +5.306174912e-01f, -3.811889228e-02f }, + { -4.003296867e-02f, +5.513452538e-01f, +5.309689393e-01f, -3.815142640e-02f }, + { -4.000064589e-02f, +5.509941643e-01f, +5.313203863e-01f, -3.818395826e-02f }, + { -3.996831805e-02f, +5.506430634e-01f, +5.316718320e-01f, -3.821648782e-02f }, + { -3.993598521e-02f, +5.502919514e-01f, +5.320232763e-01f, -3.824901502e-02f }, + { -3.990364741e-02f, +5.499408286e-01f, +5.323747189e-01f, -3.828153982e-02f }, + { -3.987130471e-02f, +5.495896949e-01f, +5.327261597e-01f, -3.831406217e-02f }, + { -3.983895715e-02f, +5.492385508e-01f, +5.330775985e-01f, -3.834658202e-02f }, + { -3.980660479e-02f, +5.488873962e-01f, +5.334290351e-01f, -3.837909933e-02f }, + { -3.977424767e-02f, +5.485362314e-01f, +5.337804694e-01f, -3.841161404e-02f }, + { -3.974188585e-02f, +5.481850566e-01f, +5.341319012e-01f, -3.844412612e-02f }, + { -3.970951938e-02f, +5.478338720e-01f, +5.344833302e-01f, -3.847663550e-02f }, + { -3.967714830e-02f, +5.474826777e-01f, +5.348347564e-01f, -3.850914215e-02f }, + { -3.964477267e-02f, +5.471314739e-01f, +5.351861795e-01f, -3.854164601e-02f }, + { -3.961239253e-02f, +5.467802608e-01f, +5.355375994e-01f, -3.857414703e-02f }, + { -3.958000795e-02f, +5.464290386e-01f, +5.358890159e-01f, -3.860664518e-02f }, + { -3.954761896e-02f, +5.460778075e-01f, +5.362404287e-01f, -3.863914039e-02f }, + { -3.951522561e-02f, +5.457265676e-01f, +5.365918378e-01f, -3.867163263e-02f }, + { -3.948282796e-02f, +5.453753190e-01f, +5.369432430e-01f, -3.870412184e-02f }, + { -3.945042606e-02f, +5.450240621e-01f, +5.372946440e-01f, -3.873660797e-02f }, + { -3.941801995e-02f, +5.446727970e-01f, +5.376460407e-01f, -3.876909098e-02f }, + { -3.938560969e-02f, +5.443215238e-01f, +5.379974330e-01f, -3.880157082e-02f }, + { -3.935319533e-02f, +5.439702427e-01f, +5.383488206e-01f, -3.883404743e-02f }, + { -3.932077690e-02f, +5.436189539e-01f, +5.387002033e-01f, -3.886652078e-02f }, + { -3.928835448e-02f, +5.432676576e-01f, +5.390515810e-01f, -3.889899081e-02f }, + { -3.925592809e-02f, +5.429163540e-01f, +5.394029536e-01f, -3.893145747e-02f }, + { -3.922349780e-02f, +5.425650432e-01f, +5.397543207e-01f, -3.896392071e-02f }, + { -3.919106365e-02f, +5.422137254e-01f, +5.401056823e-01f, -3.899638049e-02f }, + { -3.915862569e-02f, +5.418624009e-01f, +5.404570382e-01f, -3.902883675e-02f }, + { -3.912618397e-02f, +5.415110697e-01f, +5.408083882e-01f, -3.906128945e-02f }, + { -3.909373854e-02f, +5.411597321e-01f, +5.411597321e-01f, -3.909373854e-02f }, + { -3.906128945e-02f, +5.408083882e-01f, +5.415110697e-01f, -3.912618397e-02f }, + { -3.902883675e-02f, +5.404570382e-01f, +5.418624009e-01f, -3.915862569e-02f }, + { -3.899638049e-02f, +5.401056823e-01f, +5.422137254e-01f, -3.919106365e-02f }, + { -3.896392071e-02f, +5.397543207e-01f, +5.425650432e-01f, -3.922349780e-02f }, + { -3.893145747e-02f, +5.394029536e-01f, +5.429163540e-01f, -3.925592809e-02f }, + { -3.889899081e-02f, +5.390515810e-01f, +5.432676576e-01f, -3.928835448e-02f }, + { -3.886652078e-02f, +5.387002033e-01f, +5.436189539e-01f, -3.932077690e-02f }, + { -3.883404743e-02f, +5.383488206e-01f, +5.439702427e-01f, -3.935319533e-02f }, + { -3.880157082e-02f, +5.379974330e-01f, +5.443215238e-01f, -3.938560969e-02f }, + { -3.876909098e-02f, +5.376460407e-01f, +5.446727970e-01f, -3.941801995e-02f }, + { -3.873660797e-02f, +5.372946440e-01f, +5.450240621e-01f, -3.945042606e-02f }, + { -3.870412184e-02f, +5.369432430e-01f, +5.453753190e-01f, -3.948282796e-02f }, + { -3.867163263e-02f, +5.365918378e-01f, +5.457265676e-01f, -3.951522561e-02f }, + { -3.863914039e-02f, +5.362404287e-01f, +5.460778075e-01f, -3.954761896e-02f }, + { -3.860664518e-02f, +5.358890159e-01f, +5.464290386e-01f, -3.958000795e-02f }, + { -3.857414703e-02f, +5.355375994e-01f, +5.467802608e-01f, -3.961239253e-02f }, + { -3.854164601e-02f, +5.351861795e-01f, +5.471314739e-01f, -3.964477267e-02f }, + { -3.850914215e-02f, +5.348347564e-01f, +5.474826777e-01f, -3.967714830e-02f }, + { -3.847663550e-02f, +5.344833302e-01f, +5.478338720e-01f, -3.970951938e-02f }, + { -3.844412612e-02f, +5.341319012e-01f, +5.481850566e-01f, -3.974188585e-02f }, + { -3.841161404e-02f, +5.337804694e-01f, +5.485362314e-01f, -3.977424767e-02f }, + { -3.837909933e-02f, +5.334290351e-01f, +5.488873962e-01f, -3.980660479e-02f }, + { -3.834658202e-02f, +5.330775985e-01f, +5.492385508e-01f, -3.983895715e-02f }, + { -3.831406217e-02f, +5.327261597e-01f, +5.495896949e-01f, -3.987130471e-02f }, + { -3.828153982e-02f, +5.323747189e-01f, +5.499408286e-01f, -3.990364741e-02f }, + { -3.824901502e-02f, +5.320232763e-01f, +5.502919514e-01f, -3.993598521e-02f }, + { -3.821648782e-02f, +5.316718320e-01f, +5.506430634e-01f, -3.996831805e-02f }, + { -3.818395826e-02f, +5.313203863e-01f, +5.509941643e-01f, -4.000064589e-02f }, + { -3.815142640e-02f, +5.309689393e-01f, +5.513452538e-01f, -4.003296867e-02f }, + { -3.811889228e-02f, +5.306174912e-01f, +5.516963319e-01f, -4.006528635e-02f }, + { -3.808635594e-02f, +5.302660421e-01f, +5.520473984e-01f, -4.009759887e-02f }, + { -3.805381745e-02f, +5.299145923e-01f, +5.523984531e-01f, -4.012990617e-02f }, + { -3.802127683e-02f, +5.295631419e-01f, +5.527494957e-01f, -4.016220822e-02f }, + { -3.798873415e-02f, +5.292116912e-01f, +5.531005262e-01f, -4.019450496e-02f }, + { -3.795618945e-02f, +5.288602402e-01f, +5.534515443e-01f, -4.022679634e-02f }, + { -3.792364277e-02f, +5.285087891e-01f, +5.538025499e-01f, -4.025908231e-02f }, + { -3.789109417e-02f, +5.281573382e-01f, +5.541535428e-01f, -4.029136282e-02f }, + { -3.785854369e-02f, +5.278058876e-01f, +5.545045228e-01f, -4.032363781e-02f }, + { -3.782599137e-02f, +5.274544375e-01f, +5.548554896e-01f, -4.035590724e-02f }, + { -3.779343727e-02f, +5.271029880e-01f, +5.552064433e-01f, -4.038817105e-02f }, + { -3.776088143e-02f, +5.267515394e-01f, +5.555573834e-01f, -4.042042920e-02f }, + { -3.772832390e-02f, +5.264000917e-01f, +5.559083100e-01f, -4.045268163e-02f }, + { -3.769576473e-02f, +5.260486453e-01f, +5.562592228e-01f, -4.048492829e-02f }, + { -3.766320395e-02f, +5.256972002e-01f, +5.566101215e-01f, -4.051716913e-02f }, + { -3.763064163e-02f, +5.253457567e-01f, +5.569610062e-01f, -4.054940409e-02f }, + { -3.759807780e-02f, +5.249943149e-01f, +5.573118764e-01f, -4.058163314e-02f }, + { -3.756551252e-02f, +5.246428750e-01f, +5.576627322e-01f, -4.061385621e-02f }, + { -3.753294582e-02f, +5.242914371e-01f, +5.580135732e-01f, -4.064607325e-02f }, + { -3.750037777e-02f, +5.239400015e-01f, +5.583643994e-01f, -4.067828422e-02f }, + { -3.746780839e-02f, +5.235885684e-01f, +5.587152105e-01f, -4.071048906e-02f }, + { -3.743523774e-02f, +5.232371378e-01f, +5.590660064e-01f, -4.074268771e-02f }, + { -3.740266587e-02f, +5.228857100e-01f, +5.594167868e-01f, -4.077488014e-02f }, + { -3.737009283e-02f, +5.225342852e-01f, +5.597675516e-01f, -4.080706628e-02f }, + { -3.733751865e-02f, +5.221828634e-01f, +5.601183006e-01f, -4.083924608e-02f }, + { -3.730494338e-02f, +5.218314450e-01f, +5.604690337e-01f, -4.087141949e-02f }, + { -3.727236708e-02f, +5.214800301e-01f, +5.608197506e-01f, -4.090358647e-02f }, + { -3.723978979e-02f, +5.211286188e-01f, +5.611704512e-01f, -4.093574695e-02f }, + { -3.720721154e-02f, +5.207772113e-01f, +5.615211353e-01f, -4.096790089e-02f }, + { -3.717463240e-02f, +5.204258079e-01f, +5.618718027e-01f, -4.100004824e-02f }, + { -3.714205241e-02f, +5.200744086e-01f, +5.622224532e-01f, -4.103218893e-02f }, + { -3.710947160e-02f, +5.197230137e-01f, +5.625730867e-01f, -4.106432293e-02f }, + { -3.707689003e-02f, +5.193716233e-01f, +5.629237029e-01f, -4.109645017e-02f }, + { -3.704430775e-02f, +5.190202376e-01f, +5.632743017e-01f, -4.112857061e-02f }, + { -3.701172480e-02f, +5.186688568e-01f, +5.636248829e-01f, -4.116068419e-02f }, + { -3.697914122e-02f, +5.183174810e-01f, +5.639754463e-01f, -4.119279087e-02f }, + { -3.694655706e-02f, +5.179661105e-01f, +5.643259918e-01f, -4.122489058e-02f }, + { -3.691397237e-02f, +5.176147454e-01f, +5.646765191e-01f, -4.125698327e-02f }, + { -3.688138720e-02f, +5.172633859e-01f, +5.650270281e-01f, -4.128906890e-02f }, + { -3.684880158e-02f, +5.169120321e-01f, +5.653775186e-01f, -4.132114741e-02f }, + { -3.681621556e-02f, +5.165606843e-01f, +5.657279905e-01f, -4.135321875e-02f }, + { -3.678362919e-02f, +5.162093426e-01f, +5.660784434e-01f, -4.138528287e-02f }, + { -3.675104252e-02f, +5.158580071e-01f, +5.664288773e-01f, -4.141733970e-02f }, + { -3.671845559e-02f, +5.155066781e-01f, +5.667792920e-01f, -4.144938921e-02f }, + { -3.668586844e-02f, +5.151553558e-01f, +5.671296873e-01f, -4.148143133e-02f }, + { -3.665328113e-02f, +5.148040402e-01f, +5.674800629e-01f, -4.151346602e-02f }, + { -3.662069369e-02f, +5.144527316e-01f, +5.678304188e-01f, -4.154549322e-02f }, + { -3.658810617e-02f, +5.141014302e-01f, +5.681807548e-01f, -4.157751288e-02f }, + { -3.655551861e-02f, +5.137501361e-01f, +5.685310706e-01f, -4.160952494e-02f }, + { -3.652293107e-02f, +5.133988495e-01f, +5.688813660e-01f, -4.164152936e-02f }, + { -3.649034358e-02f, +5.130475706e-01f, +5.692316410e-01f, -4.167352607e-02f }, + { -3.645775620e-02f, +5.126962996e-01f, +5.695818953e-01f, -4.170551503e-02f }, + { -3.642516896e-02f, +5.123450366e-01f, +5.699321287e-01f, -4.173749618e-02f }, + { -3.639258191e-02f, +5.119937817e-01f, +5.702823411e-01f, -4.176946947e-02f }, + { -3.635999510e-02f, +5.116425353e-01f, +5.706325323e-01f, -4.180143485e-02f }, + { -3.632740857e-02f, +5.112912974e-01f, +5.709827020e-01f, -4.183339226e-02f }, + { -3.629482236e-02f, +5.109400682e-01f, +5.713328502e-01f, -4.186534165e-02f }, + { -3.626223652e-02f, +5.105888479e-01f, +5.716829766e-01f, -4.189728297e-02f }, + { -3.622965110e-02f, +5.102376367e-01f, +5.720330810e-01f, -4.192921615e-02f }, + { -3.619706614e-02f, +5.098864348e-01f, +5.723831633e-01f, -4.196114116e-02f }, + { -3.616448168e-02f, +5.095352422e-01f, +5.727332232e-01f, -4.199305793e-02f }, + { -3.613189776e-02f, +5.091840593e-01f, +5.730832607e-01f, -4.202496641e-02f }, + { -3.609931444e-02f, +5.088328861e-01f, +5.734332754e-01f, -4.205686655e-02f }, + { -3.606673176e-02f, +5.084817229e-01f, +5.737832673e-01f, -4.208875830e-02f }, + { -3.603414976e-02f, +5.081305697e-01f, +5.741332362e-01f, -4.212064159e-02f }, + { -3.600156848e-02f, +5.077794269e-01f, +5.744831818e-01f, -4.215251638e-02f }, + { -3.596898797e-02f, +5.074282945e-01f, +5.748331040e-01f, -4.218438261e-02f }, + { -3.593640828e-02f, +5.070771728e-01f, +5.751830026e-01f, -4.221624023e-02f }, + { -3.590382944e-02f, +5.067260619e-01f, +5.755328774e-01f, -4.224808919e-02f }, + { -3.587125150e-02f, +5.063749619e-01f, +5.758827283e-01f, -4.227992942e-02f }, + { -3.583867451e-02f, +5.060238731e-01f, +5.762325550e-01f, -4.231176088e-02f }, + { -3.580609851e-02f, +5.056727956e-01f, +5.765823574e-01f, -4.234358351e-02f }, + { -3.577352355e-02f, +5.053217296e-01f, +5.769321353e-01f, -4.237539726e-02f }, + { -3.574094966e-02f, +5.049706753e-01f, +5.772818885e-01f, -4.240720208e-02f }, + { -3.570837689e-02f, +5.046196329e-01f, +5.776316168e-01f, -4.243899790e-02f }, + { -3.567580528e-02f, +5.042686025e-01f, +5.779813201e-01f, -4.247078467e-02f }, + { -3.564323489e-02f, +5.039175842e-01f, +5.783309981e-01f, -4.250256235e-02f }, + { -3.561066574e-02f, +5.035665783e-01f, +5.786806507e-01f, -4.253433087e-02f }, + { -3.557809789e-02f, +5.032155850e-01f, +5.790302776e-01f, -4.256609018e-02f }, + { -3.554553138e-02f, +5.028646044e-01f, +5.793798788e-01f, -4.259784023e-02f }, + { -3.551296626e-02f, +5.025136366e-01f, +5.797294541e-01f, -4.262958096e-02f }, + { -3.548040255e-02f, +5.021626819e-01f, +5.800790031e-01f, -4.266131231e-02f }, + { -3.544784032e-02f, +5.018117405e-01f, +5.804285259e-01f, -4.269303424e-02f }, + { -3.541527960e-02f, +5.014608124e-01f, +5.807780221e-01f, -4.272474669e-02f }, + { -3.538272044e-02f, +5.011098979e-01f, +5.811274916e-01f, -4.275644960e-02f }, + { -3.535016287e-02f, +5.007589972e-01f, +5.814769342e-01f, -4.278814292e-02f }, + { -3.531760695e-02f, +5.004081103e-01f, +5.818263498e-01f, -4.281982659e-02f }, + { -3.528505271e-02f, +5.000572376e-01f, +5.821757381e-01f, -4.285150055e-02f }, + { -3.525250020e-02f, +4.997063791e-01f, +5.825250990e-01f, -4.288316476e-02f }, + { -3.521994946e-02f, +4.993555351e-01f, +5.828744322e-01f, -4.291481916e-02f }, + { -3.518740053e-02f, +4.990047056e-01f, +5.832237377e-01f, -4.294646369e-02f }, + { -3.515485346e-02f, +4.986538910e-01f, +5.835730151e-01f, -4.297809830e-02f }, + { -3.512230829e-02f, +4.983030913e-01f, +5.839222644e-01f, -4.300972293e-02f }, + { -3.508976506e-02f, +4.979523067e-01f, +5.842714854e-01f, -4.304133752e-02f }, + { -3.505722382e-02f, +4.976015374e-01f, +5.846206778e-01f, -4.307294203e-02f }, + { -3.502468461e-02f, +4.972507836e-01f, +5.849698415e-01f, -4.310453640e-02f }, + { -3.499214746e-02f, +4.969000454e-01f, +5.853189763e-01f, -4.313612056e-02f }, + { -3.495961243e-02f, +4.965493230e-01f, +5.856680820e-01f, -4.316769447e-02f }, + { -3.492707956e-02f, +4.961986166e-01f, +5.860171584e-01f, -4.319925807e-02f }, + { -3.489454888e-02f, +4.958479263e-01f, +5.863662054e-01f, -4.323081130e-02f }, + { -3.486202044e-02f, +4.954972524e-01f, +5.867152227e-01f, -4.326235411e-02f }, + { -3.482949429e-02f, +4.951465949e-01f, +5.870642103e-01f, -4.329388645e-02f }, + { -3.479697046e-02f, +4.947959542e-01f, +5.874131678e-01f, -4.332540825e-02f }, + { -3.476444900e-02f, +4.944453302e-01f, +5.877620952e-01f, -4.335691946e-02f }, + { -3.473192994e-02f, +4.940947233e-01f, +5.881109921e-01f, -4.338842003e-02f }, + { -3.469941334e-02f, +4.937441335e-01f, +5.884598586e-01f, -4.341990989e-02f }, + { -3.466689923e-02f, +4.933935611e-01f, +5.888086942e-01f, -4.345138900e-02f }, + { -3.463438766e-02f, +4.930430062e-01f, +5.891574990e-01f, -4.348285730e-02f }, + { -3.460187866e-02f, +4.926924690e-01f, +5.895062727e-01f, -4.351431473e-02f }, + { -3.456937229e-02f, +4.923419497e-01f, +5.898550151e-01f, -4.354576123e-02f }, + { -3.453686857e-02f, +4.919914484e-01f, +5.902037260e-01f, -4.357719676e-02f }, + { -3.450436756e-02f, +4.916409653e-01f, +5.905524052e-01f, -4.360862124e-02f }, + { -3.447186930e-02f, +4.912905006e-01f, +5.909010526e-01f, -4.364003464e-02f }, + { -3.443937382e-02f, +4.909400544e-01f, +5.912496680e-01f, -4.367143688e-02f }, + { -3.440688117e-02f, +4.905896269e-01f, +5.915982512e-01f, -4.370282792e-02f }, + { -3.437439139e-02f, +4.902392184e-01f, +5.919468020e-01f, -4.373420769e-02f }, + { -3.434190452e-02f, +4.898888288e-01f, +5.922953202e-01f, -4.376557615e-02f }, + { -3.430942060e-02f, +4.895384585e-01f, +5.926438057e-01f, -4.379693323e-02f }, + { -3.427693968e-02f, +4.891881076e-01f, +5.929922582e-01f, -4.382827888e-02f }, + { -3.424446179e-02f, +4.888377763e-01f, +5.933406776e-01f, -4.385961304e-02f }, + { -3.421198698e-02f, +4.884874647e-01f, +5.936890637e-01f, -4.389093566e-02f }, + { -3.417951529e-02f, +4.881371730e-01f, +5.940374163e-01f, -4.392224667e-02f }, + { -3.414704676e-02f, +4.877869014e-01f, +5.943857352e-01f, -4.395354603e-02f }, + { -3.411458143e-02f, +4.874366500e-01f, +5.947340203e-01f, -4.398483367e-02f }, + { -3.408211934e-02f, +4.870864191e-01f, +5.950822713e-01f, -4.401610954e-02f }, + { -3.404966054e-02f, +4.867362087e-01f, +5.954304881e-01f, -4.404737358e-02f }, + { -3.401720506e-02f, +4.863860191e-01f, +5.957786704e-01f, -4.407862573e-02f }, + { -3.398475294e-02f, +4.860358504e-01f, +5.961268182e-01f, -4.410986594e-02f }, + { -3.395230423e-02f, +4.856857028e-01f, +5.964749312e-01f, -4.414109415e-02f }, + { -3.391985897e-02f, +4.853355764e-01f, +5.968230092e-01f, -4.417231031e-02f }, + { -3.388741720e-02f, +4.849854715e-01f, +5.971710521e-01f, -4.420351435e-02f }, + { -3.385497895e-02f, +4.846353882e-01f, +5.975190596e-01f, -4.423470622e-02f }, + { -3.382254427e-02f, +4.842853267e-01f, +5.978670316e-01f, -4.426588586e-02f }, + { -3.379011321e-02f, +4.839352871e-01f, +5.982149679e-01f, -4.429705321e-02f }, + { -3.375768579e-02f, +4.835852697e-01f, +5.985628683e-01f, -4.432820823e-02f }, + { -3.372526206e-02f, +4.832352745e-01f, +5.989107327e-01f, -4.435935084e-02f }, + { -3.369284207e-02f, +4.828853017e-01f, +5.992585607e-01f, -4.439048099e-02f }, + { -3.366042585e-02f, +4.825353516e-01f, +5.996063524e-01f, -4.442159863e-02f }, + { -3.362801344e-02f, +4.821854242e-01f, +5.999541074e-01f, -4.445270370e-02f }, + { -3.359560488e-02f, +4.818355198e-01f, +6.003018256e-01f, -4.448379613e-02f }, + { -3.356320022e-02f, +4.814856386e-01f, +6.006495068e-01f, -4.451487588e-02f }, + { -3.353079949e-02f, +4.811357806e-01f, +6.009971508e-01f, -4.454594288e-02f }, + { -3.349840273e-02f, +4.807859461e-01f, +6.013447575e-01f, -4.457699708e-02f }, + { -3.346600999e-02f, +4.804361352e-01f, +6.016923266e-01f, -4.460803842e-02f }, + { -3.343362130e-02f, +4.800863481e-01f, +6.020398580e-01f, -4.463906683e-02f }, + { -3.340123671e-02f, +4.797365850e-01f, +6.023873514e-01f, -4.467008228e-02f }, + { -3.336885624e-02f, +4.793868460e-01f, +6.027348068e-01f, -4.470108468e-02f }, + { -3.333647996e-02f, +4.790371313e-01f, +6.030822239e-01f, -4.473207400e-02f }, + { -3.330410788e-02f, +4.786874411e-01f, +6.034296025e-01f, -4.476305016e-02f }, + { -3.327174006e-02f, +4.783377756e-01f, +6.037769424e-01f, -4.479401311e-02f }, + { -3.323937653e-02f, +4.779881348e-01f, +6.041242435e-01f, -4.482496280e-02f }, + { -3.320701734e-02f, +4.776385190e-01f, +6.044715056e-01f, -4.485589916e-02f }, + { -3.317466252e-02f, +4.772889284e-01f, +6.048187284e-01f, -4.488682214e-02f }, + { -3.314231211e-02f, +4.769393630e-01f, +6.051659119e-01f, -4.491773168e-02f }, + { -3.310996615e-02f, +4.765898232e-01f, +6.055130558e-01f, -4.494862772e-02f }, + { -3.307762468e-02f, +4.762403090e-01f, +6.058601599e-01f, -4.497951020e-02f }, + { -3.304528775e-02f, +4.758908206e-01f, +6.062072240e-01f, -4.501037906e-02f }, + { -3.301295538e-02f, +4.755413581e-01f, +6.065542481e-01f, -4.504123425e-02f }, + { -3.298062762e-02f, +4.751919219e-01f, +6.069012318e-01f, -4.507207570e-02f }, + { -3.294830451e-02f, +4.748425119e-01f, +6.072481750e-01f, -4.510290336e-02f }, + { -3.291598609e-02f, +4.744931285e-01f, +6.075950775e-01f, -4.513371718e-02f }, + { -3.288367240e-02f, +4.741437716e-01f, +6.079419391e-01f, -4.516451708e-02f }, + { -3.285136347e-02f, +4.737944416e-01f, +6.082887597e-01f, -4.519530301e-02f }, + { -3.281905935e-02f, +4.734451386e-01f, +6.086355390e-01f, -4.522607492e-02f }, + { -3.278676008e-02f, +4.730958628e-01f, +6.089822769e-01f, -4.525683274e-02f }, + { -3.275446568e-02f, +4.727466142e-01f, +6.093289732e-01f, -4.528757642e-02f }, + { -3.272217621e-02f, +4.723973932e-01f, +6.096756276e-01f, -4.531830590e-02f }, + { -3.268989170e-02f, +4.720481998e-01f, +6.100222401e-01f, -4.534902111e-02f }, + { -3.265761219e-02f, +4.716990342e-01f, +6.103688104e-01f, -4.537972200e-02f }, + { -3.262533772e-02f, +4.713498966e-01f, +6.107153384e-01f, -4.541040851e-02f }, + { -3.259306833e-02f, +4.710007872e-01f, +6.110618238e-01f, -4.544108058e-02f }, + { -3.256080405e-02f, +4.706517061e-01f, +6.114082665e-01f, -4.547173816e-02f }, + { -3.252854493e-02f, +4.703026534e-01f, +6.117546663e-01f, -4.550238117e-02f }, + { -3.249629100e-02f, +4.699536294e-01f, +6.121010230e-01f, -4.553300957e-02f }, + { -3.246404230e-02f, +4.696046343e-01f, +6.124473364e-01f, -4.556362330e-02f }, + { -3.243179888e-02f, +4.692556681e-01f, +6.127936063e-01f, -4.559422228e-02f }, + { -3.239956076e-02f, +4.689067311e-01f, +6.131398326e-01f, -4.562480648e-02f }, + { -3.236732799e-02f, +4.685578234e-01f, +6.134860150e-01f, -4.565537582e-02f }, + { -3.233510060e-02f, +4.682089452e-01f, +6.138321534e-01f, -4.568593024e-02f }, + { -3.230287864e-02f, +4.678600966e-01f, +6.141782476e-01f, -4.571646969e-02f }, + { -3.227066214e-02f, +4.675112778e-01f, +6.145242974e-01f, -4.574699411e-02f }, + { -3.223845114e-02f, +4.671624891e-01f, +6.148703026e-01f, -4.577750344e-02f }, + { -3.220624568e-02f, +4.668137304e-01f, +6.152162631e-01f, -4.580799762e-02f }, + { -3.217404580e-02f, +4.664650021e-01f, +6.155621786e-01f, -4.583847658e-02f }, + { -3.214185153e-02f, +4.661163043e-01f, +6.159080490e-01f, -4.586894027e-02f }, + { -3.210966291e-02f, +4.657676371e-01f, +6.162538740e-01f, -4.589938863e-02f }, + { -3.207747998e-02f, +4.654190007e-01f, +6.165996536e-01f, -4.592982160e-02f }, + { -3.204530278e-02f, +4.650703953e-01f, +6.169453874e-01f, -4.596023912e-02f }, + { -3.201313134e-02f, +4.647218210e-01f, +6.172910754e-01f, -4.599064113e-02f }, + { -3.198096571e-02f, +4.643732781e-01f, +6.176367173e-01f, -4.602102757e-02f }, + { -3.194880592e-02f, +4.640247666e-01f, +6.179823129e-01f, -4.605139837e-02f }, + { -3.191665200e-02f, +4.636762867e-01f, +6.183278621e-01f, -4.608175349e-02f }, + { -3.188450401e-02f, +4.633278387e-01f, +6.186733647e-01f, -4.611209285e-02f }, + { -3.185236196e-02f, +4.629794226e-01f, +6.190188205e-01f, -4.614241641e-02f }, + { -3.182022591e-02f, +4.626310387e-01f, +6.193642293e-01f, -4.617272409e-02f }, + { -3.178809589e-02f, +4.622826870e-01f, +6.197095909e-01f, -4.620301584e-02f }, + { -3.175597193e-02f, +4.619343678e-01f, +6.200549052e-01f, -4.623329159e-02f }, + { -3.172385407e-02f, +4.615860812e-01f, +6.204001719e-01f, -4.626355130e-02f }, + { -3.169174236e-02f, +4.612378274e-01f, +6.207453909e-01f, -4.629379489e-02f }, + { -3.165963682e-02f, +4.608896066e-01f, +6.210905619e-01f, -4.632402231e-02f }, + { -3.162753750e-02f, +4.605414189e-01f, +6.214356849e-01f, -4.635423350e-02f }, + { -3.159544443e-02f, +4.601932645e-01f, +6.217807595e-01f, -4.638442839e-02f }, + { -3.156335765e-02f, +4.598451435e-01f, +6.221257857e-01f, -4.641460692e-02f }, + { -3.153127720e-02f, +4.594970561e-01f, +6.224707632e-01f, -4.644476904e-02f }, + { -3.149920310e-02f, +4.591490025e-01f, +6.228156918e-01f, -4.647491468e-02f }, + { -3.146713541e-02f, +4.588009829e-01f, +6.231605715e-01f, -4.650504379e-02f }, + { -3.143507415e-02f, +4.584529973e-01f, +6.235054019e-01f, -4.653515630e-02f }, + { -3.140301937e-02f, +4.581050460e-01f, +6.238501829e-01f, -4.656525215e-02f }, + { -3.137097110e-02f, +4.577571292e-01f, +6.241949143e-01f, -4.659533127e-02f }, + { -3.133892937e-02f, +4.574092469e-01f, +6.245395959e-01f, -4.662539362e-02f }, + { -3.130689423e-02f, +4.570613994e-01f, +6.248842275e-01f, -4.665543913e-02f }, + { -3.127486571e-02f, +4.567135869e-01f, +6.252288091e-01f, -4.668546773e-02f }, + { -3.124284384e-02f, +4.563658094e-01f, +6.255733402e-01f, -4.671547937e-02f }, + { -3.121082867e-02f, +4.560180671e-01f, +6.259178209e-01f, -4.674547399e-02f }, + { -3.117882023e-02f, +4.556703603e-01f, +6.262622508e-01f, -4.677545152e-02f }, + { -3.114681855e-02f, +4.553226890e-01f, +6.266066299e-01f, -4.680541190e-02f }, + { -3.111482367e-02f, +4.549750535e-01f, +6.269509578e-01f, -4.683535507e-02f }, + { -3.108283564e-02f, +4.546274539e-01f, +6.272952345e-01f, -4.686528098e-02f }, + { -3.105085447e-02f, +4.542798904e-01f, +6.276394598e-01f, -4.689518955e-02f }, + { -3.101888022e-02f, +4.539323631e-01f, +6.279836334e-01f, -4.692508073e-02f }, + { -3.098691291e-02f, +4.535848721e-01f, +6.283277552e-01f, -4.695495446e-02f }, + { -3.095495259e-02f, +4.532374178e-01f, +6.286718249e-01f, -4.698481067e-02f }, + { -3.092299929e-02f, +4.528900001e-01f, +6.290158425e-01f, -4.701464930e-02f }, + { -3.089105304e-02f, +4.525426193e-01f, +6.293598077e-01f, -4.704447029e-02f }, + { -3.085911388e-02f, +4.521952756e-01f, +6.297037204e-01f, -4.707427359e-02f }, + { -3.082718185e-02f, +4.518479691e-01f, +6.300475802e-01f, -4.710405912e-02f }, + { -3.079525698e-02f, +4.515006999e-01f, +6.303913872e-01f, -4.713382682e-02f }, + { -3.076333930e-02f, +4.511534683e-01f, +6.307351410e-01f, -4.716357665e-02f }, + { -3.073142887e-02f, +4.508062744e-01f, +6.310788415e-01f, -4.719330852e-02f }, + { -3.069952570e-02f, +4.504591183e-01f, +6.314224885e-01f, -4.722302238e-02f }, + { -3.066762983e-02f, +4.501120002e-01f, +6.317660818e-01f, -4.725271818e-02f }, + { -3.063574131e-02f, +4.497649203e-01f, +6.321096212e-01f, -4.728239584e-02f }, + { -3.060386016e-02f, +4.494178788e-01f, +6.324531066e-01f, -4.731205530e-02f }, + { -3.057198642e-02f, +4.490708757e-01f, +6.327965377e-01f, -4.734169651e-02f }, + { -3.054012013e-02f, +4.487239113e-01f, +6.331399144e-01f, -4.737131940e-02f }, + { -3.050826133e-02f, +4.483769858e-01f, +6.334832365e-01f, -4.740092391e-02f }, + { -3.047641003e-02f, +4.480300992e-01f, +6.338265038e-01f, -4.743050997e-02f }, + { -3.044456630e-02f, +4.476832518e-01f, +6.341697161e-01f, -4.746007752e-02f }, + { -3.041273015e-02f, +4.473364437e-01f, +6.345128733e-01f, -4.748962651e-02f }, + { -3.038090162e-02f, +4.469896750e-01f, +6.348559750e-01f, -4.751915687e-02f }, + { -3.034908075e-02f, +4.466429460e-01f, +6.351990212e-01f, -4.754866853e-02f }, + { -3.031726757e-02f, +4.462962568e-01f, +6.355420117e-01f, -4.757816144e-02f }, + { -3.028546212e-02f, +4.459496076e-01f, +6.358849463e-01f, -4.760763553e-02f }, + { -3.025366443e-02f, +4.456029984e-01f, +6.362278248e-01f, -4.763709074e-02f }, + { -3.022187454e-02f, +4.452564296e-01f, +6.365706469e-01f, -4.766652701e-02f }, + { -3.019009249e-02f, +4.449099012e-01f, +6.369134126e-01f, -4.769594427e-02f }, + { -3.015831830e-02f, +4.445634133e-01f, +6.372561217e-01f, -4.772534246e-02f }, + { -3.012655201e-02f, +4.442169663e-01f, +6.375987738e-01f, -4.775472152e-02f }, + { -3.009479366e-02f, +4.438705601e-01f, +6.379413690e-01f, -4.778408139e-02f }, + { -3.006304328e-02f, +4.435241951e-01f, +6.382839069e-01f, -4.781342200e-02f }, + { -3.003130090e-02f, +4.431778713e-01f, +6.386263874e-01f, -4.784274329e-02f }, + { -2.999956656e-02f, +4.428315888e-01f, +6.389688103e-01f, -4.787204520e-02f }, + { -2.996784030e-02f, +4.424853480e-01f, +6.393111754e-01f, -4.790132766e-02f }, + { -2.993612215e-02f, +4.421391489e-01f, +6.396534826e-01f, -4.793059062e-02f }, + { -2.990441214e-02f, +4.417929916e-01f, +6.399957316e-01f, -4.795983400e-02f }, + { -2.987271031e-02f, +4.414468764e-01f, +6.403379223e-01f, -4.798905775e-02f }, + { -2.984101669e-02f, +4.411008034e-01f, +6.406800544e-01f, -4.801826180e-02f }, + { -2.980933131e-02f, +4.407547728e-01f, +6.410221278e-01f, -4.804744609e-02f }, + { -2.977765422e-02f, +4.404087847e-01f, +6.413641423e-01f, -4.807661056e-02f }, + { -2.974598544e-02f, +4.400628392e-01f, +6.417060978e-01f, -4.810575513e-02f }, + { -2.971432501e-02f, +4.397169367e-01f, +6.420479939e-01f, -4.813487976e-02f }, + { -2.968267296e-02f, +4.393710771e-01f, +6.423898306e-01f, -4.816398438e-02f }, + { -2.965102932e-02f, +4.390252607e-01f, +6.427316077e-01f, -4.819306891e-02f }, + { -2.961939414e-02f, +4.386794876e-01f, +6.430733249e-01f, -4.822213331e-02f }, + { -2.958776743e-02f, +4.383337580e-01f, +6.434149821e-01f, -4.825117750e-02f }, + { -2.955614925e-02f, +4.379880720e-01f, +6.437565791e-01f, -4.828020142e-02f }, + { -2.952453962e-02f, +4.376424298e-01f, +6.440981157e-01f, -4.830920501e-02f }, + { -2.949293857e-02f, +4.372968316e-01f, +6.444395917e-01f, -4.833818821e-02f }, + { -2.946134614e-02f, +4.369512775e-01f, +6.447810070e-01f, -4.836715094e-02f }, + { -2.942976236e-02f, +4.366057677e-01f, +6.451223613e-01f, -4.839609316e-02f }, + { -2.939818727e-02f, +4.362603023e-01f, +6.454636545e-01f, -4.842501479e-02f }, + { -2.936662089e-02f, +4.359148815e-01f, +6.458048863e-01f, -4.845391577e-02f }, + { -2.933506327e-02f, +4.355695055e-01f, +6.461460567e-01f, -4.848279603e-02f }, + { -2.930351443e-02f, +4.352241743e-01f, +6.464871653e-01f, -4.851165552e-02f }, + { -2.927197441e-02f, +4.348788883e-01f, +6.468282121e-01f, -4.854049416e-02f }, + { -2.924044325e-02f, +4.345336475e-01f, +6.471691968e-01f, -4.856931190e-02f }, + { -2.920892096e-02f, +4.341884520e-01f, +6.475101192e-01f, -4.859810867e-02f }, + { -2.917740760e-02f, +4.338433021e-01f, +6.478509792e-01f, -4.862688440e-02f }, + { -2.914590319e-02f, +4.334981980e-01f, +6.481917765e-01f, -4.865563904e-02f }, + { -2.911440776e-02f, +4.331531396e-01f, +6.485325111e-01f, -4.868437251e-02f }, + { -2.908292135e-02f, +4.328081273e-01f, +6.488731826e-01f, -4.871308476e-02f }, + { -2.905144399e-02f, +4.324631612e-01f, +6.492137910e-01f, -4.874177572e-02f }, + { -2.901997572e-02f, +4.321182414e-01f, +6.495543359e-01f, -4.877044532e-02f }, + { -2.898851656e-02f, +4.317733681e-01f, +6.498948173e-01f, -4.879909350e-02f }, + { -2.895706654e-02f, +4.314285415e-01f, +6.502352350e-01f, -4.882772020e-02f }, + { -2.892562571e-02f, +4.310837617e-01f, +6.505755887e-01f, -4.885632535e-02f }, + { -2.889419410e-02f, +4.307390288e-01f, +6.509158783e-01f, -4.888490889e-02f }, + { -2.886277173e-02f, +4.303943430e-01f, +6.512561036e-01f, -4.891347075e-02f }, + { -2.883135864e-02f, +4.300497046e-01f, +6.515962644e-01f, -4.894201087e-02f }, + { -2.879995486e-02f, +4.297051136e-01f, +6.519363605e-01f, -4.897052918e-02f }, + { -2.876856043e-02f, +4.293605701e-01f, +6.522763918e-01f, -4.899902562e-02f }, + { -2.873717537e-02f, +4.290160745e-01f, +6.526163580e-01f, -4.902750012e-02f }, + { -2.870579972e-02f, +4.286716267e-01f, +6.529562589e-01f, -4.905595262e-02f }, + { -2.867443352e-02f, +4.283272270e-01f, +6.532960945e-01f, -4.908438306e-02f }, + { -2.864307678e-02f, +4.279828756e-01f, +6.536358644e-01f, -4.911279137e-02f }, + { -2.861172956e-02f, +4.276385725e-01f, +6.539755685e-01f, -4.914117748e-02f }, + { -2.858039187e-02f, +4.272943179e-01f, +6.543152066e-01f, -4.916954133e-02f }, + { -2.854906375e-02f, +4.269501121e-01f, +6.546547786e-01f, -4.919788286e-02f }, + { -2.851774523e-02f, +4.266059551e-01f, +6.549942842e-01f, -4.922620200e-02f }, + { -2.848643635e-02f, +4.262618471e-01f, +6.553337232e-01f, -4.925449868e-02f }, + { -2.845513713e-02f, +4.259177883e-01f, +6.556730955e-01f, -4.928277284e-02f }, + { -2.842384761e-02f, +4.255737788e-01f, +6.560124009e-01f, -4.931102441e-02f }, + { -2.839256782e-02f, +4.252298187e-01f, +6.563516392e-01f, -4.933925334e-02f }, + { -2.836129779e-02f, +4.248859083e-01f, +6.566908102e-01f, -4.936745955e-02f }, + { -2.833003756e-02f, +4.245420477e-01f, +6.570299137e-01f, -4.939564297e-02f }, + { -2.829878715e-02f, +4.241982371e-01f, +6.573689495e-01f, -4.942380356e-02f }, + { -2.826754660e-02f, +4.238544765e-01f, +6.577079175e-01f, -4.945194122e-02f }, + { -2.823631593e-02f, +4.235107662e-01f, +6.580468175e-01f, -4.948005591e-02f }, + { -2.820509519e-02f, +4.231671063e-01f, +6.583856492e-01f, -4.950814756e-02f }, + { -2.817388439e-02f, +4.228234970e-01f, +6.587244125e-01f, -4.953621610e-02f }, + { -2.814268358e-02f, +4.224799384e-01f, +6.590631072e-01f, -4.956426147e-02f }, + { -2.811149279e-02f, +4.221364307e-01f, +6.594017331e-01f, -4.959228359e-02f }, + { -2.808031203e-02f, +4.217929740e-01f, +6.597402901e-01f, -4.962028241e-02f }, + { -2.804914136e-02f, +4.214495685e-01f, +6.600787779e-01f, -4.964825786e-02f }, + { -2.801798079e-02f, +4.211062143e-01f, +6.604171963e-01f, -4.967620987e-02f }, + { -2.798683036e-02f, +4.207629117e-01f, +6.607555453e-01f, -4.970413838e-02f }, + { -2.795569010e-02f, +4.204196607e-01f, +6.610938245e-01f, -4.973204333e-02f }, + { -2.792456005e-02f, +4.200764615e-01f, +6.614320337e-01f, -4.975992463e-02f }, + { -2.789344022e-02f, +4.197333143e-01f, +6.617701729e-01f, -4.978778224e-02f }, + { -2.786233066e-02f, +4.193902192e-01f, +6.621082419e-01f, -4.981561608e-02f }, + { -2.783123139e-02f, +4.190471763e-01f, +6.624462403e-01f, -4.984342609e-02f }, + { -2.780014245e-02f, +4.187041859e-01f, +6.627841681e-01f, -4.987121220e-02f }, + { -2.776906386e-02f, +4.183612481e-01f, +6.631220251e-01f, -4.989897435e-02f }, + { -2.773799566e-02f, +4.180183630e-01f, +6.634598110e-01f, -4.992671247e-02f }, + { -2.770693788e-02f, +4.176755308e-01f, +6.637975258e-01f, -4.995442649e-02f }, + { -2.767589054e-02f, +4.173327517e-01f, +6.641351691e-01f, -4.998211634e-02f }, + { -2.764485368e-02f, +4.169900257e-01f, +6.644727409e-01f, -5.000978197e-02f }, + { -2.761382734e-02f, +4.166473531e-01f, +6.648102408e-01f, -5.003742330e-02f }, + { -2.758281153e-02f, +4.163047340e-01f, +6.651476689e-01f, -5.006504027e-02f }, + { -2.755180629e-02f, +4.159621686e-01f, +6.654850247e-01f, -5.009263282e-02f }, + { -2.752081165e-02f, +4.156196570e-01f, +6.658223083e-01f, -5.012020087e-02f }, + { -2.748982764e-02f, +4.152771994e-01f, +6.661595193e-01f, -5.014774435e-02f }, + { -2.745885430e-02f, +4.149347959e-01f, +6.664966577e-01f, -5.017526321e-02f }, + { -2.742789164e-02f, +4.145924466e-01f, +6.668337231e-01f, -5.020275738e-02f }, + { -2.739693971e-02f, +4.142501518e-01f, +6.671707155e-01f, -5.023022678e-02f }, + { -2.736599852e-02f, +4.139079116e-01f, +6.675076346e-01f, -5.025767136e-02f }, + { -2.733506812e-02f, +4.135657261e-01f, +6.678444802e-01f, -5.028509105e-02f }, + { -2.730414853e-02f, +4.132235955e-01f, +6.681812522e-01f, -5.031248577e-02f }, + { -2.727323979e-02f, +4.128815199e-01f, +6.685179504e-01f, -5.033985546e-02f }, + { -2.724234191e-02f, +4.125394995e-01f, +6.688545746e-01f, -5.036720007e-02f }, + { -2.721145493e-02f, +4.121975345e-01f, +6.691911246e-01f, -5.039451951e-02f }, + { -2.718057889e-02f, +4.118556250e-01f, +6.695276002e-01f, -5.042181372e-02f }, + { -2.714971381e-02f, +4.115137711e-01f, +6.698640012e-01f, -5.044908263e-02f }, + { -2.711885972e-02f, +4.111719731e-01f, +6.702003275e-01f, -5.047632619e-02f }, + { -2.708801665e-02f, +4.108302310e-01f, +6.705365788e-01f, -5.050354431e-02f }, + { -2.705718463e-02f, +4.104885450e-01f, +6.708727551e-01f, -5.053073694e-02f }, + { -2.702636369e-02f, +4.101469153e-01f, +6.712088560e-01f, -5.055790401e-02f }, + { -2.699555385e-02f, +4.098053420e-01f, +6.715448814e-01f, -5.058504544e-02f }, + { -2.696475516e-02f, +4.094638252e-01f, +6.718808311e-01f, -5.061216118e-02f }, + { -2.693396764e-02f, +4.091223652e-01f, +6.722167049e-01f, -5.063925115e-02f }, + { -2.690319131e-02f, +4.087809621e-01f, +6.725525027e-01f, -5.066631529e-02f }, + { -2.687242621e-02f, +4.084396159e-01f, +6.728882242e-01f, -5.069335353e-02f }, + { -2.684167237e-02f, +4.080983270e-01f, +6.732238693e-01f, -5.072036581e-02f }, + { -2.681092981e-02f, +4.077570954e-01f, +6.735594378e-01f, -5.074735205e-02f }, + { -2.678019856e-02f, +4.074159212e-01f, +6.738949295e-01f, -5.077431218e-02f }, + { -2.674947866e-02f, +4.070748047e-01f, +6.742303442e-01f, -5.080124615e-02f }, + { -2.671877013e-02f, +4.067337460e-01f, +6.745656817e-01f, -5.082815388e-02f }, + { -2.668807301e-02f, +4.063927452e-01f, +6.749009418e-01f, -5.085503531e-02f }, + { -2.665738731e-02f, +4.060518025e-01f, +6.752361244e-01f, -5.088189036e-02f }, + { -2.662671308e-02f, +4.057109180e-01f, +6.755712292e-01f, -5.090871897e-02f }, + { -2.659605033e-02f, +4.053700919e-01f, +6.759062562e-01f, -5.093552108e-02f }, + { -2.656539910e-02f, +4.050293243e-01f, +6.762412050e-01f, -5.096229661e-02f }, + { -2.653475941e-02f, +4.046886155e-01f, +6.765760755e-01f, -5.098904550e-02f }, + { -2.650413130e-02f, +4.043479654e-01f, +6.769108675e-01f, -5.101576767e-02f }, + { -2.647351480e-02f, +4.040073744e-01f, +6.772455809e-01f, -5.104246307e-02f }, + { -2.644290992e-02f, +4.036668425e-01f, +6.775802154e-01f, -5.106913162e-02f }, + { -2.641231671e-02f, +4.033263699e-01f, +6.779147709e-01f, -5.109577326e-02f }, + { -2.638173519e-02f, +4.029859567e-01f, +6.782492471e-01f, -5.112238791e-02f }, + { -2.635116538e-02f, +4.026456031e-01f, +6.785836440e-01f, -5.114897551e-02f }, + { -2.632060732e-02f, +4.023053093e-01f, +6.789179612e-01f, -5.117553600e-02f }, + { -2.629006103e-02f, +4.019650754e-01f, +6.792521986e-01f, -5.120206929e-02f }, + { -2.625952655e-02f, +4.016249015e-01f, +6.795863561e-01f, -5.122857533e-02f }, + { -2.622900390e-02f, +4.012847878e-01f, +6.799204334e-01f, -5.125505405e-02f }, + { -2.619849310e-02f, +4.009447344e-01f, +6.802544304e-01f, -5.128150537e-02f }, + { -2.616799420e-02f, +4.006047415e-01f, +6.805883468e-01f, -5.130792924e-02f }, + { -2.613750720e-02f, +4.002648093e-01f, +6.809221825e-01f, -5.133432558e-02f }, + { -2.610703216e-02f, +3.999249379e-01f, +6.812559373e-01f, -5.136069431e-02f }, + { -2.607656908e-02f, +3.995851274e-01f, +6.815896110e-01f, -5.138703539e-02f }, + { -2.604611800e-02f, +3.992453779e-01f, +6.819232035e-01f, -5.141334873e-02f }, + { -2.601567895e-02f, +3.989056898e-01f, +6.822567144e-01f, -5.143963427e-02f }, + { -2.598525196e-02f, +3.985660630e-01f, +6.825901438e-01f, -5.146589193e-02f }, + { -2.595483705e-02f, +3.982264977e-01f, +6.829234913e-01f, -5.149212166e-02f }, + { -2.592443425e-02f, +3.978869942e-01f, +6.832567567e-01f, -5.151832338e-02f }, + { -2.589404358e-02f, +3.975475525e-01f, +6.835899400e-01f, -5.154449702e-02f }, + { -2.586366508e-02f, +3.972081727e-01f, +6.839230409e-01f, -5.157064252e-02f }, + { -2.583329878e-02f, +3.968688551e-01f, +6.842560591e-01f, -5.159675980e-02f }, + { -2.580294470e-02f, +3.965295998e-01f, +6.845889947e-01f, -5.162284880e-02f }, + { -2.577260287e-02f, +3.961904069e-01f, +6.849218472e-01f, -5.164890945e-02f }, + { -2.574227331e-02f, +3.958512766e-01f, +6.852546167e-01f, -5.167494167e-02f }, + { -2.571195605e-02f, +3.955122090e-01f, +6.855873028e-01f, -5.170094541e-02f }, + { -2.568165113e-02f, +3.951732042e-01f, +6.859199054e-01f, -5.172692059e-02f }, + { -2.565135856e-02f, +3.948342626e-01f, +6.862524243e-01f, -5.175286714e-02f }, + { -2.562107838e-02f, +3.944953840e-01f, +6.865848593e-01f, -5.177878499e-02f }, + { -2.559081062e-02f, +3.941565688e-01f, +6.869172102e-01f, -5.180467408e-02f }, + { -2.556055529e-02f, +3.938178171e-01f, +6.872494769e-01f, -5.183053433e-02f }, + { -2.553031243e-02f, +3.934791290e-01f, +6.875816592e-01f, -5.185636568e-02f }, + { -2.550008206e-02f, +3.931405046e-01f, +6.879137568e-01f, -5.188216805e-02f }, + { -2.546986421e-02f, +3.928019442e-01f, +6.882457697e-01f, -5.190794138e-02f }, + { -2.543965891e-02f, +3.924634478e-01f, +6.885776975e-01f, -5.193368560e-02f }, + { -2.540946619e-02f, +3.921250156e-01f, +6.889095401e-01f, -5.195940064e-02f }, + { -2.537928607e-02f, +3.917866477e-01f, +6.892412974e-01f, -5.198508643e-02f }, + { -2.534911857e-02f, +3.914483444e-01f, +6.895729691e-01f, -5.201074290e-02f }, + { -2.531896373e-02f, +3.911101057e-01f, +6.899045550e-01f, -5.203636997e-02f }, + { -2.528882157e-02f, +3.907719318e-01f, +6.902360551e-01f, -5.206196759e-02f }, + { -2.525869212e-02f, +3.904338229e-01f, +6.905674690e-01f, -5.208753568e-02f }, + { -2.522857541e-02f, +3.900957790e-01f, +6.908987966e-01f, -5.211307417e-02f }, + { -2.519847146e-02f, +3.897578004e-01f, +6.912300378e-01f, -5.213858300e-02f }, + { -2.516838029e-02f, +3.894198871e-01f, +6.915611922e-01f, -5.216406208e-02f }, + { -2.513830194e-02f, +3.890820394e-01f, +6.918922599e-01f, -5.218951136e-02f }, + { -2.510823643e-02f, +3.887442574e-01f, +6.922232404e-01f, -5.221493076e-02f }, + { -2.507818379e-02f, +3.884065411e-01f, +6.925541338e-01f, -5.224032022e-02f }, + { -2.504814403e-02f, +3.880688909e-01f, +6.928849397e-01f, -5.226567965e-02f }, + { -2.501811720e-02f, +3.877313067e-01f, +6.932156580e-01f, -5.229100900e-02f }, + { -2.498810332e-02f, +3.873937888e-01f, +6.935462886e-01f, -5.231630820e-02f }, + { -2.495810241e-02f, +3.870563373e-01f, +6.938768311e-01f, -5.234157717e-02f }, + { -2.492811449e-02f, +3.867189524e-01f, +6.942072855e-01f, -5.236681584e-02f }, + { -2.489813960e-02f, +3.863816342e-01f, +6.945376516e-01f, -5.239202415e-02f }, + { -2.486817776e-02f, +3.860443828e-01f, +6.948679292e-01f, -5.241720201e-02f }, + { -2.483822900e-02f, +3.857071983e-01f, +6.951981180e-01f, -5.244234938e-02f }, + { -2.480829333e-02f, +3.853700811e-01f, +6.955282179e-01f, -5.246746616e-02f }, + { -2.477837080e-02f, +3.850330311e-01f, +6.958582288e-01f, -5.249255230e-02f }, + { -2.474846141e-02f, +3.846960485e-01f, +6.961881503e-01f, -5.251760772e-02f }, + { -2.471856521e-02f, +3.843591335e-01f, +6.965179824e-01f, -5.254263236e-02f }, + { -2.468868221e-02f, +3.840222862e-01f, +6.968477249e-01f, -5.256762613e-02f }, + { -2.465881245e-02f, +3.836855068e-01f, +6.971773775e-01f, -5.259258898e-02f }, + { -2.462895594e-02f, +3.833487953e-01f, +6.975069402e-01f, -5.261752083e-02f }, + { -2.459911271e-02f, +3.830121520e-01f, +6.978364126e-01f, -5.264242161e-02f }, + { -2.456928278e-02f, +3.826755771e-01f, +6.981657947e-01f, -5.266729126e-02f }, + { -2.453946619e-02f, +3.823390705e-01f, +6.984950861e-01f, -5.269212969e-02f }, + { -2.450966296e-02f, +3.820026325e-01f, +6.988242869e-01f, -5.271693684e-02f }, + { -2.447987311e-02f, +3.816662633e-01f, +6.991533966e-01f, -5.274171264e-02f }, + { -2.445009667e-02f, +3.813299629e-01f, +6.994824153e-01f, -5.276645702e-02f }, + { -2.442033366e-02f, +3.809937316e-01f, +6.998113426e-01f, -5.279116991e-02f }, + { -2.439058412e-02f, +3.806575694e-01f, +7.001401785e-01f, -5.281585123e-02f }, + { -2.436084805e-02f, +3.803214765e-01f, +7.004689226e-01f, -5.284050092e-02f }, + { -2.433112550e-02f, +3.799854530e-01f, +7.007975749e-01f, -5.286511890e-02f }, + { -2.430141648e-02f, +3.796494992e-01f, +7.011261352e-01f, -5.288970511e-02f }, + { -2.427172102e-02f, +3.793136151e-01f, +7.014546032e-01f, -5.291425948e-02f }, + { -2.424203914e-02f, +3.789778008e-01f, +7.017829788e-01f, -5.293878193e-02f }, + { -2.421237087e-02f, +3.786420566e-01f, +7.021112617e-01f, -5.296327238e-02f }, + { -2.418271624e-02f, +3.783063825e-01f, +7.024394519e-01f, -5.298773078e-02f }, + { -2.415307527e-02f, +3.779707788e-01f, +7.027675491e-01f, -5.301215705e-02f }, + { -2.412344797e-02f, +3.776352455e-01f, +7.030955531e-01f, -5.303655112e-02f }, + { -2.409383439e-02f, +3.772997828e-01f, +7.034234638e-01f, -5.306091292e-02f }, + { -2.406423454e-02f, +3.769643909e-01f, +7.037512810e-01f, -5.308524237e-02f }, + { -2.403464845e-02f, +3.766290698e-01f, +7.040790044e-01f, -5.310953941e-02f }, + { -2.400507614e-02f, +3.762938197e-01f, +7.044066339e-01f, -5.313380397e-02f }, + { -2.397551763e-02f, +3.759586408e-01f, +7.047341694e-01f, -5.315803596e-02f }, + { -2.394597296e-02f, +3.756235333e-01f, +7.050616105e-01f, -5.318223533e-02f }, + { -2.391644214e-02f, +3.752884971e-01f, +7.053889572e-01f, -5.320640200e-02f }, + { -2.388692520e-02f, +3.749535326e-01f, +7.057162093e-01f, -5.323053590e-02f }, + { -2.385742216e-02f, +3.746186398e-01f, +7.060433665e-01f, -5.325463695e-02f }, + { -2.382793305e-02f, +3.742838189e-01f, +7.063704287e-01f, -5.327870509e-02f }, + { -2.379845790e-02f, +3.739490700e-01f, +7.066973957e-01f, -5.330274025e-02f }, + { -2.376899672e-02f, +3.736143933e-01f, +7.070242673e-01f, -5.332674235e-02f }, + { -2.373954954e-02f, +3.732797888e-01f, +7.073510434e-01f, -5.335071132e-02f }, + { -2.371011639e-02f, +3.729452569e-01f, +7.076777237e-01f, -5.337464709e-02f }, + { -2.368069728e-02f, +3.726107975e-01f, +7.080043080e-01f, -5.339854959e-02f }, + { -2.365129225e-02f, +3.722764108e-01f, +7.083307963e-01f, -5.342241875e-02f }, + { -2.362190131e-02f, +3.719420970e-01f, +7.086571882e-01f, -5.344625449e-02f }, + { -2.359252450e-02f, +3.716078562e-01f, +7.089834836e-01f, -5.347005675e-02f }, + { -2.356316182e-02f, +3.712736886e-01f, +7.093096823e-01f, -5.349382545e-02f }, + { -2.353381332e-02f, +3.709395943e-01f, +7.096357842e-01f, -5.351756051e-02f }, + { -2.350447901e-02f, +3.706055734e-01f, +7.099617891e-01f, -5.354126188e-02f }, + { -2.347515891e-02f, +3.702716261e-01f, +7.102876966e-01f, -5.356492947e-02f }, + { -2.344585305e-02f, +3.699377525e-01f, +7.106135068e-01f, -5.358856321e-02f }, + { -2.341656145e-02f, +3.696039527e-01f, +7.109392194e-01f, -5.361216304e-02f }, + { -2.338728414e-02f, +3.692702270e-01f, +7.112648342e-01f, -5.363572888e-02f }, + { -2.335802114e-02f, +3.689365754e-01f, +7.115903510e-01f, -5.365926065e-02f }, + { -2.332877247e-02f, +3.686029981e-01f, +7.119157697e-01f, -5.368275829e-02f }, + { -2.329953816e-02f, +3.682694952e-01f, +7.122410900e-01f, -5.370622173e-02f }, + { -2.327031823e-02f, +3.679360669e-01f, +7.125663118e-01f, -5.372965088e-02f }, + { -2.324111270e-02f, +3.676027132e-01f, +7.128914348e-01f, -5.375304569e-02f }, + { -2.321192159e-02f, +3.672694344e-01f, +7.132164590e-01f, -5.377640607e-02f }, + { -2.318274493e-02f, +3.669362306e-01f, +7.135413841e-01f, -5.379973196e-02f }, + { -2.315358275e-02f, +3.666031020e-01f, +7.138662100e-01f, -5.382302328e-02f }, + { -2.312443506e-02f, +3.662700485e-01f, +7.141909364e-01f, -5.384627996e-02f }, + { -2.309530189e-02f, +3.659370705e-01f, +7.145155631e-01f, -5.386950193e-02f }, + { -2.306618326e-02f, +3.656041680e-01f, +7.148400900e-01f, -5.389268911e-02f }, + { -2.303707919e-02f, +3.652713412e-01f, +7.151645170e-01f, -5.391584144e-02f }, + { -2.300798972e-02f, +3.649385903e-01f, +7.154888437e-01f, -5.393895884e-02f }, + { -2.297891485e-02f, +3.646059152e-01f, +7.158130701e-01f, -5.396204124e-02f }, + { -2.294985461e-02f, +3.642733163e-01f, +7.161371959e-01f, -5.398508856e-02f }, + { -2.292080903e-02f, +3.639407936e-01f, +7.164612210e-01f, -5.400810073e-02f }, + { -2.289177812e-02f, +3.636083473e-01f, +7.167851452e-01f, -5.403107768e-02f }, + { -2.286276192e-02f, +3.632759775e-01f, +7.171089682e-01f, -5.405401935e-02f }, + { -2.283376044e-02f, +3.629436844e-01f, +7.174326900e-01f, -5.407692564e-02f }, + { -2.280477371e-02f, +3.626114681e-01f, +7.177563103e-01f, -5.409979650e-02f }, + { -2.277580174e-02f, +3.622793287e-01f, +7.180798289e-01f, -5.412263185e-02f }, + { -2.274684456e-02f, +3.619472663e-01f, +7.184032457e-01f, -5.414543161e-02f }, + { -2.271790220e-02f, +3.616152812e-01f, +7.187265605e-01f, -5.416819572e-02f }, + { -2.268897467e-02f, +3.612833734e-01f, +7.190497730e-01f, -5.419092410e-02f }, + { -2.266006200e-02f, +3.609515431e-01f, +7.193728831e-01f, -5.421361667e-02f }, + { -2.263116421e-02f, +3.606197904e-01f, +7.196958907e-01f, -5.423627337e-02f }, + { -2.260228132e-02f, +3.602881155e-01f, +7.200187955e-01f, -5.425889412e-02f }, + { -2.257341336e-02f, +3.599565185e-01f, +7.203415974e-01f, -5.428147885e-02f }, + { -2.254456034e-02f, +3.596249995e-01f, +7.206642961e-01f, -5.430402749e-02f }, + { -2.251572229e-02f, +3.592935587e-01f, +7.209868915e-01f, -5.432653996e-02f }, + { -2.248689923e-02f, +3.589621962e-01f, +7.213093834e-01f, -5.434901618e-02f }, + { -2.245809118e-02f, +3.586309121e-01f, +7.216317716e-01f, -5.437145610e-02f }, + { -2.242929816e-02f, +3.582997067e-01f, +7.219540560e-01f, -5.439385962e-02f }, + { -2.240052021e-02f, +3.579685799e-01f, +7.222762363e-01f, -5.441622669e-02f }, + { -2.237175733e-02f, +3.576375321e-01f, +7.225983123e-01f, -5.443855722e-02f }, + { -2.234300954e-02f, +3.573065632e-01f, +7.229202840e-01f, -5.446085115e-02f }, + { -2.231427688e-02f, +3.569756734e-01f, +7.232421510e-01f, -5.448310839e-02f }, + { -2.228555936e-02f, +3.566448630e-01f, +7.235639133e-01f, -5.450532888e-02f }, + { -2.225685701e-02f, +3.563141319e-01f, +7.238855706e-01f, -5.452751254e-02f }, + { -2.222816984e-02f, +3.559834804e-01f, +7.242071227e-01f, -5.454965931e-02f }, + { -2.219949788e-02f, +3.556529085e-01f, +7.245285695e-01f, -5.457176909e-02f }, + { -2.217084115e-02f, +3.553224165e-01f, +7.248499108e-01f, -5.459384183e-02f }, + { -2.214219967e-02f, +3.549920045e-01f, +7.251711464e-01f, -5.461587745e-02f }, + { -2.211357346e-02f, +3.546616725e-01f, +7.254922761e-01f, -5.463787587e-02f }, + { -2.208496254e-02f, +3.543314207e-01f, +7.258132997e-01f, -5.465983703e-02f }, + { -2.205636694e-02f, +3.540012493e-01f, +7.261342170e-01f, -5.468176084e-02f }, + { -2.202778667e-02f, +3.536711584e-01f, +7.264550280e-01f, -5.470364724e-02f }, + { -2.199922176e-02f, +3.533411482e-01f, +7.267757323e-01f, -5.472549614e-02f }, + { -2.197067223e-02f, +3.530112187e-01f, +7.270963298e-01f, -5.474730748e-02f }, + { -2.194213809e-02f, +3.526813701e-01f, +7.274168203e-01f, -5.476908119e-02f }, + { -2.191361938e-02f, +3.523516026e-01f, +7.277372036e-01f, -5.479081718e-02f }, + { -2.188511610e-02f, +3.520219162e-01f, +7.280574796e-01f, -5.481251539e-02f }, + { -2.185662829e-02f, +3.516923111e-01f, +7.283776481e-01f, -5.483417574e-02f }, + { -2.182815596e-02f, +3.513627875e-01f, +7.286977088e-01f, -5.485579815e-02f }, + { -2.179969913e-02f, +3.510333455e-01f, +7.290176616e-01f, -5.487738256e-02f }, + { -2.177125783e-02f, +3.507039852e-01f, +7.293375064e-01f, -5.489892888e-02f }, + { -2.174283207e-02f, +3.503747067e-01f, +7.296572429e-01f, -5.492043705e-02f }, + { -2.171442188e-02f, +3.500455102e-01f, +7.299768709e-01f, -5.494190699e-02f }, + { -2.168602727e-02f, +3.497163959e-01f, +7.302963903e-01f, -5.496333863e-02f }, + { -2.165764827e-02f, +3.493873638e-01f, +7.306158008e-01f, -5.498473189e-02f }, + { -2.162928490e-02f, +3.490584141e-01f, +7.309351024e-01f, -5.500608670e-02f }, + { -2.160093718e-02f, +3.487295469e-01f, +7.312542948e-01f, -5.502740298e-02f }, + { -2.157260512e-02f, +3.484007623e-01f, +7.315733778e-01f, -5.504868065e-02f }, + { -2.154428875e-02f, +3.480720606e-01f, +7.318923513e-01f, -5.506991966e-02f }, + { -2.151598810e-02f, +3.477434418e-01f, +7.322112150e-01f, -5.509111991e-02f }, + { -2.148770317e-02f, +3.474149060e-01f, +7.325299688e-01f, -5.511228134e-02f }, + { -2.145943399e-02f, +3.470864534e-01f, +7.328486125e-01f, -5.513340388e-02f }, + { -2.143118058e-02f, +3.467580842e-01f, +7.331671459e-01f, -5.515448744e-02f }, + { -2.140294296e-02f, +3.464297984e-01f, +7.334855689e-01f, -5.517553195e-02f }, + { -2.137472115e-02f, +3.461015962e-01f, +7.338038812e-01f, -5.519653734e-02f }, + { -2.134651517e-02f, +3.457734778e-01f, +7.341220827e-01f, -5.521750353e-02f }, + { -2.131832504e-02f, +3.454454432e-01f, +7.344401732e-01f, -5.523843046e-02f }, + { -2.129015078e-02f, +3.451174926e-01f, +7.347581525e-01f, -5.525931803e-02f }, + { -2.126199241e-02f, +3.447896261e-01f, +7.350760204e-01f, -5.528016619e-02f }, + { -2.123384995e-02f, +3.444618439e-01f, +7.353937768e-01f, -5.530097485e-02f }, + { -2.120572342e-02f, +3.441341461e-01f, +7.357114214e-01f, -5.532174395e-02f }, + { -2.117761283e-02f, +3.438065327e-01f, +7.360289541e-01f, -5.534247339e-02f }, + { -2.114951822e-02f, +3.434790041e-01f, +7.363463747e-01f, -5.536316312e-02f }, + { -2.112143960e-02f, +3.431515602e-01f, +7.366636830e-01f, -5.538381306e-02f }, + { -2.109337699e-02f, +3.428242013e-01f, +7.369808788e-01f, -5.540442312e-02f }, + { -2.106533040e-02f, +3.424969274e-01f, +7.372979620e-01f, -5.542499324e-02f }, + { -2.103729986e-02f, +3.421697387e-01f, +7.376149323e-01f, -5.544552335e-02f }, + { -2.100928539e-02f, +3.418426354e-01f, +7.379317896e-01f, -5.546601336e-02f }, + { -2.098128700e-02f, +3.415156174e-01f, +7.382485338e-01f, -5.548646320e-02f }, + { -2.095330472e-02f, +3.411886851e-01f, +7.385651645e-01f, -5.550687279e-02f }, + { -2.092533857e-02f, +3.408618385e-01f, +7.388816817e-01f, -5.552724207e-02f }, + { -2.089738856e-02f, +3.405350777e-01f, +7.391980851e-01f, -5.554757095e-02f }, + { -2.086945472e-02f, +3.402084029e-01f, +7.395143746e-01f, -5.556785936e-02f }, + { -2.084153705e-02f, +3.398818142e-01f, +7.398305500e-01f, -5.558810723e-02f }, + { -2.081363559e-02f, +3.395553117e-01f, +7.401466111e-01f, -5.560831448e-02f }, + { -2.078575035e-02f, +3.392288956e-01f, +7.404625577e-01f, -5.562848104e-02f }, + { -2.075788136e-02f, +3.389025660e-01f, +7.407783897e-01f, -5.564860682e-02f }, + { -2.073002862e-02f, +3.385763231e-01f, +7.410941069e-01f, -5.566869176e-02f }, + { -2.070219216e-02f, +3.382501669e-01f, +7.414097090e-01f, -5.568873578e-02f }, + { -2.067437199e-02f, +3.379240976e-01f, +7.417251959e-01f, -5.570873880e-02f }, + { -2.064656814e-02f, +3.375981153e-01f, +7.420405674e-01f, -5.572870075e-02f }, + { -2.061878063e-02f, +3.372722202e-01f, +7.423558234e-01f, -5.574862155e-02f }, + { -2.059100947e-02f, +3.369464124e-01f, +7.426709636e-01f, -5.576850113e-02f }, + { -2.056325469e-02f, +3.366206920e-01f, +7.429859879e-01f, -5.578833941e-02f }, + { -2.053551629e-02f, +3.362950591e-01f, +7.433008961e-01f, -5.580813632e-02f }, + { -2.050779431e-02f, +3.359695139e-01f, +7.436156880e-01f, -5.582789178e-02f }, + { -2.048008875e-02f, +3.356440565e-01f, +7.439303635e-01f, -5.584760571e-02f }, + { -2.045239964e-02f, +3.353186871e-01f, +7.442449222e-01f, -5.586727805e-02f }, + { -2.042472700e-02f, +3.349934057e-01f, +7.445593642e-01f, -5.588690871e-02f }, + { -2.039707084e-02f, +3.346682125e-01f, +7.448736891e-01f, -5.590649761e-02f }, + { -2.036943118e-02f, +3.343431076e-01f, +7.451878969e-01f, -5.592604469e-02f }, + { -2.034180804e-02f, +3.340180912e-01f, +7.455019872e-01f, -5.594554986e-02f }, + { -2.031420145e-02f, +3.336931634e-01f, +7.458159600e-01f, -5.596501306e-02f }, + { -2.028661141e-02f, +3.333683243e-01f, +7.461298151e-01f, -5.598443420e-02f }, + { -2.025903794e-02f, +3.330435740e-01f, +7.464435522e-01f, -5.600381321e-02f }, + { -2.023148107e-02f, +3.327189127e-01f, +7.467571712e-01f, -5.602315001e-02f }, + { -2.020394081e-02f, +3.323943405e-01f, +7.470706720e-01f, -5.604244453e-02f }, + { -2.017641718e-02f, +3.320698576e-01f, +7.473840543e-01f, -5.606169669e-02f }, + { -2.014891020e-02f, +3.317454639e-01f, +7.476973179e-01f, -5.608090642e-02f }, + { -2.012141988e-02f, +3.314211598e-01f, +7.480104627e-01f, -5.610007364e-02f }, + { -2.009394625e-02f, +3.310969453e-01f, +7.483234885e-01f, -5.611919827e-02f }, + { -2.006648932e-02f, +3.307728205e-01f, +7.486363951e-01f, -5.613828023e-02f }, + { -2.003904911e-02f, +3.304487856e-01f, +7.489491824e-01f, -5.615731946e-02f }, + { -2.001162564e-02f, +3.301248407e-01f, +7.492618501e-01f, -5.617631587e-02f }, + { -1.998421892e-02f, +3.298009860e-01f, +7.495743981e-01f, -5.619526939e-02f }, + { -1.995682897e-02f, +3.294772215e-01f, +7.498868261e-01f, -5.621417995e-02f }, + { -1.992945582e-02f, +3.291535473e-01f, +7.501991341e-01f, -5.623304746e-02f }, + { -1.990209947e-02f, +3.288299637e-01f, +7.505113218e-01f, -5.625187185e-02f }, + { -1.987475995e-02f, +3.285064707e-01f, +7.508233890e-01f, -5.627065304e-02f }, + { -1.984743727e-02f, +3.281830685e-01f, +7.511353356e-01f, -5.628939096e-02f }, + { -1.982013145e-02f, +3.278597572e-01f, +7.514471614e-01f, -5.630808553e-02f }, + { -1.979284251e-02f, +3.275365369e-01f, +7.517588662e-01f, -5.632673668e-02f }, + { -1.976557047e-02f, +3.272134077e-01f, +7.520704498e-01f, -5.634534432e-02f }, + { -1.973831534e-02f, +3.268903698e-01f, +7.523819121e-01f, -5.636390839e-02f }, + { -1.971107714e-02f, +3.265674233e-01f, +7.526932528e-01f, -5.638242880e-02f }, + { -1.968385589e-02f, +3.262445684e-01f, +7.530044718e-01f, -5.640090548e-02f }, + { -1.965665160e-02f, +3.259218051e-01f, +7.533155690e-01f, -5.641933835e-02f }, + { -1.962946429e-02f, +3.255991335e-01f, +7.536265440e-01f, -5.643772734e-02f }, + { -1.960229398e-02f, +3.252765539e-01f, +7.539373968e-01f, -5.645607236e-02f }, + { -1.957514069e-02f, +3.249540663e-01f, +7.542481271e-01f, -5.647437335e-02f }, + { -1.954800443e-02f, +3.246316709e-01f, +7.545587349e-01f, -5.649263022e-02f }, + { -1.952088522e-02f, +3.243093678e-01f, +7.548692198e-01f, -5.651084290e-02f }, + { -1.949378307e-02f, +3.239871571e-01f, +7.551795818e-01f, -5.652901131e-02f }, + { -1.946669801e-02f, +3.236650389e-01f, +7.554898206e-01f, -5.654713538e-02f }, + { -1.943963005e-02f, +3.233430133e-01f, +7.557999361e-01f, -5.656521503e-02f }, + { -1.941257921e-02f, +3.230210806e-01f, +7.561099280e-01f, -5.658325018e-02f }, + { -1.938554550e-02f, +3.226992408e-01f, +7.564197963e-01f, -5.660124075e-02f }, + { -1.935852895e-02f, +3.223774940e-01f, +7.567295407e-01f, -5.661918667e-02f }, + { -1.933152956e-02f, +3.220558404e-01f, +7.570391610e-01f, -5.663708786e-02f }, + { -1.930454735e-02f, +3.217342801e-01f, +7.573486571e-01f, -5.665494425e-02f }, + { -1.927758234e-02f, +3.214128132e-01f, +7.576580288e-01f, -5.667275575e-02f }, + { -1.925063455e-02f, +3.210914398e-01f, +7.579672759e-01f, -5.669052229e-02f }, + { -1.922370400e-02f, +3.207701601e-01f, +7.582763982e-01f, -5.670824380e-02f }, + { -1.919679069e-02f, +3.204489742e-01f, +7.585853955e-01f, -5.672592019e-02f }, + { -1.916989465e-02f, +3.201278822e-01f, +7.588942678e-01f, -5.674355138e-02f }, + { -1.914301589e-02f, +3.198068842e-01f, +7.592030147e-01f, -5.676113731e-02f }, + { -1.911615443e-02f, +3.194859804e-01f, +7.595116361e-01f, -5.677867790e-02f }, + { -1.908931029e-02f, +3.191651709e-01f, +7.598201319e-01f, -5.679617306e-02f }, + { -1.906248348e-02f, +3.188444558e-01f, +7.601285018e-01f, -5.681362272e-02f }, + { -1.903567401e-02f, +3.185238353e-01f, +7.604367457e-01f, -5.683102681e-02f }, + { -1.900888191e-02f, +3.182033094e-01f, +7.607448634e-01f, -5.684838523e-02f }, + { -1.898210719e-02f, +3.178828783e-01f, +7.610528546e-01f, -5.686569793e-02f }, + { -1.895534986e-02f, +3.175625421e-01f, +7.613607194e-01f, -5.688296482e-02f }, + { -1.892860994e-02f, +3.172423009e-01f, +7.616684574e-01f, -5.690018582e-02f }, + { -1.890188745e-02f, +3.169221549e-01f, +7.619760684e-01f, -5.691736086e-02f }, + { -1.887518241e-02f, +3.166021042e-01f, +7.622835524e-01f, -5.693448985e-02f }, + { -1.884849482e-02f, +3.162821488e-01f, +7.625909090e-01f, -5.695157273e-02f }, + { -1.882182471e-02f, +3.159622890e-01f, +7.628981382e-01f, -5.696860941e-02f }, + { -1.879517209e-02f, +3.156425249e-01f, +7.632052398e-01f, -5.698559981e-02f }, + { -1.876853697e-02f, +3.153228565e-01f, +7.635122136e-01f, -5.700254386e-02f }, + { -1.874191938e-02f, +3.150032840e-01f, +7.638190593e-01f, -5.701944149e-02f }, + { -1.871531932e-02f, +3.146838075e-01f, +7.641257769e-01f, -5.703629260e-02f }, + { -1.868873682e-02f, +3.143644272e-01f, +7.644323662e-01f, -5.705309714e-02f }, + { -1.866217188e-02f, +3.140451431e-01f, +7.647388269e-01f, -5.706985501e-02f }, + { -1.863562453e-02f, +3.137259554e-01f, +7.650451589e-01f, -5.708656614e-02f }, + { -1.860909478e-02f, +3.134068642e-01f, +7.653513620e-01f, -5.710323045e-02f }, + { -1.858258264e-02f, +3.130878696e-01f, +7.656574360e-01f, -5.711984787e-02f }, + { -1.855608813e-02f, +3.127689718e-01f, +7.659633808e-01f, -5.713641831e-02f }, + { -1.852961127e-02f, +3.124501709e-01f, +7.662691962e-01f, -5.715294170e-02f }, + { -1.850315207e-02f, +3.121314670e-01f, +7.665748819e-01f, -5.716941797e-02f }, + { -1.847671054e-02f, +3.118128601e-01f, +7.668804379e-01f, -5.718584702e-02f }, + { -1.845028671e-02f, +3.114943506e-01f, +7.671858639e-01f, -5.720222880e-02f }, + { -1.842388058e-02f, +3.111759383e-01f, +7.674911598e-01f, -5.721856321e-02f }, + { -1.839749217e-02f, +3.108576236e-01f, +7.677963254e-01f, -5.723485017e-02f }, + { -1.837112149e-02f, +3.105394064e-01f, +7.681013605e-01f, -5.725108962e-02f }, + { -1.834476857e-02f, +3.102212870e-01f, +7.684062649e-01f, -5.726728148e-02f }, + { -1.831843341e-02f, +3.099032654e-01f, +7.687110385e-01f, -5.728342566e-02f }, + { -1.829211604e-02f, +3.095853418e-01f, +7.690156811e-01f, -5.729952209e-02f }, + { -1.826581646e-02f, +3.092675163e-01f, +7.693201924e-01f, -5.731557068e-02f }, + { -1.823953469e-02f, +3.089497890e-01f, +7.696245724e-01f, -5.733157137e-02f }, + { -1.821327074e-02f, +3.086321600e-01f, +7.699288208e-01f, -5.734752407e-02f }, + { -1.818702464e-02f, +3.083146294e-01f, +7.702329374e-01f, -5.736342870e-02f }, + { -1.816079639e-02f, +3.079971975e-01f, +7.705369222e-01f, -5.737928519e-02f }, + { -1.813458600e-02f, +3.076798642e-01f, +7.708407749e-01f, -5.739509346e-02f }, + { -1.810839350e-02f, +3.073626297e-01f, +7.711444953e-01f, -5.741085343e-02f }, + { -1.808221890e-02f, +3.070454941e-01f, +7.714480832e-01f, -5.742656503e-02f }, + { -1.805606221e-02f, +3.067284576e-01f, +7.717515386e-01f, -5.744222816e-02f }, + { -1.802992345e-02f, +3.064115203e-01f, +7.720548611e-01f, -5.745784276e-02f }, + { -1.800380263e-02f, +3.060946822e-01f, +7.723580506e-01f, -5.747340875e-02f }, + { -1.797769977e-02f, +3.057779436e-01f, +7.726611070e-01f, -5.748892604e-02f }, + { -1.795161487e-02f, +3.054613045e-01f, +7.729640301e-01f, -5.750439457e-02f }, + { -1.792554796e-02f, +3.051447650e-01f, +7.732668197e-01f, -5.751981424e-02f }, + { -1.789949905e-02f, +3.048283253e-01f, +7.735694755e-01f, -5.753518499e-02f }, + { -1.787346814e-02f, +3.045119855e-01f, +7.738719975e-01f, -5.755050673e-02f }, + { -1.784745527e-02f, +3.041957456e-01f, +7.741743855e-01f, -5.756577939e-02f }, + { -1.782146044e-02f, +3.038796059e-01f, +7.744766393e-01f, -5.758100289e-02f }, + { -1.779548366e-02f, +3.035635665e-01f, +7.747787586e-01f, -5.759617715e-02f }, + { -1.776952495e-02f, +3.032476274e-01f, +7.750807434e-01f, -5.761130208e-02f }, + { -1.774358432e-02f, +3.029317887e-01f, +7.753825935e-01f, -5.762637762e-02f }, + { -1.771766179e-02f, +3.026160507e-01f, +7.756843086e-01f, -5.764140368e-02f }, + { -1.769175736e-02f, +3.023004134e-01f, +7.759858886e-01f, -5.765638018e-02f }, + { -1.766587107e-02f, +3.019848769e-01f, +7.762873333e-01f, -5.767130705e-02f }, + { -1.764000291e-02f, +3.016694414e-01f, +7.765886426e-01f, -5.768618420e-02f }, + { -1.761415290e-02f, +3.013541069e-01f, +7.768898163e-01f, -5.770101157e-02f }, + { -1.758832105e-02f, +3.010388736e-01f, +7.771908542e-01f, -5.771578906e-02f }, + { -1.756250739e-02f, +3.007237417e-01f, +7.774917560e-01f, -5.773051660e-02f }, + { -1.753671192e-02f, +3.004087111e-01f, +7.777925218e-01f, -5.774519411e-02f }, + { -1.751093465e-02f, +3.000937821e-01f, +7.780931511e-01f, -5.775982152e-02f }, + { -1.748517560e-02f, +2.997789547e-01f, +7.783936440e-01f, -5.777439874e-02f }, + { -1.745943479e-02f, +2.994642291e-01f, +7.786940002e-01f, -5.778892569e-02f }, + { -1.743371222e-02f, +2.991496054e-01f, +7.789942195e-01f, -5.780340230e-02f }, + { -1.740800791e-02f, +2.988350837e-01f, +7.792943018e-01f, -5.781782849e-02f }, + { -1.738232187e-02f, +2.985206642e-01f, +7.795942469e-01f, -5.783220417e-02f }, + { -1.735665412e-02f, +2.982063468e-01f, +7.798940546e-01f, -5.784652927e-02f }, + { -1.733100467e-02f, +2.978921319e-01f, +7.801937247e-01f, -5.786080371e-02f }, + { -1.730537353e-02f, +2.975780194e-01f, +7.804932570e-01f, -5.787502741e-02f }, + { -1.727976072e-02f, +2.972640094e-01f, +7.807926515e-01f, -5.788920029e-02f }, + { -1.725416625e-02f, +2.969501022e-01f, +7.810919079e-01f, -5.790332228e-02f }, + { -1.722859012e-02f, +2.966362979e-01f, +7.813910260e-01f, -5.791739329e-02f }, + { -1.720303237e-02f, +2.963225964e-01f, +7.816900056e-01f, -5.793141324e-02f }, + { -1.717749299e-02f, +2.960089980e-01f, +7.819888466e-01f, -5.794538205e-02f }, + { -1.715197200e-02f, +2.956955028e-01f, +7.822875489e-01f, -5.795929965e-02f }, + { -1.712646941e-02f, +2.953821109e-01f, +7.825861121e-01f, -5.797316596e-02f }, + { -1.710098524e-02f, +2.950688223e-01f, +7.828845363e-01f, -5.798698089e-02f }, + { -1.707551950e-02f, +2.947556373e-01f, +7.831828211e-01f, -5.800074437e-02f }, + { -1.705007220e-02f, +2.944425560e-01f, +7.834809664e-01f, -5.801445632e-02f }, + { -1.702464336e-02f, +2.941295783e-01f, +7.837789720e-01f, -5.802811666e-02f }, + { -1.699923298e-02f, +2.938167045e-01f, +7.840768378e-01f, -5.804172530e-02f }, + { -1.697384108e-02f, +2.935039348e-01f, +7.843745636e-01f, -5.805528218e-02f }, + { -1.694846768e-02f, +2.931912691e-01f, +7.846721491e-01f, -5.806878721e-02f }, + { -1.692311278e-02f, +2.928787076e-01f, +7.849695943e-01f, -5.808224030e-02f }, + { -1.689777639e-02f, +2.925662504e-01f, +7.852668990e-01f, -5.809564139e-02f }, + { -1.687245854e-02f, +2.922538976e-01f, +7.855640629e-01f, -5.810899039e-02f }, + { -1.684715923e-02f, +2.919416495e-01f, +7.858610859e-01f, -5.812228722e-02f }, + { -1.682187847e-02f, +2.916295059e-01f, +7.861579679e-01f, -5.813553181e-02f }, + { -1.679661628e-02f, +2.913174672e-01f, +7.864547086e-01f, -5.814872407e-02f }, + { -1.677137267e-02f, +2.910055333e-01f, +7.867513079e-01f, -5.816186392e-02f }, + { -1.674614765e-02f, +2.906937045e-01f, +7.870477656e-01f, -5.817495128e-02f }, + { -1.672094124e-02f, +2.903819808e-01f, +7.873440816e-01f, -5.818798608e-02f }, + { -1.669575344e-02f, +2.900703623e-01f, +7.876402556e-01f, -5.820096823e-02f }, + { -1.667058426e-02f, +2.897588491e-01f, +7.879362875e-01f, -5.821389766e-02f }, + { -1.664543373e-02f, +2.894474415e-01f, +7.882321771e-01f, -5.822677428e-02f }, + { -1.662030185e-02f, +2.891361394e-01f, +7.885279242e-01f, -5.823959802e-02f }, + { -1.659518863e-02f, +2.888249429e-01f, +7.888235287e-01f, -5.825236880e-02f }, + { -1.657009409e-02f, +2.885138523e-01f, +7.891189904e-01f, -5.826508653e-02f }, + { -1.654501824e-02f, +2.882028676e-01f, +7.894143091e-01f, -5.827775113e-02f }, + { -1.651996108e-02f, +2.878919890e-01f, +7.897094846e-01f, -5.829036253e-02f }, + { -1.649492264e-02f, +2.875812164e-01f, +7.900045168e-01f, -5.830292065e-02f }, + { -1.646990291e-02f, +2.872705501e-01f, +7.902994055e-01f, -5.831542540e-02f }, + { -1.644490193e-02f, +2.869599902e-01f, +7.905941505e-01f, -5.832787671e-02f }, + { -1.641991969e-02f, +2.866495368e-01f, +7.908887516e-01f, -5.834027449e-02f }, + { -1.639495620e-02f, +2.863391899e-01f, +7.911832088e-01f, -5.835261867e-02f }, + { -1.637001149e-02f, +2.860289498e-01f, +7.914775217e-01f, -5.836490917e-02f }, + { -1.634508556e-02f, +2.857188164e-01f, +7.917716902e-01f, -5.837714590e-02f }, + { -1.632017842e-02f, +2.854087900e-01f, +7.920657142e-01f, -5.838932879e-02f }, + { -1.629529008e-02f, +2.850988707e-01f, +7.923595935e-01f, -5.840145776e-02f }, + { -1.627042056e-02f, +2.847890584e-01f, +7.926533279e-01f, -5.841353272e-02f }, + { -1.624556986e-02f, +2.844793535e-01f, +7.929469172e-01f, -5.842555359e-02f }, + { -1.622073801e-02f, +2.841697559e-01f, +7.932403612e-01f, -5.843752031e-02f }, + { -1.619592500e-02f, +2.838602658e-01f, +7.935336599e-01f, -5.844943277e-02f }, + { -1.617113085e-02f, +2.835508833e-01f, +7.938268129e-01f, -5.846129092e-02f }, + { -1.614635558e-02f, +2.832416085e-01f, +7.941198202e-01f, -5.847309465e-02f }, + { -1.612159918e-02f, +2.829324415e-01f, +7.944126816e-01f, -5.848484391e-02f }, + { -1.609686168e-02f, +2.826233824e-01f, +7.947053969e-01f, -5.849653859e-02f }, + { -1.607214309e-02f, +2.823144314e-01f, +7.949979658e-01f, -5.850817864e-02f }, + { -1.604744341e-02f, +2.820055885e-01f, +7.952903884e-01f, -5.851976395e-02f }, + { -1.602276266e-02f, +2.816968539e-01f, +7.955826642e-01f, -5.853129446e-02f }, + { -1.599810084e-02f, +2.813882276e-01f, +7.958747933e-01f, -5.854277008e-02f }, + { -1.597345798e-02f, +2.810797098e-01f, +7.961667755e-01f, -5.855419074e-02f }, + { -1.594883407e-02f, +2.807713007e-01f, +7.964586105e-01f, -5.856555634e-02f }, + { -1.592422914e-02f, +2.804630002e-01f, +7.967502981e-01f, -5.857686682e-02f }, + { -1.589964318e-02f, +2.801548085e-01f, +7.970418383e-01f, -5.858812209e-02f }, + { -1.587507622e-02f, +2.798467258e-01f, +7.973332308e-01f, -5.859932207e-02f }, + { -1.585052826e-02f, +2.795387520e-01f, +7.976244755e-01f, -5.861046669e-02f }, + { -1.582599931e-02f, +2.792308874e-01f, +7.979155722e-01f, -5.862155585e-02f }, + { -1.580148939e-02f, +2.789231321e-01f, +7.982065207e-01f, -5.863258948e-02f }, + { -1.577699850e-02f, +2.786154861e-01f, +7.984973209e-01f, -5.864356750e-02f }, + { -1.575252665e-02f, +2.783079496e-01f, +7.987879725e-01f, -5.865448983e-02f }, + { -1.572807386e-02f, +2.780005227e-01f, +7.990784754e-01f, -5.866535639e-02f }, + { -1.570364014e-02f, +2.776932054e-01f, +7.993688295e-01f, -5.867616710e-02f }, + { -1.567922549e-02f, +2.773859980e-01f, +7.996590346e-01f, -5.868692187e-02f }, + { -1.565482993e-02f, +2.770789004e-01f, +7.999490904e-01f, -5.869762062e-02f }, + { -1.563045347e-02f, +2.767719129e-01f, +8.002389969e-01f, -5.870826329e-02f }, + { -1.560609611e-02f, +2.764650354e-01f, +8.005287538e-01f, -5.871884977e-02f }, + { -1.558175787e-02f, +2.761582682e-01f, +8.008183610e-01f, -5.872938000e-02f }, + { -1.555743875e-02f, +2.758516114e-01f, +8.011078183e-01f, -5.873985390e-02f }, + { -1.553313878e-02f, +2.755450649e-01f, +8.013971255e-01f, -5.875027137e-02f }, + { -1.550885795e-02f, +2.752386291e-01f, +8.016862825e-01f, -5.876063235e-02f }, + { -1.548459628e-02f, +2.749323038e-01f, +8.019752891e-01f, -5.877093675e-02f }, + { -1.546035377e-02f, +2.746260894e-01f, +8.022641451e-01f, -5.878118449e-02f }, + { -1.543613045e-02f, +2.743199858e-01f, +8.025528503e-01f, -5.879137549e-02f }, + { -1.541192631e-02f, +2.740139932e-01f, +8.028414047e-01f, -5.880150966e-02f }, + { -1.538774137e-02f, +2.737081117e-01f, +8.031298079e-01f, -5.881158693e-02f }, + { -1.536357563e-02f, +2.734023414e-01f, +8.034180599e-01f, -5.882160722e-02f }, + { -1.533942912e-02f, +2.730966824e-01f, +8.037061604e-01f, -5.883157045e-02f }, + { -1.531530183e-02f, +2.727911348e-01f, +8.039941094e-01f, -5.884147653e-02f }, + { -1.529119377e-02f, +2.724856987e-01f, +8.042819066e-01f, -5.885132538e-02f }, + { -1.526710496e-02f, +2.721803743e-01f, +8.045695518e-01f, -5.886111692e-02f }, + { -1.524303541e-02f, +2.718751616e-01f, +8.048570449e-01f, -5.887085108e-02f }, + { -1.521898512e-02f, +2.715700607e-01f, +8.051443857e-01f, -5.888052777e-02f }, + { -1.519495411e-02f, +2.712650718e-01f, +8.054315741e-01f, -5.889014690e-02f }, + { -1.517094238e-02f, +2.709601949e-01f, +8.057186098e-01f, -5.889970841e-02f }, + { -1.514694995e-02f, +2.706554301e-01f, +8.060054928e-01f, -5.890921220e-02f }, + { -1.512297682e-02f, +2.703507777e-01f, +8.062922227e-01f, -5.891865819e-02f }, + { -1.509902300e-02f, +2.700462376e-01f, +8.065787996e-01f, -5.892804632e-02f }, + { -1.507508850e-02f, +2.697418099e-01f, +8.068652231e-01f, -5.893737648e-02f }, + { -1.505117334e-02f, +2.694374949e-01f, +8.071514932e-01f, -5.894664861e-02f }, + { -1.502727751e-02f, +2.691332925e-01f, +8.074376096e-01f, -5.895586262e-02f }, + { -1.500340104e-02f, +2.688292029e-01f, +8.077235722e-01f, -5.896501843e-02f }, + { -1.497954392e-02f, +2.685252263e-01f, +8.080093808e-01f, -5.897411596e-02f }, + { -1.495570618e-02f, +2.682213626e-01f, +8.082950352e-01f, -5.898315513e-02f }, + { -1.493188780e-02f, +2.679176120e-01f, +8.085805354e-01f, -5.899213585e-02f }, + { -1.490808882e-02f, +2.676139746e-01f, +8.088658810e-01f, -5.900105805e-02f }, + { -1.488430923e-02f, +2.673104506e-01f, +8.091510719e-01f, -5.900992164e-02f }, + { -1.486054904e-02f, +2.670070400e-01f, +8.094361081e-01f, -5.901872654e-02f }, + { -1.483680827e-02f, +2.667037429e-01f, +8.097209892e-01f, -5.902747268e-02f }, + { -1.481308692e-02f, +2.664005594e-01f, +8.100057151e-01f, -5.903615996e-02f }, + { -1.478938500e-02f, +2.660974897e-01f, +8.102902857e-01f, -5.904478831e-02f }, + { -1.476570252e-02f, +2.657945338e-01f, +8.105747008e-01f, -5.905335765e-02f }, + { -1.474203949e-02f, +2.654916918e-01f, +8.108589603e-01f, -5.906186790e-02f }, + { -1.471839591e-02f, +2.651889639e-01f, +8.111430638e-01f, -5.907031897e-02f }, + { -1.469477181e-02f, +2.648863501e-01f, +8.114270114e-01f, -5.907871078e-02f }, + { -1.467116717e-02f, +2.645838506e-01f, +8.117108027e-01f, -5.908704325e-02f }, + { -1.464758202e-02f, +2.642814655e-01f, +8.119944377e-01f, -5.909531630e-02f }, + { -1.462401636e-02f, +2.639791948e-01f, +8.122779162e-01f, -5.910352985e-02f }, + { -1.460047020e-02f, +2.636770386e-01f, +8.125612380e-01f, -5.911168382e-02f }, + { -1.457694355e-02f, +2.633749972e-01f, +8.128444029e-01f, -5.911977812e-02f }, + { -1.455343641e-02f, +2.630730705e-01f, +8.131274108e-01f, -5.912781267e-02f }, + { -1.452994881e-02f, +2.627712587e-01f, +8.134102615e-01f, -5.913578740e-02f }, + { -1.450648073e-02f, +2.624695618e-01f, +8.136929549e-01f, -5.914370221e-02f }, + { -1.448303220e-02f, +2.621679801e-01f, +8.139754907e-01f, -5.915155704e-02f }, + { -1.445960321e-02f, +2.618665135e-01f, +8.142578688e-01f, -5.915935179e-02f }, + { -1.443619379e-02f, +2.615651622e-01f, +8.145400890e-01f, -5.916708638e-02f }, + { -1.441280393e-02f, +2.612639263e-01f, +8.148221512e-01f, -5.917476074e-02f }, + { -1.438943365e-02f, +2.609628058e-01f, +8.151040551e-01f, -5.918237478e-02f }, + { -1.436608295e-02f, +2.606618010e-01f, +8.153858007e-01f, -5.918992842e-02f }, + { -1.434275184e-02f, +2.603609118e-01f, +8.156673878e-01f, -5.919742158e-02f }, + { -1.431944033e-02f, +2.600601385e-01f, +8.159488162e-01f, -5.920485418e-02f }, + { -1.429614843e-02f, +2.597594810e-01f, +8.162300856e-01f, -5.921222613e-02f }, + { -1.427287614e-02f, +2.594589396e-01f, +8.165111960e-01f, -5.921953735e-02f }, + { -1.424962348e-02f, +2.591585142e-01f, +8.167921473e-01f, -5.922678777e-02f }, + { -1.422639045e-02f, +2.588582051e-01f, +8.170729391e-01f, -5.923397729e-02f }, + { -1.420317705e-02f, +2.585580122e-01f, +8.173535714e-01f, -5.924110584e-02f }, + { -1.417998331e-02f, +2.582579358e-01f, +8.176340439e-01f, -5.924817333e-02f }, + { -1.415680921e-02f, +2.579579758e-01f, +8.179143566e-01f, -5.925517969e-02f }, + { -1.413365478e-02f, +2.576581325e-01f, +8.181945092e-01f, -5.926212483e-02f }, + { -1.411052002e-02f, +2.573584058e-01f, +8.184745017e-01f, -5.926900867e-02f }, + { -1.408740493e-02f, +2.570587960e-01f, +8.187543337e-01f, -5.927583113e-02f }, + { -1.406430953e-02f, +2.567593031e-01f, +8.190340052e-01f, -5.928259213e-02f }, + { -1.404123383e-02f, +2.564599271e-01f, +8.193135159e-01f, -5.928929157e-02f }, + { -1.401817782e-02f, +2.561606683e-01f, +8.195928658e-01f, -5.929592939e-02f }, + { -1.399514152e-02f, +2.558615267e-01f, +8.198720547e-01f, -5.930250550e-02f }, + { -1.397212493e-02f, +2.555625024e-01f, +8.201510823e-01f, -5.930901982e-02f }, + { -1.394912807e-02f, +2.552635955e-01f, +8.204299485e-01f, -5.931547226e-02f }, + { -1.392615094e-02f, +2.549648062e-01f, +8.207086532e-01f, -5.932186275e-02f }, + { -1.390319354e-02f, +2.546661344e-01f, +8.209871961e-01f, -5.932819120e-02f }, + { -1.388025589e-02f, +2.543675803e-01f, +8.212655772e-01f, -5.933445753e-02f }, + { -1.385733799e-02f, +2.540691440e-01f, +8.215437962e-01f, -5.934066165e-02f }, + { -1.383443984e-02f, +2.537708257e-01f, +8.218218531e-01f, -5.934680349e-02f }, + { -1.381156147e-02f, +2.534726253e-01f, +8.220997475e-01f, -5.935288297e-02f }, + { -1.378870286e-02f, +2.531745431e-01f, +8.223774794e-01f, -5.935889999e-02f }, + { -1.376586404e-02f, +2.528765790e-01f, +8.226550485e-01f, -5.936485448e-02f }, + { -1.374304500e-02f, +2.525787333e-01f, +8.229324548e-01f, -5.937074636e-02f }, + { -1.372024576e-02f, +2.522810059e-01f, +8.232096981e-01f, -5.937657555e-02f }, + { -1.369746632e-02f, +2.519833971e-01f, +8.234867781e-01f, -5.938234196e-02f }, + { -1.367470668e-02f, +2.516859068e-01f, +8.237636948e-01f, -5.938804550e-02f }, + { -1.365196686e-02f, +2.513885353e-01f, +8.240404479e-01f, -5.939368611e-02f }, + { -1.362924687e-02f, +2.510912825e-01f, +8.243170373e-01f, -5.939926369e-02f }, + { -1.360654670e-02f, +2.507941486e-01f, +8.245934629e-01f, -5.940477816e-02f }, + { -1.358386636e-02f, +2.504971337e-01f, +8.248697244e-01f, -5.941022944e-02f }, + { -1.356120587e-02f, +2.502002379e-01f, +8.251458217e-01f, -5.941561746e-02f }, + { -1.353856523e-02f, +2.499034613e-01f, +8.254217546e-01f, -5.942094212e-02f }, + { -1.351594444e-02f, +2.496068040e-01f, +8.256975230e-01f, -5.942620334e-02f }, + { -1.349334351e-02f, +2.493102660e-01f, +8.259731267e-01f, -5.943140104e-02f }, + { -1.347076245e-02f, +2.490138475e-01f, +8.262485655e-01f, -5.943653515e-02f }, + { -1.344820127e-02f, +2.487175486e-01f, +8.265238393e-01f, -5.944160557e-02f }, + { -1.342565996e-02f, +2.484213694e-01f, +8.267989479e-01f, -5.944661222e-02f }, + { -1.340313855e-02f, +2.481253099e-01f, +8.270738912e-01f, -5.945155503e-02f }, + { -1.338063703e-02f, +2.478293703e-01f, +8.273486689e-01f, -5.945643390e-02f }, + { -1.335815541e-02f, +2.475335507e-01f, +8.276232810e-01f, -5.946124877e-02f }, + { -1.333569370e-02f, +2.472378511e-01f, +8.278977272e-01f, -5.946599953e-02f }, + { -1.331325190e-02f, +2.469422717e-01f, +8.281720074e-01f, -5.947068612e-02f }, + { -1.329083001e-02f, +2.466468125e-01f, +8.284461214e-01f, -5.947530845e-02f }, + { -1.326842806e-02f, +2.463514737e-01f, +8.287200691e-01f, -5.947986644e-02f }, + { -1.324604604e-02f, +2.460562553e-01f, +8.289938502e-01f, -5.948436000e-02f }, + { -1.322368395e-02f, +2.457611574e-01f, +8.292674647e-01f, -5.948878905e-02f }, + { -1.320134181e-02f, +2.454661802e-01f, +8.295409124e-01f, -5.949315351e-02f }, + { -1.317901962e-02f, +2.451713237e-01f, +8.298141930e-01f, -5.949745330e-02f }, + { -1.315671739e-02f, +2.448765881e-01f, +8.300873065e-01f, -5.950168834e-02f }, + { -1.313443511e-02f, +2.445819733e-01f, +8.303602527e-01f, -5.950585853e-02f }, + { -1.311217281e-02f, +2.442874796e-01f, +8.306330313e-01f, -5.950996381e-02f }, + { -1.308993048e-02f, +2.439931070e-01f, +8.309056424e-01f, -5.951400408e-02f }, + { -1.306770813e-02f, +2.436988556e-01f, +8.311780856e-01f, -5.951797926e-02f }, + { -1.304550576e-02f, +2.434047255e-01f, +8.314503608e-01f, -5.952188928e-02f }, + { -1.302332339e-02f, +2.431107168e-01f, +8.317224679e-01f, -5.952573404e-02f }, + { -1.300116101e-02f, +2.428168296e-01f, +8.319944067e-01f, -5.952951347e-02f }, + { -1.297901864e-02f, +2.425230639e-01f, +8.322661770e-01f, -5.953322748e-02f }, + { -1.295689627e-02f, +2.422294200e-01f, +8.325377786e-01f, -5.953687600e-02f }, + { -1.293479392e-02f, +2.419358978e-01f, +8.328092115e-01f, -5.954045893e-02f }, + { -1.291271159e-02f, +2.416424975e-01f, +8.330804754e-01f, -5.954397620e-02f }, + { -1.289064929e-02f, +2.413492191e-01f, +8.333515702e-01f, -5.954742771e-02f }, + { -1.286860701e-02f, +2.410560629e-01f, +8.336224957e-01f, -5.955081340e-02f }, + { -1.284658477e-02f, +2.407630287e-01f, +8.338932518e-01f, -5.955413318e-02f }, + { -1.282458258e-02f, +2.404701168e-01f, +8.341638383e-01f, -5.955738696e-02f }, + { -1.280260043e-02f, +2.401773273e-01f, +8.344342550e-01f, -5.956057466e-02f }, + { -1.278063833e-02f, +2.398846601e-01f, +8.347045017e-01f, -5.956369619e-02f }, + { -1.275869629e-02f, +2.395921155e-01f, +8.349745784e-01f, -5.956675149e-02f }, + { -1.273677432e-02f, +2.392996936e-01f, +8.352444848e-01f, -5.956974045e-02f }, + { -1.271487241e-02f, +2.390073943e-01f, +8.355142207e-01f, -5.957266301e-02f }, + { -1.269299057e-02f, +2.387152178e-01f, +8.357837861e-01f, -5.957551907e-02f }, + { -1.267112882e-02f, +2.384231642e-01f, +8.360531808e-01f, -5.957830856e-02f }, + { -1.264928715e-02f, +2.381312337e-01f, +8.363224045e-01f, -5.958103139e-02f }, + { -1.262746557e-02f, +2.378394262e-01f, +8.365914572e-01f, -5.958368747e-02f }, + { -1.260566408e-02f, +2.375477418e-01f, +8.368603387e-01f, -5.958627674e-02f }, + { -1.258388269e-02f, +2.372561808e-01f, +8.371290487e-01f, -5.958879909e-02f }, + { -1.256212141e-02f, +2.369647431e-01f, +8.373975872e-01f, -5.959125445e-02f }, + { -1.254038023e-02f, +2.366734288e-01f, +8.376659540e-01f, -5.959364274e-02f }, + { -1.251865917e-02f, +2.363822381e-01f, +8.379341490e-01f, -5.959596388e-02f }, + { -1.249695823e-02f, +2.360911710e-01f, +8.382021718e-01f, -5.959821777e-02f }, + { -1.247527741e-02f, +2.358002277e-01f, +8.384700225e-01f, -5.960040434e-02f }, + { -1.245361672e-02f, +2.355094081e-01f, +8.387377009e-01f, -5.960252351e-02f }, + { -1.243197617e-02f, +2.352187125e-01f, +8.390052067e-01f, -5.960457519e-02f }, + { -1.241035575e-02f, +2.349281409e-01f, +8.392725398e-01f, -5.960655929e-02f }, + { -1.238875548e-02f, +2.346376934e-01f, +8.395397001e-01f, -5.960847575e-02f }, + { -1.236717535e-02f, +2.343473700e-01f, +8.398066874e-01f, -5.961032446e-02f }, + { -1.234561537e-02f, +2.340571709e-01f, +8.400735015e-01f, -5.961210535e-02f }, + { -1.232407555e-02f, +2.337670962e-01f, +8.403401423e-01f, -5.961381834e-02f }, + { -1.230255589e-02f, +2.334771460e-01f, +8.406066096e-01f, -5.961546335e-02f }, + { -1.228105640e-02f, +2.331873202e-01f, +8.408729033e-01f, -5.961704028e-02f }, + { -1.225957708e-02f, +2.328976192e-01f, +8.411390231e-01f, -5.961854906e-02f }, + { -1.223811793e-02f, +2.326080428e-01f, +8.414049690e-01f, -5.961998961e-02f }, + { -1.221667896e-02f, +2.323185913e-01f, +8.416707408e-01f, -5.962136183e-02f }, + { -1.219526018e-02f, +2.320292646e-01f, +8.419363383e-01f, -5.962266566e-02f }, + { -1.217386158e-02f, +2.317400630e-01f, +8.422017613e-01f, -5.962390099e-02f }, + { -1.215248317e-02f, +2.314509865e-01f, +8.424670098e-01f, -5.962506776e-02f }, + { -1.213112496e-02f, +2.311620351e-01f, +8.427320835e-01f, -5.962616588e-02f }, + { -1.210978695e-02f, +2.308732090e-01f, +8.429969822e-01f, -5.962719526e-02f }, + { -1.208846914e-02f, +2.305845082e-01f, +8.432617059e-01f, -5.962815583e-02f }, + { -1.206717155e-02f, +2.302959329e-01f, +8.435262543e-01f, -5.962904749e-02f }, + { -1.204589416e-02f, +2.300074831e-01f, +8.437906274e-01f, -5.962987017e-02f }, + { -1.202463700e-02f, +2.297191590e-01f, +8.440548248e-01f, -5.963062378e-02f }, + { -1.200340005e-02f, +2.294309606e-01f, +8.443188466e-01f, -5.963130824e-02f }, + { -1.198218333e-02f, +2.291428879e-01f, +8.445826924e-01f, -5.963192347e-02f }, + { -1.196098683e-02f, +2.288549412e-01f, +8.448463623e-01f, -5.963246938e-02f }, + { -1.193981057e-02f, +2.285671204e-01f, +8.451098559e-01f, -5.963294588e-02f }, + { -1.191865455e-02f, +2.282794257e-01f, +8.453731732e-01f, -5.963335291e-02f }, + { -1.189751876e-02f, +2.279918571e-01f, +8.456363139e-01f, -5.963369036e-02f }, + { -1.187640322e-02f, +2.277044148e-01f, +8.458992780e-01f, -5.963395817e-02f }, + { -1.185530793e-02f, +2.274170988e-01f, +8.461620653e-01f, -5.963415624e-02f }, + { -1.183423289e-02f, +2.271299092e-01f, +8.464246755e-01f, -5.963428449e-02f }, + { -1.181317810e-02f, +2.268428462e-01f, +8.466871086e-01f, -5.963434285e-02f }, + { -1.179214358e-02f, +2.265559097e-01f, +8.469493644e-01f, -5.963433122e-02f }, + { -1.177112931e-02f, +2.262690999e-01f, +8.472114428e-01f, -5.963424952e-02f }, + { -1.175013531e-02f, +2.259824169e-01f, +8.474733435e-01f, -5.963409767e-02f }, + { -1.172916159e-02f, +2.256958607e-01f, +8.477350664e-01f, -5.963387559e-02f }, + { -1.170820813e-02f, +2.254094315e-01f, +8.479966114e-01f, -5.963358319e-02f }, + { -1.168727495e-02f, +2.251231293e-01f, +8.482579783e-01f, -5.963322039e-02f }, + { -1.166636205e-02f, +2.248369542e-01f, +8.485191669e-01f, -5.963278711e-02f }, + { -1.164546944e-02f, +2.245509063e-01f, +8.487801771e-01f, -5.963228326e-02f }, + { -1.162459711e-02f, +2.242649857e-01f, +8.490410088e-01f, -5.963170876e-02f }, + { -1.160374507e-02f, +2.239791925e-01f, +8.493016617e-01f, -5.963106352e-02f }, + { -1.158291333e-02f, +2.236935267e-01f, +8.495621358e-01f, -5.963034747e-02f }, + { -1.156210188e-02f, +2.234079885e-01f, +8.498224307e-01f, -5.962956051e-02f }, + { -1.154131073e-02f, +2.231225780e-01f, +8.500825465e-01f, -5.962870257e-02f }, + { -1.152053989e-02f, +2.228372951e-01f, +8.503424830e-01f, -5.962777357e-02f }, + { -1.149978935e-02f, +2.225521401e-01f, +8.506022399e-01f, -5.962677341e-02f }, + { -1.147905912e-02f, +2.222671129e-01f, +8.508618171e-01f, -5.962570201e-02f }, + { -1.145834920e-02f, +2.219822138e-01f, +8.511212145e-01f, -5.962455930e-02f }, + { -1.143765960e-02f, +2.216974426e-01f, +8.513804320e-01f, -5.962334519e-02f }, + { -1.141699032e-02f, +2.214127997e-01f, +8.516394693e-01f, -5.962205959e-02f }, + { -1.139634135e-02f, +2.211282850e-01f, +8.518983262e-01f, -5.962070242e-02f }, + { -1.137571272e-02f, +2.208438986e-01f, +8.521570028e-01f, -5.961927360e-02f }, + { -1.135510441e-02f, +2.205596406e-01f, +8.524154987e-01f, -5.961777305e-02f }, + { -1.133451643e-02f, +2.202755110e-01f, +8.526738139e-01f, -5.961620067e-02f }, + { -1.131394878e-02f, +2.199915101e-01f, +8.529319481e-01f, -5.961455639e-02f }, + { -1.129340147e-02f, +2.197076378e-01f, +8.531899012e-01f, -5.961284013e-02f }, + { -1.127287449e-02f, +2.194238943e-01f, +8.534476731e-01f, -5.961105179e-02f }, + { -1.125236786e-02f, +2.191402796e-01f, +8.537052637e-01f, -5.960919130e-02f }, + { -1.123188157e-02f, +2.188567938e-01f, +8.539626726e-01f, -5.960725858e-02f }, + { -1.121141563e-02f, +2.185734369e-01f, +8.542198999e-01f, -5.960525353e-02f }, + { -1.119097004e-02f, +2.182902092e-01f, +8.544769453e-01f, -5.960317608e-02f }, + { -1.117054480e-02f, +2.180071107e-01f, +8.547338087e-01f, -5.960102614e-02f }, + { -1.115013991e-02f, +2.177241413e-01f, +8.549904899e-01f, -5.959880364e-02f }, + { -1.112975538e-02f, +2.174413013e-01f, +8.552469888e-01f, -5.959650847e-02f }, + { -1.110939121e-02f, +2.171585908e-01f, +8.555033052e-01f, -5.959414057e-02f }, + { -1.108904740e-02f, +2.168760097e-01f, +8.557594390e-01f, -5.959169984e-02f }, + { -1.106872396e-02f, +2.165935582e-01f, +8.560153900e-01f, -5.958918621e-02f }, + { -1.104842088e-02f, +2.163112364e-01f, +8.562711580e-01f, -5.958659959e-02f }, + { -1.102813817e-02f, +2.160290443e-01f, +8.565267430e-01f, -5.958393990e-02f }, + { -1.100787583e-02f, +2.157469820e-01f, +8.567821446e-01f, -5.958120705e-02f }, + { -1.098763386e-02f, +2.154650497e-01f, +8.570373629e-01f, -5.957840096e-02f }, + { -1.096741227e-02f, +2.151832473e-01f, +8.572923976e-01f, -5.957552154e-02f }, + { -1.094721106e-02f, +2.149015750e-01f, +8.575472486e-01f, -5.957256872e-02f }, + { -1.092703022e-02f, +2.146200329e-01f, +8.578019157e-01f, -5.956954241e-02f }, + { -1.090686977e-02f, +2.143386210e-01f, +8.580563988e-01f, -5.956644252e-02f }, + { -1.088672970e-02f, +2.140573395e-01f, +8.583106977e-01f, -5.956326897e-02f }, + { -1.086661002e-02f, +2.137761883e-01f, +8.585648123e-01f, -5.956002168e-02f }, + { -1.084651073e-02f, +2.134951677e-01f, +8.588187423e-01f, -5.955670057e-02f }, + { -1.082643182e-02f, +2.132142776e-01f, +8.590724878e-01f, -5.955330554e-02f }, + { -1.080637331e-02f, +2.129335181e-01f, +8.593260484e-01f, -5.954983652e-02f }, + { -1.078633519e-02f, +2.126528894e-01f, +8.595794240e-01f, -5.954629343e-02f }, + { -1.076631747e-02f, +2.123723915e-01f, +8.598326146e-01f, -5.954267617e-02f }, + { -1.074632015e-02f, +2.120920245e-01f, +8.600856199e-01f, -5.953898467e-02f }, + { -1.072634322e-02f, +2.118117885e-01f, +8.603384398e-01f, -5.953521884e-02f }, + { -1.070638669e-02f, +2.115316835e-01f, +8.605910741e-01f, -5.953137860e-02f }, + { -1.068645057e-02f, +2.112517097e-01f, +8.608435227e-01f, -5.952746386e-02f }, + { -1.066653486e-02f, +2.109718671e-01f, +8.610957855e-01f, -5.952347454e-02f }, + { -1.064663954e-02f, +2.106921557e-01f, +8.613478622e-01f, -5.951941056e-02f }, + { -1.062676464e-02f, +2.104125758e-01f, +8.615997527e-01f, -5.951527184e-02f }, + { -1.060691015e-02f, +2.101331273e-01f, +8.618514569e-01f, -5.951105828e-02f }, + { -1.058707606e-02f, +2.098538103e-01f, +8.621029746e-01f, -5.950676981e-02f }, + { -1.056726239e-02f, +2.095746250e-01f, +8.623543057e-01f, -5.950240634e-02f }, + { -1.054746914e-02f, +2.092955714e-01f, +8.626054500e-01f, -5.949796779e-02f }, + { -1.052769630e-02f, +2.090166495e-01f, +8.628564073e-01f, -5.949345407e-02f }, + { -1.050794387e-02f, +2.087378595e-01f, +8.631071776e-01f, -5.948886510e-02f }, + { -1.048821187e-02f, +2.084592015e-01f, +8.633577606e-01f, -5.948420080e-02f }, + { -1.046850028e-02f, +2.081806754e-01f, +8.636081562e-01f, -5.947946108e-02f }, + { -1.044880911e-02f, +2.079022815e-01f, +8.638583642e-01f, -5.947464586e-02f }, + { -1.042913837e-02f, +2.076240197e-01f, +8.641083845e-01f, -5.946975506e-02f }, + { -1.040948805e-02f, +2.073458902e-01f, +8.643582170e-01f, -5.946478859e-02f }, + { -1.038985815e-02f, +2.070678930e-01f, +8.646078615e-01f, -5.945974637e-02f }, + { -1.037024868e-02f, +2.067900282e-01f, +8.648573178e-01f, -5.945462831e-02f }, + { -1.035065964e-02f, +2.065122959e-01f, +8.651065858e-01f, -5.944943433e-02f }, + { -1.033109103e-02f, +2.062346962e-01f, +8.653556654e-01f, -5.944416434e-02f }, + { -1.031154284e-02f, +2.059572292e-01f, +8.656045563e-01f, -5.943881827e-02f }, + { -1.029201508e-02f, +2.056798948e-01f, +8.658532585e-01f, -5.943339603e-02f }, + { -1.027250776e-02f, +2.054026933e-01f, +8.661017718e-01f, -5.942789753e-02f }, + { -1.025302087e-02f, +2.051256246e-01f, +8.663500959e-01f, -5.942232269e-02f }, + { -1.023355441e-02f, +2.048486889e-01f, +8.665982309e-01f, -5.941667144e-02f }, + { -1.021410838e-02f, +2.045718862e-01f, +8.668461765e-01f, -5.941094367e-02f }, + { -1.019468279e-02f, +2.042952167e-01f, +8.670939326e-01f, -5.940513931e-02f }, + { -1.017527764e-02f, +2.040186803e-01f, +8.673414990e-01f, -5.939925828e-02f }, + { -1.015589292e-02f, +2.037422772e-01f, +8.675888756e-01f, -5.939330049e-02f }, + { -1.013652864e-02f, +2.034660075e-01f, +8.678360622e-01f, -5.938726586e-02f }, + { -1.011718480e-02f, +2.031898712e-01f, +8.680830587e-01f, -5.938115430e-02f }, + { -1.009786140e-02f, +2.029138683e-01f, +8.683298650e-01f, -5.937496574e-02f }, + { -1.007855843e-02f, +2.026379991e-01f, +8.685764808e-01f, -5.936870008e-02f }, + { -1.005927591e-02f, +2.023622635e-01f, +8.688229060e-01f, -5.936235724e-02f }, + { -1.004001383e-02f, +2.020866616e-01f, +8.690691405e-01f, -5.935593714e-02f }, + { -1.002077218e-02f, +2.018111936e-01f, +8.693151841e-01f, -5.934943969e-02f }, + { -1.000155098e-02f, +2.015358594e-01f, +8.695610368e-01f, -5.934286482e-02f }, + { -9.982350225e-03f, +2.012606592e-01f, +8.698066982e-01f, -5.933621243e-02f }, + { -9.963169910e-03f, +2.009855930e-01f, +8.700521683e-01f, -5.932948245e-02f }, + { -9.944010038e-03f, +2.007106609e-01f, +8.702974470e-01f, -5.932267479e-02f }, + { -9.924870610e-03f, +2.004358631e-01f, +8.705425340e-01f, -5.931578936e-02f }, + { -9.905751626e-03f, +2.001611994e-01f, +8.707874293e-01f, -5.930882608e-02f }, + { -9.886653086e-03f, +1.998866701e-01f, +8.710321326e-01f, -5.930178487e-02f }, + { -9.867574990e-03f, +1.996122753e-01f, +8.712766439e-01f, -5.929466565e-02f }, + { -9.848517340e-03f, +1.993380149e-01f, +8.715209630e-01f, -5.928746832e-02f }, + { -9.829480135e-03f, +1.990638891e-01f, +8.717650897e-01f, -5.928019281e-02f }, + { -9.810463375e-03f, +1.987898979e-01f, +8.720090239e-01f, -5.927283903e-02f }, + { -9.791467061e-03f, +1.985160414e-01f, +8.722527654e-01f, -5.926540690e-02f }, + { -9.772491192e-03f, +1.982423197e-01f, +8.724963141e-01f, -5.925789634e-02f }, + { -9.753535770e-03f, +1.979687329e-01f, +8.727396699e-01f, -5.925030726e-02f }, + { -9.734600793e-03f, +1.976952810e-01f, +8.729828325e-01f, -5.924263957e-02f }, + { -9.715686262e-03f, +1.974219642e-01f, +8.732258019e-01f, -5.923489319e-02f }, + { -9.696792177e-03f, +1.971487824e-01f, +8.734685779e-01f, -5.922706804e-02f }, + { -9.677918538e-03f, +1.968757357e-01f, +8.737111603e-01f, -5.921916404e-02f }, + { -9.659065344e-03f, +1.966028244e-01f, +8.739535491e-01f, -5.921118110e-02f }, + { -9.640232597e-03f, +1.963300483e-01f, +8.741957439e-01f, -5.920311914e-02f }, + { -9.621420295e-03f, +1.960574076e-01f, +8.744377448e-01f, -5.919497807e-02f }, + { -9.602628439e-03f, +1.957849023e-01f, +8.746795516e-01f, -5.918675781e-02f }, + { -9.583857028e-03f, +1.955125326e-01f, +8.749211640e-01f, -5.917845827e-02f }, + { -9.565106062e-03f, +1.952402985e-01f, +8.751625821e-01f, -5.917007938e-02f }, + { -9.546375540e-03f, +1.949682000e-01f, +8.754038055e-01f, -5.916162104e-02f }, + { -9.527665464e-03f, +1.946962373e-01f, +8.756448342e-01f, -5.915308317e-02f }, + { -9.508975831e-03f, +1.944244105e-01f, +8.758856680e-01f, -5.914446570e-02f }, + { -9.490306643e-03f, +1.941527195e-01f, +8.761263068e-01f, -5.913576853e-02f }, + { -9.471657898e-03f, +1.938811645e-01f, +8.763667504e-01f, -5.912699159e-02f }, + { -9.453029596e-03f, +1.936097455e-01f, +8.766069987e-01f, -5.911813478e-02f }, + { -9.434421737e-03f, +1.933384626e-01f, +8.768470516e-01f, -5.910919802e-02f }, + { -9.415834320e-03f, +1.930673159e-01f, +8.770869088e-01f, -5.910018124e-02f }, + { -9.397267344e-03f, +1.927963055e-01f, +8.773265703e-01f, -5.909108434e-02f }, + { -9.378720810e-03f, +1.925254314e-01f, +8.775660358e-01f, -5.908190725e-02f }, + { -9.360194716e-03f, +1.922546937e-01f, +8.778053053e-01f, -5.907264987e-02f }, + { -9.341689062e-03f, +1.919840925e-01f, +8.780443786e-01f, -5.906331213e-02f }, + { -9.323203848e-03f, +1.917136278e-01f, +8.782832556e-01f, -5.905389393e-02f }, + { -9.304739072e-03f, +1.914432997e-01f, +8.785219361e-01f, -5.904439521e-02f }, + { -9.286294734e-03f, +1.911731083e-01f, +8.787604199e-01f, -5.903481587e-02f }, + { -9.267870833e-03f, +1.909030537e-01f, +8.789987070e-01f, -5.902515582e-02f }, + { -9.249467369e-03f, +1.906331359e-01f, +8.792367971e-01f, -5.901541499e-02f }, + { -9.231084340e-03f, +1.903633550e-01f, +8.794746902e-01f, -5.900559330e-02f }, + { -9.212721746e-03f, +1.900937110e-01f, +8.797123860e-01f, -5.899569065e-02f }, + { -9.194379586e-03f, +1.898242041e-01f, +8.799498845e-01f, -5.898570696e-02f }, + { -9.176057859e-03f, +1.895548343e-01f, +8.801871854e-01f, -5.897564215e-02f }, + { -9.157756564e-03f, +1.892856017e-01f, +8.804242888e-01f, -5.896549614e-02f }, + { -9.139475700e-03f, +1.890165064e-01f, +8.806611943e-01f, -5.895526884e-02f }, + { -9.121215266e-03f, +1.887475484e-01f, +8.808979018e-01f, -5.894496016e-02f }, + { -9.102975262e-03f, +1.884787277e-01f, +8.811344113e-01f, -5.893457003e-02f }, + { -9.084755685e-03f, +1.882100446e-01f, +8.813707226e-01f, -5.892409837e-02f }, + { -9.066556536e-03f, +1.879414989e-01f, +8.816068354e-01f, -5.891354507e-02f }, + { -9.048377812e-03f, +1.876730909e-01f, +8.818427498e-01f, -5.890291007e-02f }, + { -9.030219514e-03f, +1.874048205e-01f, +8.820784655e-01f, -5.889219328e-02f }, + { -9.012081638e-03f, +1.871366879e-01f, +8.823139824e-01f, -5.888139461e-02f }, + { -8.993964185e-03f, +1.868686931e-01f, +8.825493003e-01f, -5.887051398e-02f }, + { -8.975867154e-03f, +1.866008361e-01f, +8.827844191e-01f, -5.885955131e-02f }, + { -8.957790542e-03f, +1.863331172e-01f, +8.830193387e-01f, -5.884850651e-02f }, + { -8.939734348e-03f, +1.860655362e-01f, +8.832540589e-01f, -5.883737950e-02f }, + { -8.921698572e-03f, +1.857980933e-01f, +8.834885795e-01f, -5.882617019e-02f }, + { -8.903683211e-03f, +1.855307886e-01f, +8.837229005e-01f, -5.881487851e-02f }, + { -8.885688265e-03f, +1.852636221e-01f, +8.839570217e-01f, -5.880350436e-02f }, + { -8.867713732e-03f, +1.849965939e-01f, +8.841909429e-01f, -5.879204767e-02f }, + { -8.849759611e-03f, +1.847297040e-01f, +8.844246640e-01f, -5.878050834e-02f }, + { -8.831825899e-03f, +1.844629526e-01f, +8.846581849e-01f, -5.876888630e-02f }, + { -8.813912596e-03f, +1.841963397e-01f, +8.848915054e-01f, -5.875718146e-02f }, + { -8.796019700e-03f, +1.839298653e-01f, +8.851246253e-01f, -5.874539374e-02f }, + { -8.778147210e-03f, +1.836635296e-01f, +8.853575446e-01f, -5.873352306e-02f }, + { -8.760295123e-03f, +1.833973325e-01f, +8.855902631e-01f, -5.872156932e-02f }, + { -8.742463438e-03f, +1.831312743e-01f, +8.858227806e-01f, -5.870953245e-02f }, + { -8.724652154e-03f, +1.828653548e-01f, +8.860550970e-01f, -5.869741236e-02f }, + { -8.706861268e-03f, +1.825995743e-01f, +8.862872121e-01f, -5.868520898e-02f }, + { -8.689090780e-03f, +1.823339328e-01f, +8.865191259e-01f, -5.867292220e-02f }, + { -8.671340686e-03f, +1.820684302e-01f, +8.867508381e-01f, -5.866055196e-02f }, + { -8.653610986e-03f, +1.818030668e-01f, +8.869823487e-01f, -5.864809816e-02f }, + { -8.635901678e-03f, +1.815378426e-01f, +8.872136574e-01f, -5.863556073e-02f }, + { -8.618212759e-03f, +1.812727576e-01f, +8.874447642e-01f, -5.862293958e-02f }, + { -8.600544229e-03f, +1.810078118e-01f, +8.876756689e-01f, -5.861023462e-02f }, + { -8.582896084e-03f, +1.807430055e-01f, +8.879063714e-01f, -5.859744577e-02f }, + { -8.565268323e-03f, +1.804783386e-01f, +8.881368715e-01f, -5.858457295e-02f }, + { -8.547660944e-03f, +1.802138112e-01f, +8.883671691e-01f, -5.857161608e-02f }, + { -8.530073945e-03f, +1.799494234e-01f, +8.885972640e-01f, -5.855857506e-02f }, + { -8.512507324e-03f, +1.796851751e-01f, +8.888271561e-01f, -5.854544983e-02f }, + { -8.494961078e-03f, +1.794210666e-01f, +8.890568452e-01f, -5.853224028e-02f }, + { -8.477435207e-03f, +1.791570979e-01f, +8.892863313e-01f, -5.851894634e-02f }, + { -8.459929707e-03f, +1.788932690e-01f, +8.895156142e-01f, -5.850556793e-02f }, + { -8.442444576e-03f, +1.786295800e-01f, +8.897446936e-01f, -5.849210496e-02f }, + { -8.424979813e-03f, +1.783660309e-01f, +8.899735696e-01f, -5.847855735e-02f }, + { -8.407535414e-03f, +1.781026219e-01f, +8.902022419e-01f, -5.846492501e-02f }, + { -8.390111379e-03f, +1.778393529e-01f, +8.904307105e-01f, -5.845120786e-02f }, + { -8.372707704e-03f, +1.775762242e-01f, +8.906589751e-01f, -5.843740582e-02f }, + { -8.355324387e-03f, +1.773132356e-01f, +8.908870357e-01f, -5.842351880e-02f }, + { -8.337961425e-03f, +1.770503873e-01f, +8.911148920e-01f, -5.840954672e-02f }, + { -8.320618817e-03f, +1.767876794e-01f, +8.913425440e-01f, -5.839548949e-02f }, + { -8.303296561e-03f, +1.765251119e-01f, +8.915699915e-01f, -5.838134704e-02f }, + { -8.285994652e-03f, +1.762626848e-01f, +8.917972344e-01f, -5.836711927e-02f }, + { -8.268713090e-03f, +1.760003983e-01f, +8.920242725e-01f, -5.835280610e-02f }, + { -8.251451871e-03f, +1.757382524e-01f, +8.922511057e-01f, -5.833840746e-02f }, + { -8.234210994e-03f, +1.754762472e-01f, +8.924777339e-01f, -5.832392325e-02f }, + { -8.216990455e-03f, +1.752143827e-01f, +8.927041569e-01f, -5.830935339e-02f }, + { -8.199790252e-03f, +1.749526590e-01f, +8.929303746e-01f, -5.829469780e-02f }, + { -8.182610382e-03f, +1.746910762e-01f, +8.931563868e-01f, -5.827995640e-02f }, + { -8.165450843e-03f, +1.744296343e-01f, +8.933821934e-01f, -5.826512910e-02f }, + { -8.148311631e-03f, +1.741683333e-01f, +8.936077942e-01f, -5.825021582e-02f }, + { -8.131192745e-03f, +1.739071734e-01f, +8.938331892e-01f, -5.823521647e-02f }, + { -8.114094182e-03f, +1.736461547e-01f, +8.940583782e-01f, -5.822013097e-02f }, + { -8.097015938e-03f, +1.733852771e-01f, +8.942833610e-01f, -5.820495924e-02f }, + { -8.079958012e-03f, +1.731245407e-01f, +8.945081375e-01f, -5.818970119e-02f }, + { -8.062920399e-03f, +1.728639457e-01f, +8.947327076e-01f, -5.817435673e-02f }, + { -8.045903098e-03f, +1.726034920e-01f, +8.949570711e-01f, -5.815892580e-02f }, + { -8.028906105e-03f, +1.723431797e-01f, +8.951812279e-01f, -5.814340830e-02f }, + { -8.011929418e-03f, +1.720830089e-01f, +8.954051779e-01f, -5.812780414e-02f }, + { -7.994973033e-03f, +1.718229797e-01f, +8.956289209e-01f, -5.811211325e-02f }, + { -7.978036948e-03f, +1.715630920e-01f, +8.958524568e-01f, -5.809633554e-02f }, + { -7.961121159e-03f, +1.713033461e-01f, +8.960757854e-01f, -5.808047093e-02f }, + { -7.944225664e-03f, +1.710437419e-01f, +8.962989066e-01f, -5.806451933e-02f }, + { -7.927350459e-03f, +1.707842794e-01f, +8.965218203e-01f, -5.804848066e-02f }, + { -7.910495542e-03f, +1.705249588e-01f, +8.967445263e-01f, -5.803235484e-02f }, + { -7.893660909e-03f, +1.702657802e-01f, +8.969670245e-01f, -5.801614178e-02f }, + { -7.876846558e-03f, +1.700067435e-01f, +8.971893148e-01f, -5.799984140e-02f }, + { -7.860052484e-03f, +1.697478489e-01f, +8.974113969e-01f, -5.798345361e-02f }, + { -7.843278685e-03f, +1.694890963e-01f, +8.976332709e-01f, -5.796697834e-02f }, + { -7.826525157e-03f, +1.692304860e-01f, +8.978549365e-01f, -5.795041550e-02f }, + { -7.809791898e-03f, +1.689720178e-01f, +8.980763937e-01f, -5.793376500e-02f }, + { -7.793078904e-03f, +1.687136919e-01f, +8.982976422e-01f, -5.791702676e-02f }, + { -7.776386171e-03f, +1.684555084e-01f, +8.985186819e-01f, -5.790020070e-02f }, + { -7.759713697e-03f, +1.681974672e-01f, +8.987395128e-01f, -5.788328673e-02f }, + { -7.743061477e-03f, +1.679395686e-01f, +8.989601346e-01f, -5.786628478e-02f }, + { -7.726429509e-03f, +1.676818124e-01f, +8.991805472e-01f, -5.784919475e-02f }, + { -7.709817790e-03f, +1.674241988e-01f, +8.994007506e-01f, -5.783201657e-02f }, + { -7.693226314e-03f, +1.671667279e-01f, +8.996207445e-01f, -5.781475014e-02f }, + { -7.676655080e-03f, +1.669093997e-01f, +8.998405288e-01f, -5.779739540e-02f }, + { -7.660104084e-03f, +1.666522142e-01f, +9.000601034e-01f, -5.777995224e-02f }, + { -7.643573321e-03f, +1.663951716e-01f, +9.002794682e-01f, -5.776242060e-02f }, + { -7.627062789e-03f, +1.661382718e-01f, +9.004986230e-01f, -5.774480038e-02f }, + { -7.610572484e-03f, +1.658815150e-01f, +9.007175676e-01f, -5.772709151e-02f }, + { -7.594102403e-03f, +1.656249011e-01f, +9.009363021e-01f, -5.770929389e-02f }, + { -7.577652540e-03f, +1.653684303e-01f, +9.011548261e-01f, -5.769140745e-02f }, + { -7.561222894e-03f, +1.651121027e-01f, +9.013731396e-01f, -5.767343210e-02f }, + { -7.544813460e-03f, +1.648559182e-01f, +9.015912425e-01f, -5.765536777e-02f }, + { -7.528424234e-03f, +1.645998769e-01f, +9.018091345e-01f, -5.763721435e-02f }, + { -7.512055213e-03f, +1.643439789e-01f, +9.020268157e-01f, -5.761897178e-02f }, + { -7.495706392e-03f, +1.640882243e-01f, +9.022442858e-01f, -5.760063997e-02f }, + { -7.479377769e-03f, +1.638326131e-01f, +9.024615447e-01f, -5.758221883e-02f }, + { -7.463069339e-03f, +1.635771453e-01f, +9.026785922e-01f, -5.756370829e-02f }, + { -7.446781098e-03f, +1.633218211e-01f, +9.028954283e-01f, -5.754510825e-02f }, + { -7.430513042e-03f, +1.630666404e-01f, +9.031120528e-01f, -5.752641864e-02f }, + { -7.414265167e-03f, +1.628116034e-01f, +9.033284656e-01f, -5.750763937e-02f }, + { -7.398037471e-03f, +1.625567100e-01f, +9.035446666e-01f, -5.748877036e-02f }, + { -7.381829947e-03f, +1.623019604e-01f, +9.037606555e-01f, -5.746981153e-02f }, + { -7.365642593e-03f, +1.620473546e-01f, +9.039764323e-01f, -5.745076279e-02f }, + { -7.349475404e-03f, +1.617928927e-01f, +9.041919969e-01f, -5.743162405e-02f }, + { -7.333328376e-03f, +1.615385747e-01f, +9.044073490e-01f, -5.741239524e-02f }, + { -7.317201506e-03f, +1.612844007e-01f, +9.046224887e-01f, -5.739307627e-02f }, + { -7.301094788e-03f, +1.610303707e-01f, +9.048374156e-01f, -5.737366706e-02f }, + { -7.285008220e-03f, +1.607764848e-01f, +9.050521298e-01f, -5.735416753e-02f }, + { -7.268941796e-03f, +1.605227430e-01f, +9.052666311e-01f, -5.733457759e-02f }, + { -7.252895512e-03f, +1.602691455e-01f, +9.054809193e-01f, -5.731489716e-02f }, + { -7.236869364e-03f, +1.600156922e-01f, +9.056949943e-01f, -5.729512615e-02f }, + { -7.220863348e-03f, +1.597623832e-01f, +9.059088560e-01f, -5.727526448e-02f }, + { -7.204877460e-03f, +1.595092186e-01f, +9.061225043e-01f, -5.725531208e-02f }, + { -7.188911695e-03f, +1.592561984e-01f, +9.063359389e-01f, -5.723526885e-02f }, + { -7.172966049e-03f, +1.590033227e-01f, +9.065491599e-01f, -5.721513471e-02f }, + { -7.157040517e-03f, +1.587505915e-01f, +9.067621670e-01f, -5.719490958e-02f }, + { -7.141135096e-03f, +1.584980049e-01f, +9.069749601e-01f, -5.717459338e-02f }, + { -7.125249780e-03f, +1.582455630e-01f, +9.071875391e-01f, -5.715418602e-02f }, + { -7.109384565e-03f, +1.579932657e-01f, +9.073999039e-01f, -5.713368743e-02f }, + { -7.093539446e-03f, +1.577411133e-01f, +9.076120543e-01f, -5.711309750e-02f }, + { -7.077714420e-03f, +1.574891056e-01f, +9.078239902e-01f, -5.709241618e-02f }, + { -7.061909482e-03f, +1.572372428e-01f, +9.080357115e-01f, -5.707164336e-02f }, + { -7.046124626e-03f, +1.569855249e-01f, +9.082472180e-01f, -5.705077897e-02f }, + { -7.030359849e-03f, +1.567339520e-01f, +9.084585096e-01f, -5.702982292e-02f }, + { -7.014615145e-03f, +1.564825241e-01f, +9.086695861e-01f, -5.700877514e-02f }, + { -6.998890510e-03f, +1.562312413e-01f, +9.088804476e-01f, -5.698763554e-02f }, + { -6.983185940e-03f, +1.559801037e-01f, +9.090910937e-01f, -5.696640402e-02f }, + { -6.967501430e-03f, +1.557291112e-01f, +9.093015244e-01f, -5.694508053e-02f }, + { -6.951836974e-03f, +1.554782640e-01f, +9.095117396e-01f, -5.692366496e-02f }, + { -6.936192569e-03f, +1.552275620e-01f, +9.097217391e-01f, -5.690215723e-02f }, + { -6.920568209e-03f, +1.549770055e-01f, +9.099315228e-01f, -5.688055727e-02f }, + { -6.904963889e-03f, +1.547265943e-01f, +9.101410905e-01f, -5.685886499e-02f }, + { -6.889379605e-03f, +1.544763286e-01f, +9.103504422e-01f, -5.683708031e-02f }, + { -6.873815352e-03f, +1.542262084e-01f, +9.105595777e-01f, -5.681520314e-02f }, + { -6.858271125e-03f, +1.539762337e-01f, +9.107684969e-01f, -5.679323340e-02f }, + { -6.842746919e-03f, +1.537264047e-01f, +9.109771996e-01f, -5.677117101e-02f }, + { -6.827242728e-03f, +1.534767213e-01f, +9.111856858e-01f, -5.674901589e-02f }, + { -6.811758549e-03f, +1.532271837e-01f, +9.113939552e-01f, -5.672676795e-02f }, + { -6.796294376e-03f, +1.529777918e-01f, +9.116020078e-01f, -5.670442710e-02f }, + { -6.780850204e-03f, +1.527285458e-01f, +9.118098434e-01f, -5.668199328e-02f }, + { -6.765426027e-03f, +1.524794457e-01f, +9.120174619e-01f, -5.665946638e-02f }, + { -6.750021842e-03f, +1.522304914e-01f, +9.122248632e-01f, -5.663684634e-02f }, + { -6.734637642e-03f, +1.519816832e-01f, +9.124320471e-01f, -5.661413307e-02f }, + { -6.719273423e-03f, +1.517330210e-01f, +9.126390136e-01f, -5.659132648e-02f }, + { -6.703929179e-03f, +1.514845048e-01f, +9.128457625e-01f, -5.656842649e-02f }, + { -6.688604905e-03f, +1.512361348e-01f, +9.130522936e-01f, -5.654543302e-02f }, + { -6.673300597e-03f, +1.509879110e-01f, +9.132586068e-01f, -5.652234599e-02f }, + { -6.658016248e-03f, +1.507398335e-01f, +9.134647021e-01f, -5.649916531e-02f }, + { -6.642751853e-03f, +1.504919022e-01f, +9.136705792e-01f, -5.647589090e-02f }, + { -6.627507408e-03f, +1.502441173e-01f, +9.138762381e-01f, -5.645252268e-02f }, + { -6.612282907e-03f, +1.499964787e-01f, +9.140816786e-01f, -5.642906057e-02f }, + { -6.597078344e-03f, +1.497489866e-01f, +9.142869006e-01f, -5.640550448e-02f }, + { -6.581893714e-03f, +1.495016410e-01f, +9.144919040e-01f, -5.638185433e-02f }, + { -6.566729012e-03f, +1.492544420e-01f, +9.146966886e-01f, -5.635811004e-02f }, + { -6.551584232e-03f, +1.490073895e-01f, +9.149012543e-01f, -5.633427152e-02f }, + { -6.536459369e-03f, +1.487604837e-01f, +9.151056011e-01f, -5.631033869e-02f }, + { -6.521354417e-03f, +1.485137245e-01f, +9.153097287e-01f, -5.628631147e-02f }, + { -6.506269371e-03f, +1.482671122e-01f, +9.155136370e-01f, -5.626218978e-02f }, + { -6.491204225e-03f, +1.480206466e-01f, +9.157173259e-01f, -5.623797353e-02f }, + { -6.476158974e-03f, +1.477743278e-01f, +9.159207954e-01f, -5.621366265e-02f }, + { -6.461133612e-03f, +1.475281560e-01f, +9.161240451e-01f, -5.618925704e-02f }, + { -6.446128134e-03f, +1.472821311e-01f, +9.163270752e-01f, -5.616475663e-02f }, + { -6.431142534e-03f, +1.470362531e-01f, +9.165298853e-01f, -5.614016133e-02f }, + { -6.416176806e-03f, +1.467905223e-01f, +9.167324754e-01f, -5.611547107e-02f }, + { -6.401230944e-03f, +1.465449385e-01f, +9.169348454e-01f, -5.609068575e-02f }, + { -6.386304943e-03f, +1.462995018e-01f, +9.171369950e-01f, -5.606580530e-02f }, + { -6.371398797e-03f, +1.460542124e-01f, +9.173389243e-01f, -5.604082963e-02f }, + { -6.356512501e-03f, +1.458090702e-01f, +9.175406331e-01f, -5.601575866e-02f }, + { -6.341646048e-03f, +1.455640752e-01f, +9.177421213e-01f, -5.599059231e-02f }, + { -6.326799433e-03f, +1.453192276e-01f, +9.179433886e-01f, -5.596533050e-02f }, + { -6.311972650e-03f, +1.450745274e-01f, +9.181444351e-01f, -5.593997314e-02f }, + { -6.297165693e-03f, +1.448299746e-01f, +9.183452606e-01f, -5.591452015e-02f }, + { -6.282378556e-03f, +1.445855693e-01f, +9.185458649e-01f, -5.588897145e-02f }, + { -6.267611233e-03f, +1.443413115e-01f, +9.187462479e-01f, -5.586332696e-02f }, + { -6.252863718e-03f, +1.440972013e-01f, +9.189464096e-01f, -5.583758659e-02f }, + { -6.238136006e-03f, +1.438532387e-01f, +9.191463497e-01f, -5.581175026e-02f }, + { -6.223428090e-03f, +1.436094238e-01f, +9.193460682e-01f, -5.578581789e-02f }, + { -6.208739964e-03f, +1.433657566e-01f, +9.195455649e-01f, -5.575978940e-02f }, + { -6.194071622e-03f, +1.431222371e-01f, +9.197448398e-01f, -5.573366470e-02f }, + { -6.179423059e-03f, +1.428788655e-01f, +9.199438926e-01f, -5.570744371e-02f }, + { -6.164794268e-03f, +1.426356417e-01f, +9.201427233e-01f, -5.568112636e-02f }, + { -6.150185242e-03f, +1.423925658e-01f, +9.203413317e-01f, -5.565471255e-02f }, + { -6.135595977e-03f, +1.421496379e-01f, +9.205397178e-01f, -5.562820221e-02f }, + { -6.121026465e-03f, +1.419068580e-01f, +9.207378813e-01f, -5.560159525e-02f }, + { -6.106476701e-03f, +1.416642261e-01f, +9.209358223e-01f, -5.557489159e-02f }, + { -6.091946678e-03f, +1.414217423e-01f, +9.211335405e-01f, -5.554809115e-02f }, + { -6.077436389e-03f, +1.411794066e-01f, +9.213310358e-01f, -5.552119385e-02f }, + { -6.062945830e-03f, +1.409372192e-01f, +9.215283081e-01f, -5.549419960e-02f }, + { -6.048474993e-03f, +1.406951799e-01f, +9.217253573e-01f, -5.546710832e-02f }, + { -6.034023872e-03f, +1.404532889e-01f, +9.219221832e-01f, -5.543991994e-02f }, + { -6.019592461e-03f, +1.402115463e-01f, +9.221187858e-01f, -5.541263436e-02f }, + { -6.005180754e-03f, +1.399699520e-01f, +9.223151649e-01f, -5.538525151e-02f }, + { -5.990788743e-03f, +1.397285061e-01f, +9.225113204e-01f, -5.535777130e-02f }, + { -5.976416423e-03f, +1.394872087e-01f, +9.227072522e-01f, -5.533019365e-02f }, + { -5.962063788e-03f, +1.392460598e-01f, +9.229029601e-01f, -5.530251848e-02f }, + { -5.947730830e-03f, +1.390050594e-01f, +9.230984441e-01f, -5.527474572e-02f }, + { -5.933417543e-03f, +1.387642076e-01f, +9.232937039e-01f, -5.524687526e-02f }, + { -5.919123921e-03f, +1.385235045e-01f, +9.234887396e-01f, -5.521890704e-02f }, + { -5.904849957e-03f, +1.382829500e-01f, +9.236835509e-01f, -5.519084097e-02f }, + { -5.890595645e-03f, +1.380425443e-01f, +9.238781378e-01f, -5.516267698e-02f }, + { -5.876360977e-03f, +1.378022873e-01f, +9.240725001e-01f, -5.513441497e-02f }, + { -5.862145949e-03f, +1.375621792e-01f, +9.242666377e-01f, -5.510605486e-02f }, + { -5.847950552e-03f, +1.373222199e-01f, +9.244605504e-01f, -5.507759658e-02f }, + { -5.833774780e-03f, +1.370824095e-01f, +9.246542383e-01f, -5.504904005e-02f }, + { -5.819618626e-03f, +1.368427480e-01f, +9.248477010e-01f, -5.502038517e-02f }, + { -5.805482085e-03f, +1.366032356e-01f, +9.250409386e-01f, -5.499163187e-02f }, + { -5.791365148e-03f, +1.363638722e-01f, +9.252339509e-01f, -5.496278007e-02f }, + { -5.777267810e-03f, +1.361246578e-01f, +9.254267378e-01f, -5.493382968e-02f }, + { -5.763190063e-03f, +1.358855926e-01f, +9.256192991e-01f, -5.490478063e-02f }, + { -5.749131901e-03f, +1.356466765e-01f, +9.258116348e-01f, -5.487563282e-02f }, + { -5.735093317e-03f, +1.354079097e-01f, +9.260037447e-01f, -5.484638619e-02f }, + { -5.721074303e-03f, +1.351692920e-01f, +9.261956287e-01f, -5.481704064e-02f }, + { -5.707074854e-03f, +1.349308237e-01f, +9.263872867e-01f, -5.478759611e-02f }, + { -5.693094963e-03f, +1.346925048e-01f, +9.265787186e-01f, -5.475805249e-02f }, + { -5.679134621e-03f, +1.344543351e-01f, +9.267699242e-01f, -5.472840972e-02f }, + { -5.665193823e-03f, +1.342163150e-01f, +9.269609034e-01f, -5.469866771e-02f }, + { -5.651272561e-03f, +1.339784442e-01f, +9.271516562e-01f, -5.466882638e-02f }, + { -5.637370829e-03f, +1.337407230e-01f, +9.273421823e-01f, -5.463888565e-02f }, + { -5.623488619e-03f, +1.335031514e-01f, +9.275324817e-01f, -5.460884543e-02f }, + { -5.609625925e-03f, +1.332657293e-01f, +9.277225543e-01f, -5.457870565e-02f }, + { -5.595782739e-03f, +1.330284568e-01f, +9.279123998e-01f, -5.454846622e-02f }, + { -5.581959054e-03f, +1.327913341e-01f, +9.281020184e-01f, -5.451812706e-02f }, + { -5.568154863e-03f, +1.325543610e-01f, +9.282914097e-01f, -5.448768810e-02f }, + { -5.554370159e-03f, +1.323175377e-01f, +9.284805736e-01f, -5.445714924e-02f }, + { -5.540604935e-03f, +1.320808642e-01f, +9.286695102e-01f, -5.442651041e-02f }, + { -5.526859184e-03f, +1.318443405e-01f, +9.288582192e-01f, -5.439577153e-02f }, + { -5.513132898e-03f, +1.316079667e-01f, +9.290467005e-01f, -5.436493251e-02f }, + { -5.499426070e-03f, +1.313717428e-01f, +9.292349540e-01f, -5.433399327e-02f }, + { -5.485738694e-03f, +1.311356689e-01f, +9.294229797e-01f, -5.430295374e-02f }, + { -5.472070761e-03f, +1.308997450e-01f, +9.296107773e-01f, -5.427181382e-02f }, + { -5.458422264e-03f, +1.306639711e-01f, +9.297983467e-01f, -5.424057345e-02f }, + { -5.444793197e-03f, +1.304283474e-01f, +9.299856879e-01f, -5.420923253e-02f }, + { -5.431183551e-03f, +1.301928737e-01f, +9.301728008e-01f, -5.417779099e-02f }, + { -5.417593320e-03f, +1.299575502e-01f, +9.303596851e-01f, -5.414624875e-02f }, + { -5.404022496e-03f, +1.297223769e-01f, +9.305463408e-01f, -5.411460571e-02f }, + { -5.390471071e-03f, +1.294873538e-01f, +9.307327679e-01f, -5.408286181e-02f }, + { -5.376939039e-03f, +1.292524811e-01f, +9.309189660e-01f, -5.405101697e-02f }, + { -5.363426391e-03f, +1.290177586e-01f, +9.311049353e-01f, -5.401907109e-02f }, + { -5.349933121e-03f, +1.287831865e-01f, +9.312906754e-01f, -5.398702410e-02f }, + { -5.336459220e-03f, +1.285487648e-01f, +9.314761864e-01f, -5.395487592e-02f }, + { -5.323004682e-03f, +1.283144936e-01f, +9.316614680e-01f, -5.392262647e-02f }, + { -5.309569498e-03f, +1.280803728e-01f, +9.318465203e-01f, -5.389027566e-02f }, + { -5.296153661e-03f, +1.278464026e-01f, +9.320313430e-01f, -5.385782342e-02f }, + { -5.282757164e-03f, +1.276125829e-01f, +9.322159361e-01f, -5.382526966e-02f }, + { -5.269379998e-03f, +1.273789138e-01f, +9.324002994e-01f, -5.379261431e-02f }, + { -5.256022157e-03f, +1.271453953e-01f, +9.325844328e-01f, -5.375985728e-02f }, + { -5.242683633e-03f, +1.269120275e-01f, +9.327683363e-01f, -5.372699848e-02f }, + { -5.229364417e-03f, +1.266788105e-01f, +9.329520096e-01f, -5.369403785e-02f }, + { -5.216064503e-03f, +1.264457441e-01f, +9.331354527e-01f, -5.366097530e-02f }, + { -5.202783882e-03f, +1.262128286e-01f, +9.333186655e-01f, -5.362781074e-02f }, + { -5.189522547e-03f, +1.259800639e-01f, +9.335016478e-01f, -5.359454410e-02f }, + { -5.176280490e-03f, +1.257474501e-01f, +9.336843996e-01f, -5.356117530e-02f }, + { -5.163057703e-03f, +1.255149871e-01f, +9.338669207e-01f, -5.352770425e-02f }, + { -5.149854178e-03f, +1.252826751e-01f, +9.340492110e-01f, -5.349413088e-02f }, + { -5.136669908e-03f, +1.250505141e-01f, +9.342312704e-01f, -5.346045510e-02f }, + { -5.123504885e-03f, +1.248185041e-01f, +9.344130987e-01f, -5.342667683e-02f }, + { -5.110359100e-03f, +1.245866451e-01f, +9.345946960e-01f, -5.339279600e-02f }, + { -5.097232546e-03f, +1.243549372e-01f, +9.347760620e-01f, -5.335881251e-02f }, + { -5.084125216e-03f, +1.241233805e-01f, +9.349571966e-01f, -5.332472630e-02f }, + { -5.071037100e-03f, +1.238919749e-01f, +9.351380998e-01f, -5.329053728e-02f }, + { -5.057968191e-03f, +1.236607205e-01f, +9.353187714e-01f, -5.325624537e-02f }, + { -5.044918481e-03f, +1.234296174e-01f, +9.354992113e-01f, -5.322185049e-02f }, + { -5.031887963e-03f, +1.231986655e-01f, +9.356794194e-01f, -5.318735255e-02f }, + { -5.018876627e-03f, +1.229678649e-01f, +9.358593955e-01f, -5.315275148e-02f }, + { -5.005884466e-03f, +1.227372157e-01f, +9.360391397e-01f, -5.311804720e-02f }, + { -4.992911472e-03f, +1.225067179e-01f, +9.362186517e-01f, -5.308323963e-02f }, + { -4.979957637e-03f, +1.222763714e-01f, +9.363979314e-01f, -5.304832868e-02f }, + { -4.967022953e-03f, +1.220461765e-01f, +9.365769788e-01f, -5.301331428e-02f }, + { -4.954107411e-03f, +1.218161330e-01f, +9.367557936e-01f, -5.297819635e-02f }, + { -4.941211003e-03f, +1.215862410e-01f, +9.369343759e-01f, -5.294297479e-02f }, + { -4.928333721e-03f, +1.213565006e-01f, +9.371127255e-01f, -5.290764955e-02f }, + { -4.915475558e-03f, +1.211269118e-01f, +9.372908423e-01f, -5.287222052e-02f }, + { -4.902636504e-03f, +1.208974746e-01f, +9.374687261e-01f, -5.283668764e-02f }, + { -4.889816551e-03f, +1.206681891e-01f, +9.376463769e-01f, -5.280105083e-02f }, + { -4.877015692e-03f, +1.204390553e-01f, +9.378237946e-01f, -5.276531000e-02f }, + { -4.864233917e-03f, +1.202100732e-01f, +9.380009790e-01f, -5.272946506e-02f }, + { -4.851471219e-03f, +1.199812429e-01f, +9.381779301e-01f, -5.269351596e-02f }, + { -4.838727590e-03f, +1.197525644e-01f, +9.383546476e-01f, -5.265746259e-02f }, + { -4.826003020e-03f, +1.195240378e-01f, +9.385311316e-01f, -5.262130489e-02f }, + { -4.813297501e-03f, +1.192956630e-01f, +9.387073818e-01f, -5.258504277e-02f }, + { -4.800611026e-03f, +1.190674401e-01f, +9.388833983e-01f, -5.254867615e-02f }, + { -4.787943585e-03f, +1.188393692e-01f, +9.390591808e-01f, -5.251220495e-02f }, + { -4.775295171e-03f, +1.186114502e-01f, +9.392347294e-01f, -5.247562909e-02f }, + { -4.762665774e-03f, +1.183836832e-01f, +9.394100437e-01f, -5.243894849e-02f }, + { -4.750055387e-03f, +1.181560683e-01f, +9.395851238e-01f, -5.240216308e-02f }, + { -4.737464000e-03f, +1.179286055e-01f, +9.397599696e-01f, -5.236527277e-02f }, + { -4.724891606e-03f, +1.177012947e-01f, +9.399345809e-01f, -5.232827748e-02f }, + { -4.712338195e-03f, +1.174741362e-01f, +9.401089576e-01f, -5.229117713e-02f }, + { -4.699803759e-03f, +1.172471298e-01f, +9.402830997e-01f, -5.225397164e-02f }, + { -4.687288290e-03f, +1.170202755e-01f, +9.404570069e-01f, -5.221666093e-02f }, + { -4.674791779e-03f, +1.167935736e-01f, +9.406306792e-01f, -5.217924493e-02f }, + { -4.662314217e-03f, +1.165670239e-01f, +9.408041166e-01f, -5.214172354e-02f }, + { -4.649855595e-03f, +1.163406265e-01f, +9.409773188e-01f, -5.210409670e-02f }, + { -4.637415906e-03f, +1.161143815e-01f, +9.411502858e-01f, -5.206636432e-02f }, + { -4.624995140e-03f, +1.158882888e-01f, +9.413230174e-01f, -5.202852632e-02f }, + { -4.612593288e-03f, +1.156623486e-01f, +9.414955136e-01f, -5.199058263e-02f }, + { -4.600210342e-03f, +1.154365607e-01f, +9.416677743e-01f, -5.195253316e-02f }, + { -4.587846293e-03f, +1.152109254e-01f, +9.418397993e-01f, -5.191437783e-02f }, + { -4.575501133e-03f, +1.149854425e-01f, +9.420115885e-01f, -5.187611657e-02f }, + { -4.563174852e-03f, +1.147601122e-01f, +9.421831418e-01f, -5.183774929e-02f }, + { -4.550867441e-03f, +1.145349345e-01f, +9.423544592e-01f, -5.179927591e-02f }, + { -4.538578892e-03f, +1.143099093e-01f, +9.425255405e-01f, -5.176069636e-02f }, + { -4.526309197e-03f, +1.140850368e-01f, +9.426963856e-01f, -5.172201055e-02f }, + { -4.514058345e-03f, +1.138603169e-01f, +9.428669944e-01f, -5.168321841e-02f }, + { -4.501826329e-03f, +1.136357497e-01f, +9.430373667e-01f, -5.164431986e-02f }, + { -4.489613138e-03f, +1.134113352e-01f, +9.432075026e-01f, -5.160531481e-02f }, + { -4.477418765e-03f, +1.131870735e-01f, +9.433774019e-01f, -5.156620319e-02f }, + { -4.465243201e-03f, +1.129629646e-01f, +9.435470644e-01f, -5.152698491e-02f }, + { -4.453086436e-03f, +1.127390085e-01f, +9.437164901e-01f, -5.148765991e-02f }, + { -4.440948461e-03f, +1.125152052e-01f, +9.438856788e-01f, -5.144822810e-02f }, + { -4.428829267e-03f, +1.122915548e-01f, +9.440546305e-01f, -5.140868939e-02f }, + { -4.416728846e-03f, +1.120680573e-01f, +9.442233450e-01f, -5.136904371e-02f }, + { -4.404647188e-03f, +1.118447128e-01f, +9.443918223e-01f, -5.132929099e-02f }, + { -4.392584284e-03f, +1.116215212e-01f, +9.445600623e-01f, -5.128943114e-02f }, + { -4.380540125e-03f, +1.113984826e-01f, +9.447280647e-01f, -5.124946408e-02f }, + { -4.368514702e-03f, +1.111755970e-01f, +9.448958296e-01f, -5.120938973e-02f }, + { -4.356508006e-03f, +1.109528645e-01f, +9.450633568e-01f, -5.116920802e-02f }, + { -4.344520028e-03f, +1.107302850e-01f, +9.452306462e-01f, -5.112891887e-02f }, + { -4.332550758e-03f, +1.105078587e-01f, +9.453976978e-01f, -5.108852219e-02f }, + { -4.320600187e-03f, +1.102855855e-01f, +9.455645113e-01f, -5.104801790e-02f }, + { -4.308668306e-03f, +1.100634655e-01f, +9.457310868e-01f, -5.100740594e-02f }, + { -4.296755107e-03f, +1.098414987e-01f, +9.458974241e-01f, -5.096668621e-02f }, + { -4.284860578e-03f, +1.096196851e-01f, +9.460635230e-01f, -5.092585865e-02f }, + { -4.272984712e-03f, +1.093980247e-01f, +9.462293836e-01f, -5.088492316e-02f }, + { -4.261127499e-03f, +1.091765177e-01f, +9.463950056e-01f, -5.084387968e-02f }, + { -4.249288929e-03f, +1.089551640e-01f, +9.465603890e-01f, -5.080272812e-02f }, + { -4.237468994e-03f, +1.087339636e-01f, +9.467255337e-01f, -5.076146841e-02f }, + { -4.225667684e-03f, +1.085129166e-01f, +9.468904396e-01f, -5.072010046e-02f }, + { -4.213884989e-03f, +1.082920229e-01f, +9.470551065e-01f, -5.067862420e-02f }, + { -4.202120901e-03f, +1.080712828e-01f, +9.472195345e-01f, -5.063703954e-02f }, + { -4.190375409e-03f, +1.078506960e-01f, +9.473837233e-01f, -5.059534642e-02f }, + { -4.178648505e-03f, +1.076302628e-01f, +9.475476728e-01f, -5.055354474e-02f }, + { -4.166940178e-03f, +1.074099830e-01f, +9.477113830e-01f, -5.051163444e-02f }, + { -4.155250420e-03f, +1.071898568e-01f, +9.478748538e-01f, -5.046961543e-02f }, + { -4.143579220e-03f, +1.069698842e-01f, +9.480380851e-01f, -5.042748764e-02f }, + { -4.131926571e-03f, +1.067500652e-01f, +9.482010767e-01f, -5.038525098e-02f }, + { -4.120292461e-03f, +1.065303997e-01f, +9.483638285e-01f, -5.034290538e-02f }, + { -4.108676881e-03f, +1.063108880e-01f, +9.485263405e-01f, -5.030045076e-02f }, + { -4.097079822e-03f, +1.060915299e-01f, +9.486886126e-01f, -5.025788704e-02f }, + { -4.085501274e-03f, +1.058723254e-01f, +9.488506446e-01f, -5.021521414e-02f }, + { -4.073941228e-03f, +1.056532748e-01f, +9.490124364e-01f, -5.017243198e-02f }, + { -4.062399673e-03f, +1.054343779e-01f, +9.491739880e-01f, -5.012954049e-02f }, + { -4.050876601e-03f, +1.052156347e-01f, +9.493352993e-01f, -5.008653959e-02f }, + { -4.039372002e-03f, +1.049970454e-01f, +9.494963700e-01f, -5.004342920e-02f }, + { -4.027885865e-03f, +1.047786099e-01f, +9.496572003e-01f, -5.000020923e-02f }, + { -4.016418182e-03f, +1.045603282e-01f, +9.498177898e-01f, -4.995687962e-02f }, + { -4.004968942e-03f, +1.043422005e-01f, +9.499781386e-01f, -4.991344028e-02f }, + { -3.993538136e-03f, +1.041242266e-01f, +9.501382466e-01f, -4.986989114e-02f }, + { -3.982125754e-03f, +1.039064067e-01f, +9.502981136e-01f, -4.982623211e-02f }, + { -3.970731786e-03f, +1.036887408e-01f, +9.504577395e-01f, -4.978246313e-02f }, + { -3.959356223e-03f, +1.034712288e-01f, +9.506171243e-01f, -4.973858410e-02f }, + { -3.947999054e-03f, +1.032538708e-01f, +9.507762678e-01f, -4.969459496e-02f }, + { -3.936660271e-03f, +1.030366669e-01f, +9.509351700e-01f, -4.965049562e-02f }, + { -3.925339862e-03f, +1.028196171e-01f, +9.510938306e-01f, -4.960628601e-02f }, + { -3.914037818e-03f, +1.026027213e-01f, +9.512522498e-01f, -4.956196605e-02f }, + { -3.902754129e-03f, +1.023859797e-01f, +9.514104273e-01f, -4.951753566e-02f }, + { -3.891488786e-03f, +1.021693921e-01f, +9.515683630e-01f, -4.947299476e-02f }, + { -3.880241778e-03f, +1.019529588e-01f, +9.517260568e-01f, -4.942834328e-02f }, + { -3.869013095e-03f, +1.017366796e-01f, +9.518835087e-01f, -4.938358114e-02f }, + { -3.857802728e-03f, +1.015205546e-01f, +9.520407186e-01f, -4.933870825e-02f }, + { -3.846610666e-03f, +1.013045839e-01f, +9.521976863e-01f, -4.929372455e-02f }, + { -3.835436900e-03f, +1.010887674e-01f, +9.523544118e-01f, -4.924862995e-02f }, + { -3.824281419e-03f, +1.008731053e-01f, +9.525108949e-01f, -4.920342438e-02f }, + { -3.813144214e-03f, +1.006575974e-01f, +9.526671355e-01f, -4.915810776e-02f }, + { -3.802025274e-03f, +1.004422438e-01f, +9.528231336e-01f, -4.911268001e-02f }, + { -3.790924590e-03f, +1.002270446e-01f, +9.529788891e-01f, -4.906714105e-02f }, + { -3.779842151e-03f, +1.000119998e-01f, +9.531344018e-01f, -4.902149080e-02f }, + { -3.768777946e-03f, +9.979710935e-02f, +9.532896717e-01f, -4.897572920e-02f }, + { -3.757731967e-03f, +9.958237334e-02f, +9.534446987e-01f, -4.892985616e-02f }, + { -3.746704203e-03f, +9.936779178e-02f, +9.535994826e-01f, -4.888387160e-02f }, + { -3.735694643e-03f, +9.915336469e-02f, +9.537540234e-01f, -4.883777544e-02f }, + { -3.724703278e-03f, +9.893909208e-02f, +9.539083209e-01f, -4.879156762e-02f }, + { -3.713730097e-03f, +9.872497399e-02f, +9.540623752e-01f, -4.874524804e-02f }, + { -3.702775091e-03f, +9.851101044e-02f, +9.542161860e-01f, -4.869881664e-02f }, + { -3.691838248e-03f, +9.829720144e-02f, +9.543697533e-01f, -4.865227334e-02f }, + { -3.680919559e-03f, +9.808354703e-02f, +9.545230770e-01f, -4.860561805e-02f }, + { -3.670019013e-03f, +9.787004721e-02f, +9.546761570e-01f, -4.855885071e-02f }, + { -3.659136601e-03f, +9.765670203e-02f, +9.548289931e-01f, -4.851197123e-02f }, + { -3.648272311e-03f, +9.744351149e-02f, +9.549815854e-01f, -4.846497954e-02f }, + { -3.637426133e-03f, +9.723047561e-02f, +9.551339337e-01f, -4.841787556e-02f }, + { -3.626598058e-03f, +9.701759443e-02f, +9.552860379e-01f, -4.837065921e-02f }, + { -3.615788075e-03f, +9.680486796e-02f, +9.554378979e-01f, -4.832333042e-02f }, + { -3.604996173e-03f, +9.659229622e-02f, +9.555895136e-01f, -4.827588911e-02f }, + { -3.594222342e-03f, +9.637987924e-02f, +9.557408849e-01f, -4.822833521e-02f }, + { -3.583466571e-03f, +9.616761703e-02f, +9.558920118e-01f, -4.818066862e-02f }, + { -3.572728851e-03f, +9.595550962e-02f, +9.560428941e-01f, -4.813288929e-02f }, + { -3.562009171e-03f, +9.574355703e-02f, +9.561935317e-01f, -4.808499713e-02f }, + { -3.551307520e-03f, +9.553175927e-02f, +9.563439245e-01f, -4.803699206e-02f }, + { -3.540623888e-03f, +9.532011637e-02f, +9.564940726e-01f, -4.798887401e-02f }, + { -3.529958264e-03f, +9.510862835e-02f, +9.566439756e-01f, -4.794064290e-02f }, + { -3.519310638e-03f, +9.489729524e-02f, +9.567936336e-01f, -4.789229866e-02f }, + { -3.508680999e-03f, +9.468611704e-02f, +9.569430465e-01f, -4.784384120e-02f }, + { -3.498069337e-03f, +9.447509378e-02f, +9.570922142e-01f, -4.779527045e-02f }, + { -3.487475641e-03f, +9.426422548e-02f, +9.572411365e-01f, -4.774658634e-02f }, + { -3.476899901e-03f, +9.405351217e-02f, +9.573898135e-01f, -4.769778879e-02f }, + { -3.466342106e-03f, +9.384295385e-02f, +9.575382449e-01f, -4.764887772e-02f }, + { -3.455802245e-03f, +9.363255055e-02f, +9.576864307e-01f, -4.759985305e-02f }, + { -3.445280308e-03f, +9.342230229e-02f, +9.578343708e-01f, -4.755071471e-02f }, + { -3.434776284e-03f, +9.321220909e-02f, +9.579820651e-01f, -4.750146263e-02f }, + { -3.424290163e-03f, +9.300227097e-02f, +9.581295136e-01f, -4.745209672e-02f }, + { -3.413821934e-03f, +9.279248795e-02f, +9.582767160e-01f, -4.740261690e-02f }, + { -3.403371585e-03f, +9.258286004e-02f, +9.584236724e-01f, -4.735302311e-02f }, + { -3.392939107e-03f, +9.237338726e-02f, +9.585703827e-01f, -4.730331527e-02f }, + { -3.382524489e-03f, +9.216406964e-02f, +9.587168467e-01f, -4.725349330e-02f }, + { -3.372127720e-03f, +9.195490720e-02f, +9.588630643e-01f, -4.720355712e-02f }, + { -3.361748789e-03f, +9.174589994e-02f, +9.590090355e-01f, -4.715350666e-02f }, + { -3.351387685e-03f, +9.153704790e-02f, +9.591547602e-01f, -4.710334184e-02f }, + { -3.341044398e-03f, +9.132835108e-02f, +9.593002383e-01f, -4.705306259e-02f }, + { -3.330718916e-03f, +9.111980950e-02f, +9.594454696e-01f, -4.700266883e-02f }, + { -3.320411230e-03f, +9.091142320e-02f, +9.595904542e-01f, -4.695216048e-02f }, + { -3.310121328e-03f, +9.070319217e-02f, +9.597351919e-01f, -4.690153746e-02f }, + { -3.299849199e-03f, +9.049511645e-02f, +9.598796825e-01f, -4.685079971e-02f }, + { -3.289594832e-03f, +9.028719604e-02f, +9.600239261e-01f, -4.679994715e-02f }, + { -3.279358217e-03f, +9.007943096e-02f, +9.601679226e-01f, -4.674897969e-02f }, + { -3.269139342e-03f, +8.987182124e-02f, +9.603116718e-01f, -4.669789727e-02f }, + { -3.258938197e-03f, +8.966436689e-02f, +9.604551736e-01f, -4.664669981e-02f }, + { -3.248754771e-03f, +8.945706793e-02f, +9.605984280e-01f, -4.659538723e-02f }, + { -3.238589053e-03f, +8.924992437e-02f, +9.607414349e-01f, -4.654395945e-02f }, + { -3.228441031e-03f, +8.904293624e-02f, +9.608841941e-01f, -4.649241641e-02f }, + { -3.218310696e-03f, +8.883610354e-02f, +9.610267057e-01f, -4.644075802e-02f }, + { -3.208198035e-03f, +8.862942629e-02f, +9.611689695e-01f, -4.638898421e-02f }, + { -3.198103037e-03f, +8.842290452e-02f, +9.613109853e-01f, -4.633709491e-02f }, + { -3.188025693e-03f, +8.821653824e-02f, +9.614527532e-01f, -4.628509003e-02f }, + { -3.177965990e-03f, +8.801032746e-02f, +9.615942731e-01f, -4.623296951e-02f }, + { -3.167923918e-03f, +8.780427220e-02f, +9.617355447e-01f, -4.618073326e-02f }, + { -3.157899465e-03f, +8.759837247e-02f, +9.618765682e-01f, -4.612838122e-02f }, + { -3.147892621e-03f, +8.739262830e-02f, +9.620173433e-01f, -4.607591330e-02f }, + { -3.137903374e-03f, +8.718703970e-02f, +9.621578700e-01f, -4.602332944e-02f }, + { -3.127931713e-03f, +8.698160668e-02f, +9.622981482e-01f, -4.597062955e-02f }, + { -3.117977628e-03f, +8.677632927e-02f, +9.624381778e-01f, -4.591781356e-02f }, + { -3.108041106e-03f, +8.657120747e-02f, +9.625779587e-01f, -4.586488140e-02f }, + { -3.098122137e-03f, +8.636624129e-02f, +9.627174908e-01f, -4.581183299e-02f }, + { -3.088220709e-03f, +8.616143077e-02f, +9.628567741e-01f, -4.575866826e-02f }, + { -3.078336812e-03f, +8.595677591e-02f, +9.629958084e-01f, -4.570538712e-02f }, + { -3.068470433e-03f, +8.575227672e-02f, +9.631345937e-01f, -4.565198951e-02f }, + { -3.058621563e-03f, +8.554793322e-02f, +9.632731298e-01f, -4.559847535e-02f }, + { -3.048790189e-03f, +8.534374543e-02f, +9.634114168e-01f, -4.554484457e-02f }, + { -3.038976300e-03f, +8.513971336e-02f, +9.635494545e-01f, -4.549109708e-02f }, + { -3.029179886e-03f, +8.493583703e-02f, +9.636872427e-01f, -4.543723283e-02f }, + { -3.019400934e-03f, +8.473211644e-02f, +9.638247816e-01f, -4.538325172e-02f }, + { -3.009639433e-03f, +8.452855162e-02f, +9.639620708e-01f, -4.532915369e-02f }, + { -2.999895373e-03f, +8.432514258e-02f, +9.640991104e-01f, -4.527493866e-02f }, + { -2.990168741e-03f, +8.412188933e-02f, +9.642359003e-01f, -4.522060655e-02f }, + { -2.980459527e-03f, +8.391879188e-02f, +9.643724404e-01f, -4.516615730e-02f }, + { -2.970767718e-03f, +8.371585026e-02f, +9.645087305e-01f, -4.511159083e-02f }, + { -2.961093304e-03f, +8.351306447e-02f, +9.646447707e-01f, -4.505690705e-02f }, + { -2.951436274e-03f, +8.331043452e-02f, +9.647805608e-01f, -4.500210591e-02f }, + { -2.941796615e-03f, +8.310796044e-02f, +9.649161008e-01f, -4.494718732e-02f }, + { -2.932174316e-03f, +8.290564223e-02f, +9.650513905e-01f, -4.489215120e-02f }, + { -2.922569366e-03f, +8.270347990e-02f, +9.651864298e-01f, -4.483699749e-02f }, + { -2.912981754e-03f, +8.250147348e-02f, +9.653212188e-01f, -4.478172612e-02f }, + { -2.903411467e-03f, +8.229962297e-02f, +9.654557573e-01f, -4.472633699e-02f }, + { -2.893858495e-03f, +8.209792838e-02f, +9.655900451e-01f, -4.467083005e-02f }, + { -2.884322825e-03f, +8.189638974e-02f, +9.657240824e-01f, -4.461520522e-02f }, + { -2.874804447e-03f, +8.169500704e-02f, +9.658578688e-01f, -4.455946242e-02f }, + { -2.865303349e-03f, +8.149378031e-02f, +9.659914044e-01f, -4.450360157e-02f }, + { -2.855819519e-03f, +8.129270955e-02f, +9.661246891e-01f, -4.444762262e-02f }, + { -2.846352946e-03f, +8.109179479e-02f, +9.662577228e-01f, -4.439152547e-02f }, + { -2.836903618e-03f, +8.089103602e-02f, +9.663905054e-01f, -4.433531006e-02f }, + { -2.827471523e-03f, +8.069043326e-02f, +9.665230369e-01f, -4.427897631e-02f }, + { -2.818056650e-03f, +8.048998653e-02f, +9.666553170e-01f, -4.422252415e-02f }, + { -2.808658988e-03f, +8.028969584e-02f, +9.667873459e-01f, -4.416595350e-02f }, + { -2.799278524e-03f, +8.008956119e-02f, +9.669191233e-01f, -4.410926430e-02f }, + { -2.789915247e-03f, +7.988958260e-02f, +9.670506492e-01f, -4.405245646e-02f }, + { -2.780569145e-03f, +7.968976008e-02f, +9.671819235e-01f, -4.399552991e-02f }, + { -2.771240206e-03f, +7.949009365e-02f, +9.673129462e-01f, -4.393848458e-02f }, + { -2.761928420e-03f, +7.929058330e-02f, +9.674437171e-01f, -4.388132040e-02f }, + { -2.752633774e-03f, +7.909122907e-02f, +9.675742361e-01f, -4.382403729e-02f }, + { -2.743356256e-03f, +7.889203094e-02f, +9.677045033e-01f, -4.376663518e-02f }, + { -2.734095855e-03f, +7.869298894e-02f, +9.678345184e-01f, -4.370911400e-02f }, + { -2.724852558e-03f, +7.849410308e-02f, +9.679642815e-01f, -4.365147366e-02f }, + { -2.715626355e-03f, +7.829537336e-02f, +9.680937924e-01f, -4.359371410e-02f }, + { -2.706417234e-03f, +7.809679980e-02f, +9.682230510e-01f, -4.353583525e-02f }, + { -2.697225181e-03f, +7.789838241e-02f, +9.683520574e-01f, -4.347783703e-02f }, + { -2.688050187e-03f, +7.770012120e-02f, +9.684808113e-01f, -4.341971936e-02f }, + { -2.678892238e-03f, +7.750201617e-02f, +9.686093127e-01f, -4.336148218e-02f }, + { -2.669751324e-03f, +7.730406734e-02f, +9.687375615e-01f, -4.330312541e-02f }, + { -2.660627431e-03f, +7.710627472e-02f, +9.688655578e-01f, -4.324464897e-02f }, + { -2.651520549e-03f, +7.690863832e-02f, +9.689933012e-01f, -4.318605280e-02f }, + { -2.642430666e-03f, +7.671115814e-02f, +9.691207919e-01f, -4.312733682e-02f }, + { -2.633357769e-03f, +7.651383420e-02f, +9.692480296e-01f, -4.306850096e-02f }, + { -2.624301846e-03f, +7.631666650e-02f, +9.693750144e-01f, -4.300954515e-02f }, + { -2.615262886e-03f, +7.611965506e-02f, +9.695017462e-01f, -4.295046931e-02f }, + { -2.606240877e-03f, +7.592279989e-02f, +9.696282248e-01f, -4.289127336e-02f }, + { -2.597235807e-03f, +7.572610098e-02f, +9.697544501e-01f, -4.283195724e-02f }, + { -2.588247664e-03f, +7.552955836e-02f, +9.698804222e-01f, -4.277252088e-02f }, + { -2.579276435e-03f, +7.533317203e-02f, +9.700061410e-01f, -4.271296420e-02f }, + { -2.570322110e-03f, +7.513694200e-02f, +9.701316062e-01f, -4.265328712e-02f }, + { -2.561384675e-03f, +7.494086827e-02f, +9.702568180e-01f, -4.259348958e-02f }, + { -2.552464119e-03f, +7.474495086e-02f, +9.703817761e-01f, -4.253357150e-02f }, + { -2.543560430e-03f, +7.454918978e-02f, +9.705064805e-01f, -4.247353281e-02f }, + { -2.534673595e-03f, +7.435358503e-02f, +9.706309312e-01f, -4.241337343e-02f }, + { -2.525803603e-03f, +7.415813662e-02f, +9.707551280e-01f, -4.235309331e-02f }, + { -2.516950442e-03f, +7.396284455e-02f, +9.708790709e-01f, -4.229269235e-02f }, + { -2.508114099e-03f, +7.376770885e-02f, +9.710027598e-01f, -4.223217049e-02f }, + { -2.499294563e-03f, +7.357272950e-02f, +9.711261947e-01f, -4.217152766e-02f }, + { -2.490491821e-03f, +7.337790653e-02f, +9.712493753e-01f, -4.211076378e-02f }, + { -2.481705861e-03f, +7.318323994e-02f, +9.713723017e-01f, -4.204987879e-02f }, + { -2.472936671e-03f, +7.298872973e-02f, +9.714949738e-01f, -4.198887261e-02f }, + { -2.464184239e-03f, +7.279437592e-02f, +9.716173916e-01f, -4.192774516e-02f }, + { -2.455448552e-03f, +7.260017851e-02f, +9.717395548e-01f, -4.186649638e-02f }, + { -2.446729599e-03f, +7.240613750e-02f, +9.718614635e-01f, -4.180512620e-02f }, + { -2.438027368e-03f, +7.221225291e-02f, +9.719831176e-01f, -4.174363453e-02f }, + { -2.429341845e-03f, +7.201852474e-02f, +9.721045170e-01f, -4.168202131e-02f }, + { -2.420673020e-03f, +7.182495300e-02f, +9.722256616e-01f, -4.162028648e-02f }, + { -2.412020878e-03f, +7.163153769e-02f, +9.723465513e-01f, -4.155842994e-02f }, + { -2.403385410e-03f, +7.143827882e-02f, +9.724671862e-01f, -4.149645164e-02f }, + { -2.394766601e-03f, +7.124517640e-02f, +9.725875660e-01f, -4.143435151e-02f }, + { -2.386164441e-03f, +7.105223044e-02f, +9.727076907e-01f, -4.137212946e-02f }, + { -2.377578915e-03f, +7.085944093e-02f, +9.728275603e-01f, -4.130978543e-02f }, + { -2.369010014e-03f, +7.066680788e-02f, +9.729471746e-01f, -4.124731934e-02f }, + { -2.360457723e-03f, +7.047433131e-02f, +9.730665337e-01f, -4.118473113e-02f }, + { -2.351922030e-03f, +7.028201121e-02f, +9.731856373e-01f, -4.112202073e-02f }, + { -2.343402924e-03f, +7.008984759e-02f, +9.733044855e-01f, -4.105918805e-02f }, + { -2.334900392e-03f, +6.989784046e-02f, +9.734230782e-01f, -4.099623304e-02f }, + { -2.326414422e-03f, +6.970598983e-02f, +9.735414153e-01f, -4.093315561e-02f }, + { -2.317945001e-03f, +6.951429569e-02f, +9.736594966e-01f, -4.086995570e-02f }, + { -2.309492116e-03f, +6.932275805e-02f, +9.737773222e-01f, -4.080663324e-02f }, + { -2.301055756e-03f, +6.913137692e-02f, +9.738948920e-01f, -4.074318815e-02f }, + { -2.292635908e-03f, +6.894015231e-02f, +9.740122059e-01f, -4.067962036e-02f }, + { -2.284232560e-03f, +6.874908421e-02f, +9.741292638e-01f, -4.061592981e-02f }, + { -2.275845698e-03f, +6.855817263e-02f, +9.742460656e-01f, -4.055211641e-02f }, + { -2.267475312e-03f, +6.836741758e-02f, +9.743626113e-01f, -4.048818011e-02f }, + { -2.259121387e-03f, +6.817681906e-02f, +9.744789009e-01f, -4.042412082e-02f }, + { -2.250783913e-03f, +6.798637707e-02f, +9.745949341e-01f, -4.035993848e-02f }, + { -2.242462875e-03f, +6.779609163e-02f, +9.747107110e-01f, -4.029563302e-02f }, + { -2.234158263e-03f, +6.760596272e-02f, +9.748262314e-01f, -4.023120436e-02f }, + { -2.225870062e-03f, +6.741599037e-02f, +9.749414954e-01f, -4.016665244e-02f }, + { -2.217598262e-03f, +6.722617456e-02f, +9.750565028e-01f, -4.010197718e-02f }, + { -2.209342848e-03f, +6.703651531e-02f, +9.751712536e-01f, -4.003717851e-02f }, + { -2.201103809e-03f, +6.684701262e-02f, +9.752857476e-01f, -3.997225637e-02f }, + { -2.192881133e-03f, +6.665766648e-02f, +9.753999849e-01f, -3.990721068e-02f }, + { -2.184674805e-03f, +6.646847692e-02f, +9.755139653e-01f, -3.984204137e-02f }, + { -2.176484815e-03f, +6.627944392e-02f, +9.756276888e-01f, -3.977674836e-02f }, + { -2.168311149e-03f, +6.609056749e-02f, +9.757411552e-01f, -3.971133160e-02f }, + { -2.160153795e-03f, +6.590184763e-02f, +9.758543646e-01f, -3.964579101e-02f }, + { -2.152012740e-03f, +6.571328435e-02f, +9.759673169e-01f, -3.958012651e-02f }, + { -2.143887971e-03f, +6.552487765e-02f, +9.760800119e-01f, -3.951433805e-02f }, + { -2.135779477e-03f, +6.533662753e-02f, +9.761924497e-01f, -3.944842554e-02f }, + { -2.127687243e-03f, +6.514853400e-02f, +9.763046301e-01f, -3.938238892e-02f }, + { -2.119611258e-03f, +6.496059705e-02f, +9.764165530e-01f, -3.931622812e-02f }, + { -2.111551509e-03f, +6.477281670e-02f, +9.765282185e-01f, -3.924994306e-02f }, + { -2.103507983e-03f, +6.458519293e-02f, +9.766396264e-01f, -3.918353368e-02f }, + { -2.095480667e-03f, +6.439772576e-02f, +9.767507766e-01f, -3.911699991e-02f }, + { -2.087469549e-03f, +6.421041518e-02f, +9.768616692e-01f, -3.905034167e-02f }, + { -2.079474617e-03f, +6.402326120e-02f, +9.769723040e-01f, -3.898355890e-02f }, + { -2.071495856e-03f, +6.383626381e-02f, +9.770826809e-01f, -3.891665153e-02f }, + { -2.063533255e-03f, +6.364942303e-02f, +9.771927998e-01f, -3.884961949e-02f }, + { -2.055586801e-03f, +6.346273885e-02f, +9.773026608e-01f, -3.878246270e-02f }, + { -2.047656480e-03f, +6.327621127e-02f, +9.774122638e-01f, -3.871518110e-02f }, + { -2.039742281e-03f, +6.308984030e-02f, +9.775216086e-01f, -3.864777462e-02f }, + { -2.031844191e-03f, +6.290362593e-02f, +9.776306952e-01f, -3.858024318e-02f }, + { -2.023962196e-03f, +6.271756817e-02f, +9.777395235e-01f, -3.851258673e-02f }, + { -2.016096283e-03f, +6.253166701e-02f, +9.778480935e-01f, -3.844480518e-02f }, + { -2.008246441e-03f, +6.234592246e-02f, +9.779564051e-01f, -3.837689847e-02f }, + { -2.000412656e-03f, +6.216033452e-02f, +9.780644583e-01f, -3.830886653e-02f }, + { -1.992594915e-03f, +6.197490319e-02f, +9.781722528e-01f, -3.824070929e-02f }, + { -1.984793206e-03f, +6.178962847e-02f, +9.782797888e-01f, -3.817242668e-02f }, + { -1.977007515e-03f, +6.160451036e-02f, +9.783870661e-01f, -3.810401864e-02f }, + { -1.969237830e-03f, +6.141954886e-02f, +9.784940847e-01f, -3.803548508e-02f }, + { -1.961484138e-03f, +6.123474396e-02f, +9.786008444e-01f, -3.796682595e-02f }, + { -1.953746425e-03f, +6.105009568e-02f, +9.787073453e-01f, -3.789804118e-02f }, + { -1.946024680e-03f, +6.086560401e-02f, +9.788135872e-01f, -3.782913069e-02f }, + { -1.938318888e-03f, +6.068126894e-02f, +9.789195701e-01f, -3.776009441e-02f }, + { -1.930629038e-03f, +6.049709048e-02f, +9.790252939e-01f, -3.769093228e-02f }, + { -1.922955116e-03f, +6.031306864e-02f, +9.791307585e-01f, -3.762164423e-02f }, + { -1.915297108e-03f, +6.012920340e-02f, +9.792359640e-01f, -3.755223018e-02f }, + { -1.907655004e-03f, +5.994549476e-02f, +9.793409101e-01f, -3.748269008e-02f }, + { -1.900028788e-03f, +5.976194274e-02f, +9.794455969e-01f, -3.741302385e-02f }, + { -1.892418449e-03f, +5.957854731e-02f, +9.795500243e-01f, -3.734323142e-02f }, + { -1.884823973e-03f, +5.939530849e-02f, +9.796541922e-01f, -3.727331272e-02f }, + { -1.877245347e-03f, +5.921222628e-02f, +9.797581006e-01f, -3.720326769e-02f }, + { -1.869682558e-03f, +5.902930066e-02f, +9.798617493e-01f, -3.713309626e-02f }, + { -1.862135594e-03f, +5.884653165e-02f, +9.799651384e-01f, -3.706279835e-02f }, + { -1.854604440e-03f, +5.866391923e-02f, +9.800682677e-01f, -3.699237391e-02f }, + { -1.847089085e-03f, +5.848146341e-02f, +9.801711372e-01f, -3.692182285e-02f }, + { -1.839589515e-03f, +5.829916418e-02f, +9.802737469e-01f, -3.685114512e-02f }, + { -1.832105717e-03f, +5.811702155e-02f, +9.803760966e-01f, -3.678034064e-02f }, + { -1.824637677e-03f, +5.793503550e-02f, +9.804781863e-01f, -3.670940934e-02f }, + { -1.817185384e-03f, +5.775320605e-02f, +9.805800159e-01f, -3.663835117e-02f }, + { -1.809748823e-03f, +5.757153318e-02f, +9.806815854e-01f, -3.656716604e-02f }, + { -1.802327981e-03f, +5.739001690e-02f, +9.807828947e-01f, -3.649585390e-02f }, + { -1.794922846e-03f, +5.720865720e-02f, +9.808839437e-01f, -3.642441467e-02f }, + { -1.787533404e-03f, +5.702745407e-02f, +9.809847324e-01f, -3.635284829e-02f }, + { -1.780159642e-03f, +5.684640752e-02f, +9.810852607e-01f, -3.628115468e-02f }, + { -1.772801548e-03f, +5.666551755e-02f, +9.811855286e-01f, -3.620933378e-02f }, + { -1.765459107e-03f, +5.648478415e-02f, +9.812855360e-01f, -3.613738552e-02f }, + { -1.758132306e-03f, +5.630420731e-02f, +9.813852827e-01f, -3.606530984e-02f }, + { -1.750821133e-03f, +5.612378704e-02f, +9.814847688e-01f, -3.599310667e-02f }, + { -1.743525575e-03f, +5.594352333e-02f, +9.815839943e-01f, -3.592077593e-02f }, + { -1.736245617e-03f, +5.576341617e-02f, +9.816829589e-01f, -3.584831757e-02f }, + { -1.728981247e-03f, +5.558346557e-02f, +9.817816627e-01f, -3.577573150e-02f }, + { -1.721732452e-03f, +5.540367152e-02f, +9.818801056e-01f, -3.570301768e-02f }, + { -1.714499218e-03f, +5.522403402e-02f, +9.819782876e-01f, -3.563017602e-02f }, + { -1.707281532e-03f, +5.504455306e-02f, +9.820762086e-01f, -3.555720646e-02f }, + { -1.700079381e-03f, +5.486522863e-02f, +9.821738684e-01f, -3.548410894e-02f }, + { -1.692892751e-03f, +5.468606075e-02f, +9.822712671e-01f, -3.541088338e-02f }, + { -1.685721630e-03f, +5.450704939e-02f, +9.823684047e-01f, -3.533752973e-02f }, + { -1.678566004e-03f, +5.432819456e-02f, +9.824652809e-01f, -3.526404790e-02f }, + { -1.671425859e-03f, +5.414949625e-02f, +9.825618958e-01f, -3.519043784e-02f }, + { -1.664301183e-03f, +5.397095446e-02f, +9.826582494e-01f, -3.511669948e-02f }, + { -1.657191962e-03f, +5.379256918e-02f, +9.827543414e-01f, -3.504283275e-02f }, + { -1.650098183e-03f, +5.361434040e-02f, +9.828501720e-01f, -3.496883758e-02f }, + { -1.643019832e-03f, +5.343626813e-02f, +9.829457410e-01f, -3.489471391e-02f }, + { -1.635956896e-03f, +5.325835236e-02f, +9.830410484e-01f, -3.482046167e-02f }, + { -1.628909362e-03f, +5.308059308e-02f, +9.831360941e-01f, -3.474608080e-02f }, + { -1.621877216e-03f, +5.290299029e-02f, +9.832308780e-01f, -3.467157122e-02f }, + { -1.614860445e-03f, +5.272554398e-02f, +9.833254001e-01f, -3.459693287e-02f }, + { -1.607859036e-03f, +5.254825415e-02f, +9.834196603e-01f, -3.452216568e-02f }, + { -1.600872975e-03f, +5.237112079e-02f, +9.835136587e-01f, -3.444726959e-02f }, + { -1.593902249e-03f, +5.219414389e-02f, +9.836073950e-01f, -3.437224453e-02f }, + { -1.586946844e-03f, +5.201732345e-02f, +9.837008692e-01f, -3.429709044e-02f }, + { -1.580006747e-03f, +5.184065947e-02f, +9.837940814e-01f, -3.422180724e-02f }, + { -1.573081945e-03f, +5.166415193e-02f, +9.838870314e-01f, -3.414639488e-02f }, + { -1.566172424e-03f, +5.148780084e-02f, +9.839797191e-01f, -3.407085327e-02f }, + { -1.559278170e-03f, +5.131160618e-02f, +9.840721446e-01f, -3.399518237e-02f }, + { -1.552399171e-03f, +5.113556795e-02f, +9.841643077e-01f, -3.391938210e-02f }, + { -1.545535412e-03f, +5.095968615e-02f, +9.842562085e-01f, -3.384345240e-02f }, + { -1.538686881e-03f, +5.078396076e-02f, +9.843478467e-01f, -3.376739320e-02f }, + { -1.531853564e-03f, +5.060839177e-02f, +9.844392225e-01f, -3.369120443e-02f }, + { -1.525035446e-03f, +5.043297919e-02f, +9.845303356e-01f, -3.361488603e-02f }, + { -1.518232516e-03f, +5.025772301e-02f, +9.846211862e-01f, -3.353843793e-02f }, + { -1.511444759e-03f, +5.008262322e-02f, +9.847117740e-01f, -3.346186007e-02f }, + { -1.504672161e-03f, +4.990767980e-02f, +9.848020991e-01f, -3.338515239e-02f }, + { -1.497914710e-03f, +4.973289276e-02f, +9.848921614e-01f, -3.330831480e-02f }, + { -1.491172391e-03f, +4.955826209e-02f, +9.849819608e-01f, -3.323134726e-02f }, + { -1.484445192e-03f, +4.938378778e-02f, +9.850714973e-01f, -3.315424969e-02f }, + { -1.477733098e-03f, +4.920946982e-02f, +9.851607708e-01f, -3.307702203e-02f }, + { -1.471036096e-03f, +4.903530820e-02f, +9.852497812e-01f, -3.299966421e-02f }, + { -1.464354173e-03f, +4.886130292e-02f, +9.853385286e-01f, -3.292217617e-02f }, + { -1.457687314e-03f, +4.868745396e-02f, +9.854270129e-01f, -3.284455785e-02f }, + { -1.451035507e-03f, +4.851376133e-02f, +9.855152339e-01f, -3.276680917e-02f }, + { -1.444398738e-03f, +4.834022501e-02f, +9.856031917e-01f, -3.268893007e-02f }, + { -1.437776992e-03f, +4.816684499e-02f, +9.856908861e-01f, -3.261092049e-02f }, + { -1.431170257e-03f, +4.799362127e-02f, +9.857783172e-01f, -3.253278036e-02f }, + { -1.424578519e-03f, +4.782055384e-02f, +9.858654848e-01f, -3.245450962e-02f }, + { -1.418001764e-03f, +4.764764268e-02f, +9.859523890e-01f, -3.237610820e-02f }, + { -1.411439979e-03f, +4.747488779e-02f, +9.860390297e-01f, -3.229757604e-02f }, + { -1.404893149e-03f, +4.730228917e-02f, +9.861254067e-01f, -3.221891307e-02f }, + { -1.398361262e-03f, +4.712984679e-02f, +9.862115201e-01f, -3.214011922e-02f }, + { -1.391844303e-03f, +4.695756066e-02f, +9.862973698e-01f, -3.206119444e-02f }, + { -1.385342260e-03f, +4.678543077e-02f, +9.863829557e-01f, -3.198213866e-02f }, + { -1.378855117e-03f, +4.661345709e-02f, +9.864682779e-01f, -3.190295181e-02f }, + { -1.372382862e-03f, +4.644163964e-02f, +9.865533361e-01f, -3.182363382e-02f }, + { -1.365925481e-03f, +4.626997838e-02f, +9.866381305e-01f, -3.174418465e-02f }, + { -1.359482960e-03f, +4.609847333e-02f, +9.867226608e-01f, -3.166460421e-02f }, + { -1.353055286e-03f, +4.592712446e-02f, +9.868069272e-01f, -3.158489244e-02f }, + { -1.346642444e-03f, +4.575593177e-02f, +9.868909295e-01f, -3.150504929e-02f }, + { -1.340244422e-03f, +4.558489524e-02f, +9.869746676e-01f, -3.142507468e-02f }, + { -1.333861204e-03f, +4.541401487e-02f, +9.870581415e-01f, -3.134496856e-02f }, + { -1.327492778e-03f, +4.524329065e-02f, +9.871413513e-01f, -3.126473085e-02f }, + { -1.321139130e-03f, +4.507272256e-02f, +9.872242967e-01f, -3.118436150e-02f }, + { -1.314800245e-03f, +4.490231060e-02f, +9.873069778e-01f, -3.110386044e-02f }, + { -1.308476111e-03f, +4.473205475e-02f, +9.873893944e-01f, -3.102322761e-02f }, + { -1.302166714e-03f, +4.456195501e-02f, +9.874715467e-01f, -3.094246293e-02f }, + { -1.295872038e-03f, +4.439201136e-02f, +9.875534344e-01f, -3.086156636e-02f }, + { -1.289592072e-03f, +4.422222380e-02f, +9.876350576e-01f, -3.078053782e-02f }, + { -1.283326801e-03f, +4.405259231e-02f, +9.877164161e-01f, -3.069937725e-02f }, + { -1.277076211e-03f, +4.388311688e-02f, +9.877975101e-01f, -3.061808459e-02f }, + { -1.270840289e-03f, +4.371379750e-02f, +9.878783393e-01f, -3.053665977e-02f }, + { -1.264619020e-03f, +4.354463416e-02f, +9.879589037e-01f, -3.045510273e-02f }, + { -1.258412391e-03f, +4.337562684e-02f, +9.880392034e-01f, -3.037341341e-02f }, + { -1.252220388e-03f, +4.320677555e-02f, +9.881192381e-01f, -3.029159174e-02f }, + { -1.246042996e-03f, +4.303808025e-02f, +9.881990080e-01f, -3.020963766e-02f }, + { -1.239880203e-03f, +4.286954095e-02f, +9.882785129e-01f, -3.012755111e-02f }, + { -1.233731995e-03f, +4.270115763e-02f, +9.883577528e-01f, -3.004533202e-02f }, + { -1.227598357e-03f, +4.253293028e-02f, +9.884367276e-01f, -2.996298034e-02f }, + { -1.221479275e-03f, +4.236485889e-02f, +9.885154374e-01f, -2.988049599e-02f }, + { -1.215374737e-03f, +4.219694344e-02f, +9.885938819e-01f, -2.979787891e-02f }, + { -1.209284727e-03f, +4.202918393e-02f, +9.886720613e-01f, -2.971512904e-02f }, + { -1.203209232e-03f, +4.186158033e-02f, +9.887499753e-01f, -2.963224632e-02f }, + { -1.197148238e-03f, +4.169413264e-02f, +9.888276241e-01f, -2.954923069e-02f }, + { -1.191101731e-03f, +4.152684085e-02f, +9.889050075e-01f, -2.946608208e-02f }, + { -1.185069698e-03f, +4.135970494e-02f, +9.889821255e-01f, -2.938280043e-02f }, + { -1.179052123e-03f, +4.119272490e-02f, +9.890589780e-01f, -2.929938568e-02f }, + { -1.173048994e-03f, +4.102590072e-02f, +9.891355651e-01f, -2.921583776e-02f }, + { -1.167060297e-03f, +4.085923238e-02f, +9.892118865e-01f, -2.913215661e-02f }, + { -1.161086016e-03f, +4.069271988e-02f, +9.892879424e-01f, -2.904834218e-02f }, + { -1.155126140e-03f, +4.052636319e-02f, +9.893637326e-01f, -2.896439439e-02f }, + { -1.149180652e-03f, +4.036016230e-02f, +9.894392571e-01f, -2.888031318e-02f }, + { -1.143249541e-03f, +4.019411721e-02f, +9.895145159e-01f, -2.879609850e-02f }, + { -1.137332791e-03f, +4.002822789e-02f, +9.895895088e-01f, -2.871175028e-02f }, + { -1.131430388e-03f, +3.986249434e-02f, +9.896642360e-01f, -2.862726845e-02f }, + { -1.125542319e-03f, +3.969691653e-02f, +9.897386972e-01f, -2.854265296e-02f }, + { -1.119668570e-03f, +3.953149447e-02f, +9.898128925e-01f, -2.845790375e-02f }, + { -1.113809126e-03f, +3.936622812e-02f, +9.898868218e-01f, -2.837302075e-02f }, + { -1.107963974e-03f, +3.920111748e-02f, +9.899604850e-01f, -2.828800389e-02f }, + { -1.102133100e-03f, +3.903616254e-02f, +9.900338822e-01f, -2.820285313e-02f }, + { -1.096316489e-03f, +3.887136328e-02f, +9.901070133e-01f, -2.811756839e-02f }, + { -1.090514127e-03f, +3.870671968e-02f, +9.901798782e-01f, -2.803214962e-02f }, + { -1.084726001e-03f, +3.854223173e-02f, +9.902524768e-01f, -2.794659675e-02f }, + { -1.078952096e-03f, +3.837789942e-02f, +9.903248092e-01f, -2.786090972e-02f }, + { -1.073192399e-03f, +3.821372273e-02f, +9.903968753e-01f, -2.777508847e-02f }, + { -1.067446895e-03f, +3.804970164e-02f, +9.904686751e-01f, -2.768913294e-02f }, + { -1.061715570e-03f, +3.788583615e-02f, +9.905402084e-01f, -2.760304307e-02f }, + { -1.055998411e-03f, +3.772212623e-02f, +9.906114753e-01f, -2.751681879e-02f }, + { -1.050295402e-03f, +3.755857188e-02f, +9.906824756e-01f, -2.743046005e-02f }, + { -1.044606531e-03f, +3.739517307e-02f, +9.907532095e-01f, -2.734396678e-02f }, + { -1.038931782e-03f, +3.723192979e-02f, +9.908236768e-01f, -2.725733893e-02f }, + { -1.033271142e-03f, +3.706884203e-02f, +9.908938774e-01f, -2.717057642e-02f }, + { -1.027624597e-03f, +3.690590976e-02f, +9.909638114e-01f, -2.708367921e-02f }, + { -1.021992133e-03f, +3.674313298e-02f, +9.910334786e-01f, -2.699664722e-02f }, + { -1.016373735e-03f, +3.658051167e-02f, +9.911028791e-01f, -2.690948040e-02f }, + { -1.010769389e-03f, +3.641804581e-02f, +9.911720128e-01f, -2.682217869e-02f }, + { -1.005179082e-03f, +3.625573538e-02f, +9.912408796e-01f, -2.673474203e-02f }, + { -9.996027983e-04f, +3.609358038e-02f, +9.913094795e-01f, -2.664717035e-02f }, + { -9.940405249e-04f, +3.593158078e-02f, +9.913778125e-01f, -2.655946360e-02f }, + { -9.884922474e-04f, +3.576973656e-02f, +9.914458785e-01f, -2.647162171e-02f }, + { -9.829579515e-04f, +3.560804772e-02f, +9.915136775e-01f, -2.638364463e-02f }, + { -9.774376231e-04f, +3.544651423e-02f, +9.915812094e-01f, -2.629553230e-02f }, + { -9.719312480e-04f, +3.528513608e-02f, +9.916484743e-01f, -2.620728464e-02f }, + { -9.664388120e-04f, +3.512391325e-02f, +9.917154719e-01f, -2.611890161e-02f }, + { -9.609603011e-04f, +3.496284573e-02f, +9.917822024e-01f, -2.603038315e-02f }, + { -9.554957009e-04f, +3.480193349e-02f, +9.918486656e-01f, -2.594172918e-02f }, + { -9.500449974e-04f, +3.464117652e-02f, +9.919148616e-01f, -2.585293966e-02f }, + { -9.446081762e-04f, +3.448057480e-02f, +9.919807902e-01f, -2.576401452e-02f }, + { -9.391852233e-04f, +3.432012832e-02f, +9.920464515e-01f, -2.567495371e-02f }, + { -9.337761243e-04f, +3.415983706e-02f, +9.921118453e-01f, -2.558575716e-02f }, + { -9.283808652e-04f, +3.399970099e-02f, +9.921769718e-01f, -2.549642481e-02f }, + { -9.229994316e-04f, +3.383972011e-02f, +9.922418307e-01f, -2.540695661e-02f }, + { -9.176318093e-04f, +3.367989440e-02f, +9.923064221e-01f, -2.531735249e-02f }, + { -9.122779842e-04f, +3.352022383e-02f, +9.923707459e-01f, -2.522761239e-02f }, + { -9.069379419e-04f, +3.336070839e-02f, +9.924348021e-01f, -2.513773626e-02f }, + { -9.016116683e-04f, +3.320134807e-02f, +9.924985907e-01f, -2.504772404e-02f }, + { -8.962991490e-04f, +3.304214283e-02f, +9.925621116e-01f, -2.495757566e-02f }, + { -8.910003699e-04f, +3.288309267e-02f, +9.926253647e-01f, -2.486729107e-02f }, + { -8.857153167e-04f, +3.272419757e-02f, +9.926883501e-01f, -2.477687020e-02f }, + { -8.804439750e-04f, +3.256545750e-02f, +9.927510676e-01f, -2.468631300e-02f }, + { -8.751863308e-04f, +3.240687246e-02f, +9.928135173e-01f, -2.459561942e-02f }, + { -8.699423695e-04f, +3.224844242e-02f, +9.928756991e-01f, -2.450478938e-02f }, + { -8.647120771e-04f, +3.209016735e-02f, +9.929376130e-01f, -2.441382283e-02f }, + { -8.594954392e-04f, +3.193204725e-02f, +9.929992589e-01f, -2.432271972e-02f }, + { -8.542924415e-04f, +3.177408210e-02f, +9.930606368e-01f, -2.423147998e-02f }, + { -8.491030697e-04f, +3.161627187e-02f, +9.931217466e-01f, -2.414010355e-02f }, + { -8.439273095e-04f, +3.145861654e-02f, +9.931825884e-01f, -2.404859038e-02f }, + { -8.387651466e-04f, +3.130111610e-02f, +9.932431620e-01f, -2.395694040e-02f }, + { -8.336165668e-04f, +3.114377053e-02f, +9.933034675e-01f, -2.386515357e-02f }, + { -8.284815556e-04f, +3.098657981e-02f, +9.933635047e-01f, -2.377322981e-02f }, + { -8.233600987e-04f, +3.082954391e-02f, +9.934232738e-01f, -2.368116908e-02f }, + { -8.182521819e-04f, +3.067266283e-02f, +9.934827745e-01f, -2.358897131e-02f }, + { -8.131577908e-04f, +3.051593653e-02f, +9.935420069e-01f, -2.349663644e-02f }, + { -8.080769110e-04f, +3.035936500e-02f, +9.936009710e-01f, -2.340416442e-02f }, + { -8.030095283e-04f, +3.020294821e-02f, +9.936596666e-01f, -2.331155519e-02f }, + { -7.979556282e-04f, +3.004668616e-02f, +9.937180939e-01f, -2.321880869e-02f }, + { -7.929151965e-04f, +2.989057881e-02f, +9.937762527e-01f, -2.312592486e-02f }, + { -7.878882187e-04f, +2.973462615e-02f, +9.938341429e-01f, -2.303290364e-02f }, + { -7.828746805e-04f, +2.957882816e-02f, +9.938917647e-01f, -2.293974499e-02f }, + { -7.778745675e-04f, +2.942318481e-02f, +9.939491178e-01f, -2.284644883e-02f }, + { -7.728878654e-04f, +2.926769610e-02f, +9.940062023e-01f, -2.275301511e-02f }, + { -7.679145598e-04f, +2.911236198e-02f, +9.940630182e-01f, -2.265944377e-02f }, + { -7.629546363e-04f, +2.895718245e-02f, +9.941195654e-01f, -2.256573476e-02f }, + { -7.580080805e-04f, +2.880215748e-02f, +9.941758439e-01f, -2.247188802e-02f }, + { -7.530748780e-04f, +2.864728706e-02f, +9.942318536e-01f, -2.237790348e-02f }, + { -7.481550144e-04f, +2.849257115e-02f, +9.942875945e-01f, -2.228378110e-02f }, + { -7.432484754e-04f, +2.833800975e-02f, +9.943430666e-01f, -2.218952082e-02f }, + { -7.383552465e-04f, +2.818360282e-02f, +9.943982699e-01f, -2.209512257e-02f }, + { -7.334753133e-04f, +2.802935035e-02f, +9.944532042e-01f, -2.200058631e-02f }, + { -7.286086614e-04f, +2.787525232e-02f, +9.945078696e-01f, -2.190591197e-02f }, + { -7.237552763e-04f, +2.772130869e-02f, +9.945622660e-01f, -2.181109950e-02f }, + { -7.189151437e-04f, +2.756751946e-02f, +9.946163934e-01f, -2.171614883e-02f }, + { -7.140882492e-04f, +2.741388460e-02f, +9.946702518e-01f, -2.162105992e-02f }, + { -7.092745782e-04f, +2.726040409e-02f, +9.947238411e-01f, -2.152583271e-02f }, + { -7.044741164e-04f, +2.710707790e-02f, +9.947771613e-01f, -2.143046713e-02f }, + { -6.996868493e-04f, +2.695390602e-02f, +9.948302124e-01f, -2.133496314e-02f }, + { -6.949127625e-04f, +2.680088842e-02f, +9.948829943e-01f, -2.123932068e-02f }, + { -6.901518415e-04f, +2.664802507e-02f, +9.949355069e-01f, -2.114353968e-02f }, + { -6.854040719e-04f, +2.649531596e-02f, +9.949877504e-01f, -2.104762010e-02f }, + { -6.806694392e-04f, +2.634276107e-02f, +9.950397245e-01f, -2.095156187e-02f }, + { -6.759479289e-04f, +2.619036036e-02f, +9.950914294e-01f, -2.085536494e-02f }, + { -6.712395266e-04f, +2.603811383e-02f, +9.951428649e-01f, -2.075902926e-02f }, + { -6.665442179e-04f, +2.588602143e-02f, +9.951940310e-01f, -2.066255477e-02f }, + { -6.618619881e-04f, +2.573408316e-02f, +9.952449278e-01f, -2.056594140e-02f }, + { -6.571928229e-04f, +2.558229899e-02f, +9.952955551e-01f, -2.046918912e-02f }, + { -6.525367078e-04f, +2.543066889e-02f, +9.953459129e-01f, -2.037229785e-02f }, + { -6.478936283e-04f, +2.527919285e-02f, +9.953960012e-01f, -2.027526754e-02f }, + { -6.432635698e-04f, +2.512787083e-02f, +9.954458200e-01f, -2.017809815e-02f }, + { -6.386465180e-04f, +2.497670282e-02f, +9.954953692e-01f, -2.008078960e-02f }, + { -6.340424582e-04f, +2.482568879e-02f, +9.955446489e-01f, -1.998334185e-02f }, + { -6.294513760e-04f, +2.467482872e-02f, +9.955936589e-01f, -1.988575485e-02f }, + { -6.248732570e-04f, +2.452412258e-02f, +9.956423992e-01f, -1.978802853e-02f }, + { -6.203080865e-04f, +2.437357035e-02f, +9.956908698e-01f, -1.969016283e-02f }, + { -6.157558500e-04f, +2.422317200e-02f, +9.957390708e-01f, -1.959215772e-02f }, + { -6.112165332e-04f, +2.407292752e-02f, +9.957870019e-01f, -1.949401312e-02f }, + { -6.066901213e-04f, +2.392283688e-02f, +9.958346633e-01f, -1.939572898e-02f }, + { -6.021765999e-04f, +2.377290004e-02f, +9.958820549e-01f, -1.929730525e-02f }, + { -5.976759545e-04f, +2.362311700e-02f, +9.959291766e-01f, -1.919874188e-02f }, + { -5.931881705e-04f, +2.347348772e-02f, +9.959760285e-01f, -1.910003880e-02f }, + { -5.887132334e-04f, +2.332401218e-02f, +9.960226105e-01f, -1.900119597e-02f }, + { -5.842511287e-04f, +2.317469035e-02f, +9.960689225e-01f, -1.890221333e-02f }, + { -5.798018418e-04f, +2.302552221e-02f, +9.961149645e-01f, -1.880309082e-02f }, + { -5.753653581e-04f, +2.287650774e-02f, +9.961607366e-01f, -1.870382839e-02f }, + { -5.709416631e-04f, +2.272764690e-02f, +9.962062387e-01f, -1.860442598e-02f }, + { -5.665307423e-04f, +2.257893968e-02f, +9.962514707e-01f, -1.850488354e-02f }, + { -5.621325811e-04f, +2.243038605e-02f, +9.962964326e-01f, -1.840520102e-02f }, + { -5.577471650e-04f, +2.228198598e-02f, +9.963411244e-01f, -1.830537836e-02f }, + { -5.533744792e-04f, +2.213373945e-02f, +9.963855461e-01f, -1.820541550e-02f }, + { -5.490145094e-04f, +2.198564643e-02f, +9.964296976e-01f, -1.810531240e-02f }, + { -5.446672410e-04f, +2.183770690e-02f, +9.964735789e-01f, -1.800506899e-02f }, + { -5.403326592e-04f, +2.168992083e-02f, +9.965171900e-01f, -1.790468523e-02f }, + { -5.360107497e-04f, +2.154228819e-02f, +9.965605309e-01f, -1.780416106e-02f }, + { -5.317014977e-04f, +2.139480896e-02f, +9.966036014e-01f, -1.770349642e-02f }, + { -5.274048887e-04f, +2.124748312e-02f, +9.966464017e-01f, -1.760269126e-02f }, + { -5.231209082e-04f, +2.110031063e-02f, +9.966889317e-01f, -1.750174553e-02f }, + { -5.188495414e-04f, +2.095329147e-02f, +9.967311913e-01f, -1.740065918e-02f }, + { -5.145907739e-04f, +2.080642562e-02f, +9.967731805e-01f, -1.729943214e-02f }, + { -5.103445911e-04f, +2.065971304e-02f, +9.968148993e-01f, -1.719806437e-02f }, + { -5.061109782e-04f, +2.051315372e-02f, +9.968563476e-01f, -1.709655581e-02f }, + { -5.018899208e-04f, +2.036674762e-02f, +9.968975255e-01f, -1.699490642e-02f }, + { -4.976814042e-04f, +2.022049471e-02f, +9.969384329e-01f, -1.689311613e-02f }, + { -4.934854139e-04f, +2.007439498e-02f, +9.969790698e-01f, -1.679118489e-02f }, + { -4.893019351e-04f, +1.992844839e-02f, +9.970194362e-01f, -1.668911265e-02f }, + { -4.851309533e-04f, +1.978265492e-02f, +9.970595319e-01f, -1.658689935e-02f }, + { -4.809724538e-04f, +1.963701453e-02f, +9.970993571e-01f, -1.648454495e-02f }, + { -4.768264221e-04f, +1.949152721e-02f, +9.971389117e-01f, -1.638204939e-02f }, + { -4.726928435e-04f, +1.934619292e-02f, +9.971781956e-01f, -1.627941262e-02f }, + { -4.685717034e-04f, +1.920101164e-02f, +9.972172089e-01f, -1.617663458e-02f }, + { -4.644629872e-04f, +1.905598334e-02f, +9.972559515e-01f, -1.607371522e-02f }, + { -4.603666801e-04f, +1.891110799e-02f, +9.972944233e-01f, -1.597065449e-02f }, + { -4.562827677e-04f, +1.876638556e-02f, +9.973326244e-01f, -1.586745234e-02f }, + { -4.522112352e-04f, +1.862181603e-02f, +9.973705548e-01f, -1.576410871e-02f }, + { -4.481520680e-04f, +1.847739937e-02f, +9.974082143e-01f, -1.566062355e-02f }, + { -4.441052515e-04f, +1.833313554e-02f, +9.974456031e-01f, -1.555699680e-02f }, + { -4.400707710e-04f, +1.818902453e-02f, +9.974827210e-01f, -1.545322843e-02f }, + { -4.360486119e-04f, +1.804506631e-02f, +9.975195680e-01f, -1.534931837e-02f }, + { -4.320387594e-04f, +1.790126083e-02f, +9.975561442e-01f, -1.524526657e-02f }, + { -4.280411991e-04f, +1.775760809e-02f, +9.975924494e-01f, -1.514107297e-02f }, + { -4.240559161e-04f, +1.761410804e-02f, +9.976284837e-01f, -1.503673754e-02f }, + { -4.200828959e-04f, +1.747076066e-02f, +9.976642471e-01f, -1.493226021e-02f }, + { -4.161221238e-04f, +1.732756592e-02f, +9.976997395e-01f, -1.482764093e-02f }, + { -4.121735850e-04f, +1.718452380e-02f, +9.977349608e-01f, -1.472287966e-02f }, + { -4.082372651e-04f, +1.704163425e-02f, +9.977699112e-01f, -1.461797634e-02f }, + { -4.043131492e-04f, +1.689889726e-02f, +9.978045905e-01f, -1.451293091e-02f }, + { -4.004012227e-04f, +1.675631280e-02f, +9.978389988e-01f, -1.440774333e-02f }, + { -3.965014710e-04f, +1.661388082e-02f, +9.978731359e-01f, -1.430241355e-02f }, + { -3.926138794e-04f, +1.647160132e-02f, +9.979070020e-01f, -1.419694151e-02f }, + { -3.887384331e-04f, +1.632947425e-02f, +9.979405969e-01f, -1.409132716e-02f }, + { -3.848751175e-04f, +1.618749959e-02f, +9.979739207e-01f, -1.398557045e-02f }, + { -3.810239179e-04f, +1.604567730e-02f, +9.980069732e-01f, -1.387967133e-02f }, + { -3.771848197e-04f, +1.590400737e-02f, +9.980397546e-01f, -1.377362975e-02f }, + { -3.733578082e-04f, +1.576248975e-02f, +9.980722648e-01f, -1.366744566e-02f }, + { -3.695428686e-04f, +1.562112441e-02f, +9.981045038e-01f, -1.356111900e-02f }, + { -3.657399862e-04f, +1.547991134e-02f, +9.981364714e-01f, -1.345464973e-02f }, + { -3.619491465e-04f, +1.533885049e-02f, +9.981681678e-01f, -1.334803780e-02f }, + { -3.581703346e-04f, +1.519794184e-02f, +9.981995929e-01f, -1.324128315e-02f }, + { -3.544035359e-04f, +1.505718535e-02f, +9.982307467e-01f, -1.313438573e-02f }, + { -3.506487357e-04f, +1.491658101e-02f, +9.982616292e-01f, -1.302734550e-02f }, + { -3.469059193e-04f, +1.477612876e-02f, +9.982922403e-01f, -1.292016240e-02f }, + { -3.431750720e-04f, +1.463582860e-02f, +9.983225800e-01f, -1.281283638e-02f }, + { -3.394561791e-04f, +1.449568047e-02f, +9.983526483e-01f, -1.270536739e-02f }, + { -3.357492258e-04f, +1.435568436e-02f, +9.983824452e-01f, -1.259775538e-02f }, + { -3.320541975e-04f, +1.421584024e-02f, +9.984119707e-01f, -1.249000030e-02f }, + { -3.283710794e-04f, +1.407614806e-02f, +9.984412247e-01f, -1.238210211e-02f }, + { -3.246998569e-04f, +1.393660781e-02f, +9.984702072e-01f, -1.227406075e-02f }, + { -3.210405152e-04f, +1.379721944e-02f, +9.984989183e-01f, -1.216587616e-02f }, + { -3.173930397e-04f, +1.365798293e-02f, +9.985273578e-01f, -1.205754831e-02f }, + { -3.137574155e-04f, +1.351889825e-02f, +9.985555259e-01f, -1.194907714e-02f }, + { -3.101336280e-04f, +1.337996537e-02f, +9.985834223e-01f, -1.184046260e-02f }, + { -3.065216624e-04f, +1.324118424e-02f, +9.986110473e-01f, -1.173170465e-02f }, + { -3.029215041e-04f, +1.310255485e-02f, +9.986384006e-01f, -1.162280322e-02f }, + { -2.993331383e-04f, +1.296407716e-02f, +9.986654823e-01f, -1.151375828e-02f }, + { -2.957565503e-04f, +1.282575114e-02f, +9.986922924e-01f, -1.140456977e-02f }, + { -2.921917254e-04f, +1.268757675e-02f, +9.987188309e-01f, -1.129523765e-02f }, + { -2.886386488e-04f, +1.254955397e-02f, +9.987450978e-01f, -1.118576186e-02f }, + { -2.850973058e-04f, +1.241168275e-02f, +9.987710929e-01f, -1.107614236e-02f }, + { -2.815676816e-04f, +1.227396308e-02f, +9.987968164e-01f, -1.096637910e-02f }, + { -2.780497616e-04f, +1.213639492e-02f, +9.988222682e-01f, -1.085647202e-02f }, + { -2.745435310e-04f, +1.199897823e-02f, +9.988474483e-01f, -1.074642108e-02f }, + { -2.710489751e-04f, +1.186171298e-02f, +9.988723567e-01f, -1.063622623e-02f }, + { -2.675660791e-04f, +1.172459914e-02f, +9.988969933e-01f, -1.052588743e-02f }, + { -2.640948284e-04f, +1.158763668e-02f, +9.989213581e-01f, -1.041540461e-02f }, + { -2.606352080e-04f, +1.145082556e-02f, +9.989454512e-01f, -1.030477774e-02f }, + { -2.571872034e-04f, +1.131416575e-02f, +9.989692724e-01f, -1.019400677e-02f }, + { -2.537507998e-04f, +1.117765722e-02f, +9.989928219e-01f, -1.008309164e-02f }, + { -2.503259824e-04f, +1.104129994e-02f, +9.990160995e-01f, -9.972032308e-03f }, + { -2.469127365e-04f, +1.090509386e-02f, +9.990391053e-01f, -9.860828729e-03f }, + { -2.435110474e-04f, +1.076903897e-02f, +9.990618393e-01f, -9.749480853e-03f }, + { -2.401209002e-04f, +1.063313522e-02f, +9.990843014e-01f, -9.637988631e-03f }, + { -2.367422804e-04f, +1.049738258e-02f, +9.991064916e-01f, -9.526352014e-03f }, + { -2.333751730e-04f, +1.036178102e-02f, +9.991284099e-01f, -9.414570956e-03f }, + { -2.300195634e-04f, +1.022633050e-02f, +9.991500563e-01f, -9.302645409e-03f }, + { -2.266754367e-04f, +1.009103099e-02f, +9.991714307e-01f, -9.190575323e-03f }, + { -2.233427784e-04f, +9.955882461e-03f, +9.991925333e-01f, -9.078360653e-03f }, + { -2.200215735e-04f, +9.820884872e-03f, +9.992133639e-01f, -8.966001349e-03f }, + { -2.167118075e-04f, +9.686038192e-03f, +9.992339225e-01f, -8.853497366e-03f }, + { -2.134134654e-04f, +9.551342385e-03f, +9.992542091e-01f, -8.740848654e-03f }, + { -2.101265325e-04f, +9.416797418e-03f, +9.992742238e-01f, -8.628055168e-03f }, + { -2.068509942e-04f, +9.282403256e-03f, +9.992939664e-01f, -8.515116858e-03f }, + { -2.035868356e-04f, +9.148159865e-03f, +9.993134371e-01f, -8.402033679e-03f }, + { -2.003340419e-04f, +9.014067211e-03f, +9.993326357e-01f, -8.288805583e-03f }, + { -1.970925985e-04f, +8.880125258e-03f, +9.993515622e-01f, -8.175432524e-03f }, + { -1.938624906e-04f, +8.746333973e-03f, +9.993702168e-01f, -8.061914453e-03f }, + { -1.906437034e-04f, +8.612693320e-03f, +9.993885992e-01f, -7.948251325e-03f }, + { -1.874362221e-04f, +8.479203263e-03f, +9.994067096e-01f, -7.834443092e-03f }, + { -1.842400320e-04f, +8.345863769e-03f, +9.994245479e-01f, -7.720489707e-03f }, + { -1.810551183e-04f, +8.212674803e-03f, +9.994421141e-01f, -7.606391125e-03f }, + { -1.778814663e-04f, +8.079636328e-03f, +9.994594082e-01f, -7.492147298e-03f }, + { -1.747190612e-04f, +7.946748310e-03f, +9.994764302e-01f, -7.377758181e-03f }, + { -1.715678882e-04f, +7.814010713e-03f, +9.994931800e-01f, -7.263223725e-03f }, + { -1.684279326e-04f, +7.681423501e-03f, +9.995096577e-01f, -7.148543887e-03f }, + { -1.652991797e-04f, +7.548986640e-03f, +9.995258632e-01f, -7.033718618e-03f }, + { -1.621816145e-04f, +7.416700094e-03f, +9.995417966e-01f, -6.918747873e-03f }, + { -1.590752225e-04f, +7.284563826e-03f, +9.995574578e-01f, -6.803631606e-03f }, + { -1.559799888e-04f, +7.152577801e-03f, +9.995728468e-01f, -6.688369772e-03f }, + { -1.528958987e-04f, +7.020741983e-03f, +9.995879637e-01f, -6.572962323e-03f }, + { -1.498229373e-04f, +6.889056337e-03f, +9.996028083e-01f, -6.457409214e-03f }, + { -1.467610900e-04f, +6.757520824e-03f, +9.996173807e-01f, -6.341710400e-03f }, + { -1.437103420e-04f, +6.626135411e-03f, +9.996316809e-01f, -6.225865834e-03f }, + { -1.406706784e-04f, +6.494900059e-03f, +9.996457089e-01f, -6.109875472e-03f }, + { -1.376420846e-04f, +6.363814734e-03f, +9.996594646e-01f, -5.993739268e-03f }, + { -1.346245458e-04f, +6.232879398e-03f, +9.996729481e-01f, -5.877457176e-03f }, + { -1.316180471e-04f, +6.102094014e-03f, +9.996861593e-01f, -5.761029151e-03f }, + { -1.286225739e-04f, +5.971458547e-03f, +9.996990983e-01f, -5.644455148e-03f }, + { -1.256381113e-04f, +5.840972959e-03f, +9.997117650e-01f, -5.527735122e-03f }, + { -1.226646447e-04f, +5.710637213e-03f, +9.997241594e-01f, -5.410869028e-03f }, + { -1.197021592e-04f, +5.580451273e-03f, +9.997362815e-01f, -5.293856820e-03f }, + { -1.167506400e-04f, +5.450415101e-03f, +9.997481313e-01f, -5.176698454e-03f }, + { -1.138100725e-04f, +5.320528660e-03f, +9.997597089e-01f, -5.059393885e-03f }, + { -1.108804418e-04f, +5.190791913e-03f, +9.997710141e-01f, -4.941943068e-03f }, + { -1.079617332e-04f, +5.061204824e-03f, +9.997820469e-01f, -4.824345959e-03f }, + { -1.050539318e-04f, +4.931767353e-03f, +9.997928075e-01f, -4.706602513e-03f }, + { -1.021570230e-04f, +4.802479464e-03f, +9.998032957e-01f, -4.588712686e-03f }, + { -9.927099199e-05f, +4.673341119e-03f, +9.998135116e-01f, -4.470676433e-03f }, + { -9.639582397e-05f, +4.544352281e-03f, +9.998234552e-01f, -4.352493710e-03f }, + { -9.353150418e-05f, +4.415512912e-03f, +9.998331264e-01f, -4.234164473e-03f }, + { -9.067801786e-05f, +4.286822973e-03f, +9.998425252e-01f, -4.115688677e-03f }, + { -8.783535025e-05f, +4.158282427e-03f, +9.998516517e-01f, -3.997066279e-03f }, + { -8.500348659e-05f, +4.029891236e-03f, +9.998605058e-01f, -3.878297235e-03f }, + { -8.218241209e-05f, +3.901649361e-03f, +9.998690875e-01f, -3.759381500e-03f }, + { -7.937211202e-05f, +3.773556765e-03f, +9.998773969e-01f, -3.640319031e-03f }, + { -7.657257158e-05f, +3.645613409e-03f, +9.998854338e-01f, -3.521109785e-03f }, + { -7.378377604e-05f, +3.517819255e-03f, +9.998931984e-01f, -3.401753717e-03f }, + { -7.100571061e-05f, +3.390174264e-03f, +9.999006906e-01f, -3.282250785e-03f }, + { -6.823836055e-05f, +3.262678397e-03f, +9.999079103e-01f, -3.162600944e-03f }, + { -6.548171107e-05f, +3.135331617e-03f, +9.999148577e-01f, -3.042804151e-03f }, + { -6.273574744e-05f, +3.008133883e-03f, +9.999215326e-01f, -2.922860364e-03f }, + { -6.000045487e-05f, +2.881085158e-03f, +9.999279352e-01f, -2.802769538e-03f }, + { -5.727581862e-05f, +2.754185402e-03f, +9.999340653e-01f, -2.682531632e-03f }, + { -5.456182391e-05f, +2.627434576e-03f, +9.999399230e-01f, -2.562146601e-03f }, + { -5.185845600e-05f, +2.500832641e-03f, +9.999455083e-01f, -2.441614402e-03f }, + { -4.916570012e-05f, +2.374379558e-03f, +9.999508211e-01f, -2.320934994e-03f }, + { -4.648354151e-05f, +2.248075287e-03f, +9.999558615e-01f, -2.200108333e-03f }, + { -4.381196542e-05f, +2.121919790e-03f, +9.999606295e-01f, -2.079134377e-03f }, + { -4.115095708e-05f, +1.995913026e-03f, +9.999651250e-01f, -1.958013083e-03f }, + { -3.850050175e-05f, +1.870054956e-03f, +9.999693481e-01f, -1.836744408e-03f }, + { -3.586058466e-05f, +1.744345541e-03f, +9.999732988e-01f, -1.715328311e-03f }, + { -3.323119106e-05f, +1.618784740e-03f, +9.999769770e-01f, -1.593764748e-03f }, + { -3.061230620e-05f, +1.493372514e-03f, +9.999803827e-01f, -1.472053677e-03f }, + { -2.800391533e-05f, +1.368108822e-03f, +9.999835160e-01f, -1.350195058e-03f }, + { -2.540600368e-05f, +1.242993626e-03f, +9.999863768e-01f, -1.228188846e-03f }, + { -2.281855651e-05f, +1.118026884e-03f, +9.999889652e-01f, -1.106035001e-03f }, + { -2.024155907e-05f, +9.932085563e-04f, +9.999912812e-01f, -9.837334803e-04f }, + { -1.767499661e-05f, +8.685386028e-04f, +9.999933246e-01f, -8.612842424e-04f }, + { -1.511885438e-05f, +7.440169831e-04f, +9.999950956e-01f, -7.386872455e-04f }, + { -1.257311763e-05f, +6.196436566e-04f, +9.999965942e-01f, -6.159424479e-04f }, + { -1.003777162e-05f, +4.954185828e-04f, +9.999978203e-01f, -4.930498082e-04f }, + { -7.512801591e-06f, +3.713417210e-04f, +9.999987739e-01f, -3.700092848e-04f }, + { -4.998192808e-06f, +2.474130305e-04f, +9.999994551e-01f, -2.468208365e-04f }, + { -2.493930525e-06f, +1.236324705e-04f, +9.999998638e-01f, -1.234844220e-04f }, +}; diff --git a/Alc/mixer.c b/Alc/mixer.c index 69e52a6e..f4374882 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -43,8 +43,6 @@ static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, extern inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); -alignas(16) ALfloat ResampleCoeffs_FIR4[FRACTIONONE][4]; - enum Resampler { PointResampler, @@ -155,91 +153,10 @@ static inline ResamplerFunc SelectResampler(enum Resampler resampler) } -/* The sinc resampler makes use of a Kaiser window to limit the needed sample - * points to 4. - */ - -#ifndef M_PI -#define M_PI (3.14159265358979323846) -#endif -static inline double Sinc(double x) -{ - if(x == 0.0) return 1.0; - return sin(x*M_PI) / (x*M_PI); -} - -/* The zero-order modified Bessel function of the first kind, used for the - * Kaiser window. - * - * I_0(x) = sum_{k=0}^inf (1 / k!)^2 (x / 2)^(2 k) - * = sum_{k=0}^inf ((x / 2)^k / k!)^2 - */ -static double BesselI_0(double x) -{ - double term, sum, x2, y, last_sum; - int k; - - /* Start at k=1 since k=0 is trivial. */ - term = 1.0; - sum = 1.0; - x2 = x / 2.0; - k = 1; - - /* Let the integration converge until the term of the sum is no longer - * significant. - */ - do { - y = x2 / k; - k ++; - last_sum = sum; - term *= y * y; - sum += term; - } while(sum != last_sum); - return sum; -} - -/* Calculate a Kaiser window from the given beta value and a normalized k - * [-1, 1]. - * - * w(k) = { I_0(B sqrt(1 - k^2)) / I_0(B), -1 <= k <= 1 - * { 0, elsewhere. - * - * Where k can be calculated as: - * - * k = i / l, where -l <= i <= l. - * - * or: - * - * k = 2 i / M - 1, where 0 <= i <= M. - */ -static inline double Kaiser(double b, double k) -{ - if(k <= -1.0 || k >= 1.0) return 0.0; - return BesselI_0(b * sqrt(1.0 - (k*k))) / BesselI_0(b); -} - -static inline double CalcKaiserBeta(double rejection) -{ - if(rejection > 50.0) - return 0.1102 * (rejection - 8.7); - if(rejection >= 21.0) - return (0.5842 * pow(rejection - 21.0, 0.4)) + - (0.07886 * (rejection - 21.0)); - return 0.0; -} - -static float SincKaiser(double r, double x) -{ - /* Limit rippling to -60dB. */ - return (float)(Kaiser(CalcKaiserBeta(60.0), x / r) * Sinc(x)); -} - - void aluInitMixer(void) { enum Resampler resampler = ResamplerDefault; const char *str; - ALuint i; if(ConfigValueStr(NULL, NULL, "resampler", &str)) { @@ -267,15 +184,6 @@ void aluInitMixer(void) } } - for(i = 0;i < FRACTIONONE;i++) - { - ALdouble mu = (ALdouble)i / FRACTIONONE; - ResampleCoeffs_FIR4[i][0] = SincKaiser(2.0, mu - -1.0); - ResampleCoeffs_FIR4[i][1] = SincKaiser(2.0, mu - 0.0); - ResampleCoeffs_FIR4[i][2] = SincKaiser(2.0, mu - 1.0); - ResampleCoeffs_FIR4[i][3] = SincKaiser(2.0, mu - 2.0); - } - MixHrtfSamples = SelectHrtfMixer(); MixSamples = SelectMixer(); ResampleSamples = SelectResampler(resampler); diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 390a1dd2..0ceb9328 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -90,10 +90,10 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), const float32x4_t val1 = vld1q_f32(&src[pos_[1]]); const float32x4_t val2 = vld1q_f32(&src[pos_[2]]); const float32x4_t val3 = vld1q_f32(&src[pos_[3]]); - float32x4_t k0 = vld1q_f32(ResampleCoeffs_FIR4[frac_[0]]); - float32x4_t k1 = vld1q_f32(ResampleCoeffs_FIR4[frac_[1]]); - float32x4_t k2 = vld1q_f32(ResampleCoeffs_FIR4[frac_[2]]); - float32x4_t k3 = vld1q_f32(ResampleCoeffs_FIR4[frac_[3]]); + float32x4_t k0 = vld1q_f32(sinc4Tab[frac_[0]]); + float32x4_t k1 = vld1q_f32(sinc4Tab[frac_[1]]); + float32x4_t k2 = vld1q_f32(sinc4Tab[frac_[2]]); + float32x4_t k3 = vld1q_f32(sinc4Tab[frac_[3]]); float32x4_t out; k0 = vmulq_f32(k0, val0); diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 861cfc38..142cd363 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -55,10 +55,10 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[0]]); - __m128 k1 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[1]]); - __m128 k2 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[2]]); - __m128 k3 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[3]]); + __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); + __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); + __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); + __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 61be4cae..d5f06d90 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -109,10 +109,10 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[0]]); - __m128 k1 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[1]]); - __m128 k2 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[2]]); - __m128 k3 = _mm_load_ps(ResampleCoeffs_FIR4[frac_.i[3]]); + __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); + __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); + __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); + __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 48520b41..7a29915f 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -287,9 +287,8 @@ inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max) { return minu64(max, maxu64(min, val)); } -extern alignas(16) ALfloat ResampleCoeffs_FIR4[FRACTIONONE][4]; - extern alignas(16) const ALfloat bsincTab[18840]; +extern alignas(16) const ALfloat sinc4Tab[FRACTIONONE][4]; inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) @@ -298,8 +297,8 @@ inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) } inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALuint frac) { - const ALfloat *k = ResampleCoeffs_FIR4[frac]; - return k[0]*val0 + k[1]*val1 + k[2]*val2 + k[3]*val3; + return sinc4Tab[frac][0]*val0 + sinc4Tab[frac][1]*val1 + + sinc4Tab[frac][2]*val2 + sinc4Tab[frac][3]*val3; } diff --git a/utils/bsincgen.c b/utils/bsincgen.c index d53b3cb5..33783a27 100644 --- a/utils/bsincgen.c +++ b/utils/bsincgen.c @@ -364,11 +364,49 @@ static void BsiGenerateTables() fprintf(stdout, " },\n {"); for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) fprintf(stdout, " %d,", mt[si]); - fprintf(stdout, " 0 }\n };\n"); + fprintf(stdout, " 0 }\n };\n\n"); +} + + +/* These methods generate a much simplified 4-point sinc interpolator using a + * Kaiser windows. This is much simpler to process at run-time, but has notably + * more aliasing noise. + */ + +/* Same as in alu.h! */ +#define FRACTIONBITS (12) +#define FRACTIONONE (1< Date: Sat, 8 Apr 2017 14:29:08 -0700 Subject: Handle the source offset fraction as an ALsizei --- Alc/mixer.c | 4 ++-- Alc/mixer_c.c | 15 +++++++-------- Alc/mixer_defs.h | 28 ++++++++++++++-------------- Alc/mixer_neon.c | 40 ++++++++++++++++++++-------------------- Alc/mixer_sse.c | 2 +- Alc/mixer_sse2.c | 4 ++-- Alc/mixer_sse3.c | 4 ++-- Alc/mixer_sse41.c | 8 ++++---- OpenAL32/Include/alu.h | 4 ++-- OpenAL32/alSource.c | 16 +++++++++------- 10 files changed, 63 insertions(+), 62 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/mixer.c b/Alc/mixer.c index f4374882..2a30e323 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -41,7 +41,7 @@ static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); -extern inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); +extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); enum Resampler { @@ -280,7 +280,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ALsizei NumChannels, SampleSize; ResamplerFunc Resample; ALsizei DataPosInt; - ALuint DataPosFrac; + ALsizei DataPosFrac; ALint64 DataSize64; ALint increment; ALsizei Counter; diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index bb945e88..f0db2ebc 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -8,16 +8,16 @@ #include "alAuxEffectSlot.h" -static inline ALfloat point32(const ALfloat *restrict vals, ALuint UNUSED(frac)) +static inline ALfloat point32(const ALfloat *restrict vals, ALsizei UNUSED(frac)) { return vals[0]; } -static inline ALfloat lerp32(const ALfloat *restrict vals, ALuint frac) +static inline ALfloat lerp32(const ALfloat *restrict vals, ALsizei frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat fir4_32(const ALfloat *restrict vals, ALuint frac) +static inline ALfloat fir4_32(const ALfloat *restrict vals, ALsizei frac) { return resample_fir4(vals[-1], vals[0], vals[1], vals[2], frac); } const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint UNUSED(frac), ALint UNUSED(increment), + const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), ALfloat *restrict dst, ALsizei numsamples) { #if defined(HAVE_SSE) || defined(HAVE_NEON) @@ -31,7 +31,7 @@ const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), #define DECL_TEMPLATE(Sampler) \ const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ - const ALfloat *restrict src, ALuint frac, ALint increment, \ + const ALfloat *restrict src, ALsizei frac, ALint increment, \ ALfloat *restrict dst, ALsizei numsamples) \ { \ ALsizei i; \ @@ -53,7 +53,7 @@ DECL_TEMPLATE(fir4_32) #undef DECL_TEMPLATE const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { const ALfloat *fil, *scd, *phd, *spd; @@ -79,8 +79,7 @@ const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restr // Apply the scale and phase interpolated filter. r = 0.0f; for(j_f = 0;j_f < m;j_f++) - r += (fil[j_f] + sf*scd[j_f] + pf*(phd[j_f] + sf*spd[j_f])) * - src[j_f]; + r += (fil[j_f] + sf*scd[j_f] + pf*(phd[j_f] + sf*spd[j_f])) * src[j_f]; dst[i] = r; frac += increment; diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index d4a49b53..dce748c5 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -12,11 +12,11 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALuint frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* C mixers */ @@ -52,7 +52,7 @@ void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* SSE resamplers */ -inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) +inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) { ALsizei i; @@ -67,21 +67,21 @@ inline void InitiatePositionArrays(ALuint frac, ALint increment, ALuint *restric } const ALfloat *Resample_lerp32_SSE2(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_lerp32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_fir4_32_SSE3(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_fir4_32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* Neon mixers */ @@ -102,13 +102,13 @@ void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, /* Neon resamplers */ const ALfloat *Resample_lerp32_Neon(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_fir4_32_Neon(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); #endif /* MIXER_DEFS_H */ diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 0ceb9328..65dd608c 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -11,21 +11,21 @@ const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const int32x4_t increment4 = vdupq_n_s32(increment*4); const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); - const uint32x4_t fracMask4 = vdupq_n_u32(FRACTIONMASK); + const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); alignas(16) ALint pos_[4]; - alignas(16) ALuint frac_[4]; + alignas(16) ALsizei frac_[4]; int32x4_t pos4; - uint32x4_t frac4; + int32x4_t frac4; ALsizei i; InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = vld1q_u32(frac_); + frac4 = vld1q_s32(frac_); pos4 = vld1q_s32(pos_); for(i = 0;numsamples-i > 3;i += 4) @@ -35,14 +35,14 @@ const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), /* val1 + (val2-val1)*mu */ const float32x4_t r0 = vsubq_f32(val2, val1); - const float32x4_t mu = vmulq_f32(vcvtq_f32_u32(frac4), fracOne4); + const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); const float32x4_t out = vmlaq_f32(val1, mu, r0); vst1q_f32(&dst[i], out); - frac4 = vaddq_u32(frac4, (uint32x4_t)increment4); - pos4 = vaddq_s32(pos4, (int32x4_t)vshrq_n_u32(frac4, FRACTIONBITS)); - frac4 = vandq_u32(frac4, fracMask4); + frac4 = vaddq_s32(frac4, increment4); + pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); + frac4 = vandq_s32(frac4, fracMask4); vst1q_s32(pos_, pos4); } @@ -54,7 +54,7 @@ const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), * resample. */ ALint pos = pos_[0]; - frac = vgetq_lane_u32(frac4, 0); + frac = vgetq_lane_s32(frac4, 0); do { dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); @@ -67,20 +67,20 @@ const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), } const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const int32x4_t increment4 = vdupq_n_s32(increment*4); - const uint32x4_t fracMask4 = vdupq_n_u32(FRACTIONMASK); + const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); alignas(16) ALint pos_[4]; - alignas(16) ALuint frac_[4]; + alignas(16) ALsizei frac_[4]; int32x4_t pos4; - uint32x4_t frac4; + int32x4_t frac4; ALsizei i; InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = vld1q_u32(frac_); + frac4 = vld1q_s32(frac_); pos4 = vld1q_s32(pos_); --src; @@ -109,12 +109,12 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), vst1q_f32(&dst[i], out); - frac4 = vaddq_u32(frac4, (uint32x4_t)increment4); - pos4 = vaddq_s32(pos4, (int32x4_t)vshrq_n_u32(frac4, FRACTIONBITS)); - frac4 = vandq_u32(frac4, fracMask4); + frac4 = vaddq_s32(frac4, increment4); + pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); + frac4 = vandq_s32(frac4, fracMask4); vst1q_s32(pos_, pos4); - vst1q_u32(frac_, frac4); + vst1q_s32(frac_, frac4); } if(i < numsamples) @@ -137,7 +137,7 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), } const ALfloat *Resample_bsinc32_Neon(const InterpState *state, - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index 37ce953f..d30ec982 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -13,7 +13,7 @@ const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALuint frac, ALint increment, ALfloat *restrict dst, + ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c index a1e8507e..84cc35dd 100644 --- a/Alc/mixer_sse2.c +++ b/Alc/mixer_sse2.c @@ -28,14 +28,14 @@ const ALfloat *Resample_lerp32_SSE2(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALint pos; ALsizei i; diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 142cd363..78603c87 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -32,13 +32,13 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALint pos; ALsizei i; diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index d5f06d90..613a89ff 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -29,14 +29,14 @@ const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALint pos; ALsizei i; @@ -86,13 +86,13 @@ const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), } const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALuint i[4]; float f[4]; } frac_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; __m128i frac4, pos4; ALint pos; ALsizei i; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 7a29915f..4d0ee196 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -173,7 +173,7 @@ typedef struct ALvoice { * sample. */ ATOMIC(ALuint) position; - ATOMIC(ALuint) position_fraction; + ATOMIC(ALsizei) position_fraction; /** * Number of channels and bytes-per-sample for the attached source's @@ -211,7 +211,7 @@ typedef struct ALvoice { typedef const ALfloat* (*ResamplerFunc)(const InterpState *state, - const ALfloat *restrict src, ALuint frac, ALint increment, + const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen ); diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index 071ac8d4..a8c4ce2f 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -53,7 +53,7 @@ static void UpdateSourceProps(ALsource *source, ALsizei num_sends); static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context); -static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALuint *frac); +static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac); static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice); typedef enum SourceProp { @@ -3158,7 +3158,7 @@ static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALui Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); readPos = (ALuint64)ATOMIC_LOAD(&voice->position, almemory_order_relaxed) << 32; - readPos |= ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed) << + readPos |= (ALuint64)ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed) << (32-FRACTIONBITS); } ATOMIC_THREAD_FENCE(almemory_order_acquire); @@ -3258,7 +3258,8 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *conte const ALbufferlistitem *Current; const ALbuffer *Buffer = NULL; ALboolean readFin = AL_FALSE; - ALuint readPos, readPosFrac; + ALuint readPos; + ALsizei readPosFrac; ALuint totalBufferLen; ALboolean looping; ALuint refcount; @@ -3367,7 +3368,8 @@ static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) ALbufferlistitem *BufferList; const ALbuffer *Buffer; ALuint bufferLen, totalBufferLen; - ALuint offset=0, frac=0; + ALuint offset = 0; + ALsizei frac = 0; /* Get sample frame offset */ if(!GetSampleOffset(Source, &offset, &frac)) @@ -3405,7 +3407,7 @@ static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) * or Second offset supplied by the application). This takes into account the * fact that the buffer format may have been modifed since. */ -static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALuint *frac) +static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac) { const ALbuffer *Buffer = NULL; const ALbufferlistitem *BufferList; @@ -3454,13 +3456,13 @@ static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALuint *frac) case AL_SAMPLE_OFFSET: dblfrac = modf(Source->Offset, &dbloff); *offset = (ALuint)mind(dbloff, UINT_MAX); - *frac = (ALuint)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); + *frac = (ALsizei)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); break; case AL_SEC_OFFSET: dblfrac = modf(Source->Offset*Buffer->Frequency, &dbloff); *offset = (ALuint)mind(dbloff, UINT_MAX); - *frac = (ALuint)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); + *frac = (ALsizei)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); break; } Source->OffsetType = AL_NONE; -- cgit v1.2.3 From 5008024e73e7451c25a4c8729bfb636699615e8e Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 16 Aug 2017 18:09:53 -0700 Subject: Store the sinc4 table in the filter state Also rename the resampler functions to remove the unnecessary '32' token. --- Alc/ALu.c | 14 +++++++++--- Alc/converter.c | 2 +- Alc/mixer.c | 28 ++++++++++++------------ Alc/mixer_c.c | 42 +++++++++++++++++++++++++----------- Alc/mixer_defs.h | 58 +++++++++++++++++++++++++------------------------- Alc/mixer_neon.c | 17 ++++++++------- Alc/mixer_sse.c | 6 +++--- Alc/mixer_sse2.c | 2 +- Alc/mixer_sse3.c | 13 +++++------ Alc/mixer_sse41.c | 15 +++++++------ OpenAL32/Include/alu.h | 18 ++++++++++------ 11 files changed, 123 insertions(+), 92 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/ALu.c b/Alc/ALu.c index 2b83ea00..6f0f602c 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -69,7 +69,9 @@ extern inline ALuint64 maxu64(ALuint64 a, ALuint64 b); extern inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max); extern inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu); -extern inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALsizei frac); +extern inline ALfloat resample_fir4(const ALfloat (*restrict filter)[4], + ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, + ALsizei frac); extern inline void aluVectorSet(aluVector *restrict vector, ALfloat x, ALfloat y, ALfloat z, ALfloat w); @@ -1037,7 +1039,10 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + if(props->Resampler == BSincResampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + else + voice->ResampleState.sinc4.filter = sinc4Tab; voice->Resampler = SelectResampler(props->Resampler); /* Calculate gains */ @@ -1380,7 +1385,10 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + if(props->Resampler == BSincResampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + else + voice->ResampleState.sinc4.filter = sinc4Tab; voice->Resampler = SelectResampler(props->Resampler); if(Distance > FLT_EPSILON) diff --git a/Alc/converter.c b/Alc/converter.c index 5cfe7031..304e9a80 100644 --- a/Alc/converter.c +++ b/Alc/converter.c @@ -29,7 +29,7 @@ SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType step = fastf2i(minf((ALdouble)srcRate / dstRate, MAX_PITCH)*FRACTIONONE + 0.5f); converter->mIncrement = maxi(step, 1); if(converter->mIncrement == FRACTIONONE) - converter->mResample = Resample_copy32_C; + converter->mResample = Resample_copy_C; else { /* TODO: Allow other resamplers. */ diff --git a/Alc/mixer.c b/Alc/mixer.c index ff16452f..bb71fde4 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -112,48 +112,48 @@ ResamplerFunc SelectResampler(enum Resampler resampler) switch(resampler) { case PointResampler: - return Resample_point32_C; + return Resample_point_C; case LinearResampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_lerp32_Neon; + return Resample_lerp_Neon; #endif #ifdef HAVE_SSE4_1 if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_lerp32_SSE41; + return Resample_lerp_SSE41; #endif #ifdef HAVE_SSE2 if((CPUCapFlags&CPU_CAP_SSE2)) - return Resample_lerp32_SSE2; + return Resample_lerp_SSE2; #endif - return Resample_lerp32_C; + return Resample_lerp_C; case FIR4Resampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_fir4_32_Neon; + return Resample_fir4_Neon; #endif #ifdef HAVE_SSE4_1 if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_fir4_32_SSE41; + return Resample_fir4_SSE41; #endif #ifdef HAVE_SSE3 if((CPUCapFlags&CPU_CAP_SSE3)) - return Resample_fir4_32_SSE3; + return Resample_fir4_SSE3; #endif - return Resample_fir4_32_C; + return Resample_fir4_C; case BSincResampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_bsinc32_Neon; + return Resample_bsinc_Neon; #endif #ifdef HAVE_SSE if((CPUCapFlags&CPU_CAP_SSE)) - return Resample_bsinc32_SSE; + return Resample_bsinc_SSE; #endif - return Resample_bsinc32_C; + return Resample_bsinc_C; } - return Resample_point32_C; + return Resample_point_C; } @@ -312,7 +312,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0); Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ? - Resample_copy32_C : voice->Resampler); + Resample_copy_C : voice->Resampler); Counter = (voice->Flags&VOICE_IS_FADING) ? SamplesToDo : 0; firstpass = true; diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 6d616cbf..738789f9 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -8,15 +8,13 @@ #include "alAuxEffectSlot.h" -static inline ALfloat point32(const ALfloat *restrict vals, ALsizei UNUSED(frac)) +static inline ALfloat do_point(const ALfloat *restrict vals, ALsizei UNUSED(frac)) { return vals[0]; } -static inline ALfloat lerp32(const ALfloat *restrict vals, ALsizei frac) +static inline ALfloat do_lerp(const ALfloat *restrict vals, ALsizei frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat fir4_32(const ALfloat *restrict vals, ALsizei frac) -{ return resample_fir4(vals[-1], vals[0], vals[1], vals[2], frac); } -const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), +const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), ALfloat *restrict dst, ALsizei numsamples) { @@ -29,8 +27,8 @@ const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), return dst; } -#define DECL_TEMPLATE(Sampler) \ -const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ +#define DECL_TEMPLATE(Tag, Sampler) \ +const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ const ALfloat *restrict src, ALsizei frac, ALint increment, \ ALfloat *restrict dst, ALsizei numsamples) \ { \ @@ -46,15 +44,33 @@ const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ return dst; \ } -DECL_TEMPLATE(point32) -DECL_TEMPLATE(lerp32) -DECL_TEMPLATE(fir4_32) +DECL_TEMPLATE(point, do_point) +DECL_TEMPLATE(lerp, do_lerp) #undef DECL_TEMPLATE -const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) +const ALfloat *Resample_fir4_C(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples) +{ + const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); + ALsizei i; + + src -= 1; + for(i = 0;i < numsamples;i++) + { + dst[i] = resample_fir4(filter, src[0], src[1], src[2], src[3], frac); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + +const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) { const ALfloat *fil, *scd, *phd, *spd; const ALfloat *filter = state->bsinc.filter; diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index 462d6179..364bbf7a 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -12,11 +12,11 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_fir4_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* C mixers */ @@ -76,23 +76,23 @@ inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restr } } -const ALfloat *Resample_lerp32_SSE2(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_lerp32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); +const ALfloat *Resample_lerp_SSE2(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE3(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); +const ALfloat *Resample_fir4_SSE3(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_fir4_SSE41(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); -const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); /* Neon mixers */ void MixHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, @@ -116,14 +116,14 @@ void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* Neon resamplers */ -const ALfloat *Resample_lerp32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir4_32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); +const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_fir4_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); #endif /* MIXER_DEFS_H */ diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index dd7e4226..fbd0f158 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -10,7 +10,7 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), +const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { @@ -66,10 +66,11 @@ const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), return dst; } -const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), +const ALfloat *Resample_fir4_Neon(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { + const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); const int32x4_t increment4 = vdupq_n_s32(increment*4); const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); alignas(16) ALint pos_[4]; @@ -90,10 +91,10 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), const float32x4_t val1 = vld1q_f32(&src[pos_[1]]); const float32x4_t val2 = vld1q_f32(&src[pos_[2]]); const float32x4_t val3 = vld1q_f32(&src[pos_[3]]); - float32x4_t k0 = vld1q_f32(sinc4Tab[frac_[0]]); - float32x4_t k1 = vld1q_f32(sinc4Tab[frac_[1]]); - float32x4_t k2 = vld1q_f32(sinc4Tab[frac_[2]]); - float32x4_t k3 = vld1q_f32(sinc4Tab[frac_[3]]); + float32x4_t k0 = vld1q_f32(filter[frac_[0]]); + float32x4_t k1 = vld1q_f32(filter[frac_[1]]); + float32x4_t k2 = vld1q_f32(filter[frac_[2]]); + float32x4_t k3 = vld1q_f32(filter[frac_[3]]); float32x4_t out; k0 = vmulq_f32(k0, val0); @@ -126,7 +127,7 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), ALint pos = pos_[0]; frac = frac_[0]; do { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); frac += increment; pos += frac>>FRACTIONBITS; @@ -136,7 +137,7 @@ const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), return dst; } -const ALfloat *Resample_bsinc32_Neon(const InterpState *state, +const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) { diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index bd7928e4..c2514c46 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -12,9 +12,9 @@ #include "mixer_defs.h" -const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) { const ALfloat *filter = state->bsinc.filter; const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c index 84cc35dd..3f8224e7 100644 --- a/Alc/mixer_sse2.c +++ b/Alc/mixer_sse2.c @@ -27,7 +27,7 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE2(const InterpState* UNUSED(state), +const ALfloat *Resample_lerp_SSE2(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 78603c87..7e98105c 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -31,10 +31,11 @@ #include "mixer_defs.h" -const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), +const ALfloat *Resample_fir4_SSE3(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { + const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; @@ -55,10 +56,10 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); - __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); - __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); - __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); + __m128 k0 = _mm_load_ps(filter[frac_.i[0]]); + __m128 k1 = _mm_load_ps(filter[frac_.i[1]]); + __m128 k2 = _mm_load_ps(filter[frac_.i[2]]); + __m128 k3 = _mm_load_ps(filter[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); @@ -87,7 +88,7 @@ const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), for(;i < numsamples;i++) { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 613a89ff..20a9d9c7 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -28,7 +28,7 @@ #include "mixer_defs.h" -const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), +const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { @@ -85,10 +85,11 @@ const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), return dst; } -const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), +const ALfloat *Resample_fir4_SSE41(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { + const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); union { alignas(16) ALint i[4]; float f[4]; } pos_; @@ -109,10 +110,10 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); - __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); - __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); - __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); + __m128 k0 = _mm_load_ps(filter[frac_.i[0]]); + __m128 k1 = _mm_load_ps(filter[frac_.i[1]]); + __m128 k2 = _mm_load_ps(filter[frac_.i[2]]); + __m128 k3 = _mm_load_ps(filter[frac_.i[3]]); __m128 out; k0 = _mm_mul_ps(k0, val0); @@ -144,7 +145,7 @@ const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), for(;i < numsamples;i++) { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 78f05b63..b1c62553 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -59,7 +59,9 @@ enum Resampler { }; extern enum Resampler ResamplerDefault; -/* The number of distinct scale and phase intervals within the filter table. */ +/* The number of distinct scale and phase intervals within the bsinc filter + * table. + */ #define BSINC_SCALE_BITS 4 #define BSINC_SCALE_COUNT (1< Date: Fri, 18 Aug 2017 19:20:30 -0700 Subject: Pass the filter entry to apply to resample_fir4 --- Alc/ALu.c | 5 ++--- Alc/mixer_c.c | 2 +- Alc/mixer_neon.c | 2 +- Alc/mixer_sse3.c | 2 +- Alc/mixer_sse41.c | 2 +- OpenAL32/Include/alu.h | 5 ++--- 6 files changed, 8 insertions(+), 10 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/ALu.c b/Alc/ALu.c index 6f0f602c..6c37df78 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -69,9 +69,8 @@ extern inline ALuint64 maxu64(ALuint64 a, ALuint64 b); extern inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max); extern inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu); -extern inline ALfloat resample_fir4(const ALfloat (*restrict filter)[4], - ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, - ALsizei frac); +extern inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, + const ALfloat *restrict filter); extern inline void aluVectorSet(aluVector *restrict vector, ALfloat x, ALfloat y, ALfloat z, ALfloat w); diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 738789f9..1635476a 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -59,7 +59,7 @@ const ALfloat *Resample_fir4_C(const InterpState *state, const ALfloat *restrict src -= 1; for(i = 0;i < numsamples;i++) { - dst[i] = resample_fir4(filter, src[0], src[1], src[2], src[3], frac); + dst[i] = resample_fir4(src[0], src[1], src[2], src[3], filter[frac]); frac += increment; src += frac>>FRACTIONBITS; diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index fbd0f158..3345290c 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -127,7 +127,7 @@ const ALfloat *Resample_fir4_Neon(const InterpState *state, ALint pos = pos_[0]; frac = frac_[0]; do { - dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index 7e98105c..d60fed5f 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -88,7 +88,7 @@ const ALfloat *Resample_fir4_SSE3(const InterpState *state, for(;i < numsamples;i++) { - dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 20a9d9c7..354d16b7 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -145,7 +145,7 @@ const ALfloat *Resample_fir4_SSE41(const InterpState *state, for(;i < numsamples;i++) { - dst[i] = resample_fir4(filter, src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index b1c62553..d902a8c4 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -392,10 +392,9 @@ inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) { return val1 + (val2-val1)*mu; } -inline ALfloat resample_fir4(const ALfloat (*restrict filter)[4], ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALsizei frac) +inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, const ALfloat *restrict filter) { - return filter[frac][0]*val0 + filter[frac][1]*val1 + - filter[frac][2]*val2 + filter[frac][3]*val3; + return filter[0]*val0 + filter[1]*val1 + filter[2]*val2 + filter[3]*val3; } -- cgit v1.2.3 From 4cc1c646466737ba411aa23ce4a6116936ada8c2 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 7 Jan 2018 05:32:07 -0800 Subject: Replace the sinc4 resampler with cubic Turns out the C version of the cubic resampler is just slightly faster than even the SSE3 version of the FIR4 resampler. This is likely due to not using a 64KB random-access lookup table along with unaligned loads, both offseting the gains from SSE. --- Alc/ALu.c | 2 - Alc/mixer.c | 20 ++------ Alc/mixer_c.c | 39 +++++++-------- Alc/mixer_defs.h | 12 +---- Alc/mixer_neon.c | 71 --------------------------- Alc/mixer_sse3.c | 98 -------------------------------------- Alc/mixer_sse41.c | 69 --------------------------- OpenAL32/Include/alu.h | 4 -- OpenAL32/alState.c | 4 +- alsoftrc.sample | 2 +- utils/alsoft-config/mainwindow.cpp | 2 +- 11 files changed, 25 insertions(+), 298 deletions(-) (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/ALu.c b/Alc/ALu.c index 5f0c556a..1964e6c7 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -69,8 +69,6 @@ extern inline ALuint64 maxu64(ALuint64 a, ALuint64 b); extern inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max); extern inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu); -extern inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, - const ALfloat *restrict filter); extern inline void aluVectorSet(aluVector *restrict vector, ALfloat x, ALfloat y, ALfloat z, ALfloat w); diff --git a/Alc/mixer.c b/Alc/mixer.c index 5d6d14d7..a7f0f302 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -128,19 +128,7 @@ ResamplerFunc SelectResampler(enum Resampler resampler) #endif return Resample_lerp_C; case FIR4Resampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_fir4_Neon; -#endif -#ifdef HAVE_SSE4_1 - if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_fir4_SSE41; -#endif -#ifdef HAVE_SSE3 - if((CPUCapFlags&CPU_CAP_SSE3)) - return Resample_fir4_SSE3; -#endif - return Resample_fir4_C; + return Resample_cubic_C; case BSinc12Resampler: case BSinc24Resampler: #ifdef HAVE_NEON @@ -168,7 +156,7 @@ void aluInitMixer(void) ResamplerDefault = PointResampler; else if(strcasecmp(str, "linear") == 0) ResamplerDefault = LinearResampler; - else if(strcasecmp(str, "sinc4") == 0) + else if(strcasecmp(str, "cubic") == 0) ResamplerDefault = FIR4Resampler; else if(strcasecmp(str, "bsinc12") == 0) ResamplerDefault = BSinc12Resampler; @@ -179,9 +167,9 @@ void aluInitMixer(void) WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); ResamplerDefault = BSinc12Resampler; } - else if(strcasecmp(str, "cubic") == 0 || strcasecmp(str, "sinc8") == 0) + else if(strcasecmp(str, "sinc4") == 0 || strcasecmp(str, "sinc8") == 0) { - WARN("Resampler option \"%s\" is deprecated, using sinc4\n", str); + WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); ResamplerDefault = FIR4Resampler; } else diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index e468fedb..41445fc4 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -12,7 +12,16 @@ static inline ALfloat do_point(const ALfloat *restrict vals, ALsizei UNUSED(frac { return vals[0]; } static inline ALfloat do_lerp(const ALfloat *restrict vals, ALsizei frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } - +static inline ALfloat do_cubic(const ALfloat *restrict vals, ALsizei frac) +{ + ALfloat mu = frac * (1.0f/FRACTIONONE); + ALfloat mu2 = mu*mu, mu3 = mu2*mu; + ALfloat a0 = -0.5f*mu3 + mu2 + -0.5f*mu; + ALfloat a1 = 1.5f*mu3 + -2.5f*mu2 + 1.0f; + ALfloat a2 = -1.5f*mu3 + 2.0f*mu2 + 0.5f*mu; + ALfloat a3 = 0.5f*mu3 + -0.5f*mu2; + return vals[0]*a0 + vals[1]*a1 + vals[2]*a2 + vals[3]*a3; +} const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), @@ -27,12 +36,14 @@ const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), return dst; } -#define DECL_TEMPLATE(Tag, Sampler) \ +#define DECL_TEMPLATE(Tag, Sampler, O) \ const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ const ALfloat *restrict src, ALsizei frac, ALint increment, \ ALfloat *restrict dst, ALsizei numsamples) \ { \ ALsizei i; \ + \ + src -= O; \ for(i = 0;i < numsamples;i++) \ { \ dst[i] = Sampler(src, frac); \ @@ -44,30 +55,12 @@ const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ return dst; \ } -DECL_TEMPLATE(point, do_point) -DECL_TEMPLATE(lerp, do_lerp) +DECL_TEMPLATE(point, do_point, 0) +DECL_TEMPLATE(lerp, do_lerp, 0) +DECL_TEMPLATE(cubic, do_cubic, 1) #undef DECL_TEMPLATE -const ALfloat *Resample_fir4_C(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples) -{ - const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); - ALsizei i; - - src -= 1; - for(i = 0;i < numsamples;i++) - { - dst[i] = resample_fir4(src[0], src[1], src[2], src[3], filter[frac]); - - frac += increment; - src += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h index 364bbf7a..fe19cef4 100644 --- a/Alc/mixer_defs.h +++ b/Alc/mixer_defs.h @@ -15,7 +15,7 @@ struct HrtfState; const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir4_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_cubic_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); @@ -83,13 +83,6 @@ const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *rest ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir4_SSE3(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir4_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); - const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); @@ -119,9 +112,6 @@ void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples); -const ALfloat *Resample_fir4_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index b99dcf69..631e4f7c 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -66,77 +66,6 @@ const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), return dst; } -const ALfloat *Resample_fir4_Neon(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALsizei frac_[4]; - int32x4_t pos4; - int32x4_t frac4; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - - frac4 = vld1q_s32(frac_); - pos4 = vld1q_s32(pos_); - - --src; - for(i = 0;numsamples-i > 3;i += 4) - { - const float32x4_t val0 = vld1q_f32(&src[pos_[0]]); - const float32x4_t val1 = vld1q_f32(&src[pos_[1]]); - const float32x4_t val2 = vld1q_f32(&src[pos_[2]]); - const float32x4_t val3 = vld1q_f32(&src[pos_[3]]); - float32x4_t k0 = vld1q_f32(filter[frac_[0]]); - float32x4_t k1 = vld1q_f32(filter[frac_[1]]); - float32x4_t k2 = vld1q_f32(filter[frac_[2]]); - float32x4_t k3 = vld1q_f32(filter[frac_[3]]); - float32x4_t out; - - k0 = vmulq_f32(k0, val0); - k1 = vmulq_f32(k1, val1); - k2 = vmulq_f32(k2, val2); - k3 = vmulq_f32(k3, val3); - k0 = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k1), vget_high_f32(k1))); - k2 = vcombine_f32(vpadd_f32(vget_low_f32(k2), vget_high_f32(k2)), - vpadd_f32(vget_low_f32(k3), vget_high_f32(k3))); - out = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k2), vget_high_f32(k2))); - - vst1q_f32(&dst[i], out); - - frac4 = vaddq_s32(frac4, increment4); - pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); - frac4 = vandq_s32(frac4, fracMask4); - - vst1q_s32(pos_, pos4); - vst1q_s32(frac_, frac4); - } - - if(i < numsamples) - { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - ALint pos = pos_[0]; - frac = frac_[0]; - do { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); - } - return dst; -} - const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen) diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c index d60fed5f..e69de29b 100644 --- a/Alc/mixer_sse3.c +++ b/Alc/mixer_sse3.c @@ -1,98 +0,0 @@ -/** - * OpenAL cross platform audio library, SSE3 mixer functions - * - * Copyright (C) 2014 by Timothy Arceri . - * Copyright (C) 2015 by Chris Robinson . - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alu.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_fir4_SSE3(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - --src; - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(filter[frac_.i[0]]); - __m128 k1 = _mm_load_ps(filter[frac_.i[1]]); - __m128 k2 = _mm_load_ps(filter[frac_.i[2]]); - __m128 k3 = _mm_load_ps(filter[frac_.i[3]]); - __m128 out; - - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out = _mm_hadd_ps(k0, k2); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); - _mm_store_ps(frac_.f, _mm_castsi128_ps(frac4)); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = pos_.i[0]; - frac = frac_.i[0]; - - for(;i < numsamples;i++) - { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c index 354d16b7..4f88d540 100644 --- a/Alc/mixer_sse41.c +++ b/Alc/mixer_sse41.c @@ -84,72 +84,3 @@ const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), } return dst; } - -const ALfloat *Resample_fir4_SSE41(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const ALfloat (*restrict filter)[4] = ASSUME_ALIGNED(state->sinc4.filter, 16); - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - --src; - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(filter[frac_.i[0]]); - __m128 k1 = _mm_load_ps(filter[frac_.i[1]]); - __m128 k2 = _mm_load_ps(filter[frac_.i[2]]); - __m128 k3 = _mm_load_ps(filter[frac_.i[3]]); - __m128 out; - - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out = _mm_hadd_ps(k0, k2); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - pos_.i[0] = _mm_extract_epi32(pos4, 0); - pos_.i[1] = _mm_extract_epi32(pos4, 1); - pos_.i[2] = _mm_extract_epi32(pos4, 2); - pos_.i[3] = _mm_extract_epi32(pos4, 3); - frac_.i[0] = _mm_extract_epi32(frac4, 0); - frac_.i[1] = _mm_extract_epi32(frac4, 1); - frac_.i[2] = _mm_extract_epi32(frac4, 2); - frac_.i[3] = _mm_extract_epi32(frac4, 3); - } - - pos = pos_.i[0]; - frac = frac_.i[0]; - - for(;i < numsamples;i++) - { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], filter[frac]); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 625da0dc..c427df0c 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -396,10 +396,6 @@ inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) { return val1 + (val2-val1)*mu; } -inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, const ALfloat *restrict filter) -{ - return filter[0]*val0 + filter[1]*val1 + filter[2]*val2 + filter[3]*val3; -} enum HrtfRequestMode { diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c index 623e1d6b..c8c81065 100644 --- a/OpenAL32/alState.c +++ b/OpenAL32/alState.c @@ -50,7 +50,7 @@ static const ALchar alErrOutOfMemory[] = "Out of Memory"; /* Resampler strings */ static const ALchar alPointResampler[] = "Nearest"; static const ALchar alLinearResampler[] = "Linear"; -static const ALchar alSinc4Resampler[] = "3rd order Sinc"; +static const ALchar alCubicResampler[] = "Cubic"; static const ALchar alBSinc12Resampler[] = "11th order Sinc"; static const ALchar alBSinc24Resampler[] = "23rd order Sinc"; @@ -761,7 +761,7 @@ AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) { const char *ResamplerNames[] = { alPointResampler, alLinearResampler, - alSinc4Resampler, alBSinc12Resampler, + alCubicResampler, alBSinc12Resampler, alBSinc24Resampler, }; const ALchar *value = NULL; diff --git a/alsoftrc.sample b/alsoftrc.sample index 41c884ad..68d45220 100644 --- a/alsoftrc.sample +++ b/alsoftrc.sample @@ -149,7 +149,7 @@ # Selects the resampler used when mixing sources. Valid values are: # point - nearest sample, no interpolation # linear - extrapolates samples using a linear slope between samples -# sinc4 - extrapolates samples using a 4-point Sinc filter +# cubic - extrapolates samples using a Catmull-Rom spline # bsinc12 - extrapolates samples using a band-limited Sinc filter (varying # between 12 and 24 points, with anti-aliasing) # bsinc24 - extrapolates samples using a band-limited Sinc filter (varying diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp index 31419479..f1bbf7db 100644 --- a/utils/alsoft-config/mainwindow.cpp +++ b/utils/alsoft-config/mainwindow.cpp @@ -100,7 +100,7 @@ static const struct NameValuePair { { "Point", "point" }, { "Linear", "linear" }, { "Default (Linear)", "" }, - { "3rd order Sinc", "sinc4" }, + { "Cubic Spline", "cubic" }, { "11th order Sinc", "bsinc12" }, { "23rd order Sinc", "bsinc24" }, -- cgit v1.2.3 From 091e676db34ff51a709427d5b1203bfcd0788fb4 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 22 Mar 2018 05:06:15 -0700 Subject: Move mixer sources into a sub-directory --- Alc/ALu.c | 2 +- Alc/bformatdec.c | 1 - Alc/converter.c | 2 +- Alc/effects/reverb.c | 1 - Alc/mixer.c | 781 ------------------------------------------------ Alc/mixer/defs.h | 119 ++++++++ Alc/mixer/mixer_c.c | 209 +++++++++++++ Alc/mixer/mixer_inc.c | 114 +++++++ Alc/mixer/mixer_neon.c | 261 ++++++++++++++++ Alc/mixer/mixer_sse.c | 229 ++++++++++++++ Alc/mixer/mixer_sse2.c | 82 +++++ Alc/mixer/mixer_sse3.c | 0 Alc/mixer/mixer_sse41.c | 86 ++++++ Alc/mixer_c.c | 208 ------------- Alc/mixer_defs.h | 119 -------- Alc/mixer_inc.c | 114 ------- Alc/mixer_neon.c | 261 ---------------- Alc/mixer_sse.c | 229 -------------- Alc/mixer_sse2.c | 82 ----- Alc/mixer_sse3.c | 0 Alc/mixer_sse41.c | 86 ------ Alc/mixvoice.c | 781 ++++++++++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 24 +- 23 files changed, 1895 insertions(+), 1896 deletions(-) delete mode 100644 Alc/mixer.c create mode 100644 Alc/mixer/defs.h create mode 100644 Alc/mixer/mixer_c.c create mode 100644 Alc/mixer/mixer_inc.c create mode 100644 Alc/mixer/mixer_neon.c create mode 100644 Alc/mixer/mixer_sse.c create mode 100644 Alc/mixer/mixer_sse2.c create mode 100644 Alc/mixer/mixer_sse3.c create mode 100644 Alc/mixer/mixer_sse41.c delete mode 100644 Alc/mixer_c.c delete mode 100644 Alc/mixer_defs.h delete mode 100644 Alc/mixer_inc.c delete mode 100644 Alc/mixer_neon.c delete mode 100644 Alc/mixer_sse.c delete mode 100644 Alc/mixer_sse2.c delete mode 100644 Alc/mixer_sse3.c delete mode 100644 Alc/mixer_sse41.c create mode 100644 Alc/mixvoice.c (limited to 'Alc/mixer_sse3.c') diff --git a/Alc/ALu.c b/Alc/ALu.c index 1aa35cb7..63d13838 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -40,9 +40,9 @@ #include "static_assert.h" #include "ringbuffer.h" +#include "mixer/defs.h" #include "fpu_modes.h" #include "cpu_caps.h" -#include "mixer_defs.h" #include "bsinc_inc.h" #include "backends/base.h" diff --git a/Alc/bformatdec.c b/Alc/bformatdec.c index 28dbc742..ff0cd657 100644 --- a/Alc/bformatdec.c +++ b/Alc/bformatdec.c @@ -3,7 +3,6 @@ #include "bformatdec.h" #include "ambdec.h" -#include "mixer_defs.h" #include "alu.h" #include "bool.h" diff --git a/Alc/converter.c b/Alc/converter.c index 157073f2..6e28b4a6 100644 --- a/Alc/converter.c +++ b/Alc/converter.c @@ -4,7 +4,7 @@ #include "converter.h" #include "fpu_modes.h" -#include "mixer_defs.h" +#include "mixer/defs.h" SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType dstType, ALsizei numchans, ALsizei srcRate, ALsizei dstRate) diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c index bd5553ad..ff1ee143 100644 --- a/Alc/effects/reverb.c +++ b/Alc/effects/reverb.c @@ -31,7 +31,6 @@ #include "alFilter.h" #include "alListener.h" #include "alError.h" -#include "mixer_defs.h" /* This is a user config option for modifying the overall output of the reverb * effect. diff --git a/Alc/mixer.c b/Alc/mixer.c deleted file mode 100644 index 7a7bbfe0..00000000 --- a/Alc/mixer.c +++ /dev/null @@ -1,781 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "AL/al.h" -#include "AL/alc.h" -#include "alSource.h" -#include "alBuffer.h" -#include "alListener.h" -#include "alAuxEffectSlot.h" -#include "sample_cvt.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" - -#include "cpu_caps.h" -#include "mixer_defs.h" - - -static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, - "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); - -extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); - - -/* BSinc24 requires up to 23 extra samples before the current position, and 24 after. */ -static_assert(MAX_RESAMPLE_PADDING >= 24, "MAX_RESAMPLE_PADDING must be at least 24!"); - - -enum Resampler ResamplerDefault = LinearResampler; - -MixerFunc MixSamples = Mix_C; -RowMixerFunc MixRowSamples = MixRow_C; -static HrtfMixerFunc MixHrtfSamples = MixHrtf_C; -static HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_C; - -static MixerFunc SelectMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Mix_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return Mix_SSE; -#endif - return Mix_C; -} - -static RowMixerFunc SelectRowMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixRow_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixRow_SSE; -#endif - return MixRow_C; -} - -static inline HrtfMixerFunc SelectHrtfMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixHrtf_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixHrtf_SSE; -#endif - return MixHrtf_C; -} - -static inline HrtfMixerBlendFunc SelectHrtfBlendMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixHrtfBlend_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixHrtfBlend_SSE; -#endif - return MixHrtfBlend_C; -} - -ResamplerFunc SelectResampler(enum Resampler resampler) -{ - switch(resampler) - { - case PointResampler: - return Resample_point_C; - case LinearResampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_lerp_Neon; -#endif -#ifdef HAVE_SSE4_1 - if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_lerp_SSE41; -#endif -#ifdef HAVE_SSE2 - if((CPUCapFlags&CPU_CAP_SSE2)) - return Resample_lerp_SSE2; -#endif - return Resample_lerp_C; - case FIR4Resampler: - return Resample_cubic_C; - case BSinc12Resampler: - case BSinc24Resampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_bsinc_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return Resample_bsinc_SSE; -#endif - return Resample_bsinc_C; - } - - return Resample_point_C; -} - - -void aluInitMixer(void) -{ - const char *str; - - if(ConfigValueStr(NULL, NULL, "resampler", &str)) - { - if(strcasecmp(str, "point") == 0 || strcasecmp(str, "none") == 0) - ResamplerDefault = PointResampler; - else if(strcasecmp(str, "linear") == 0) - ResamplerDefault = LinearResampler; - else if(strcasecmp(str, "cubic") == 0) - ResamplerDefault = FIR4Resampler; - else if(strcasecmp(str, "bsinc12") == 0) - ResamplerDefault = BSinc12Resampler; - else if(strcasecmp(str, "bsinc24") == 0) - ResamplerDefault = BSinc24Resampler; - else if(strcasecmp(str, "bsinc") == 0) - { - WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); - ResamplerDefault = BSinc12Resampler; - } - else if(strcasecmp(str, "sinc4") == 0 || strcasecmp(str, "sinc8") == 0) - { - WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); - ResamplerDefault = FIR4Resampler; - } - else - { - char *end; - long n = strtol(str, &end, 0); - if(*end == '\0' && (n == PointResampler || n == LinearResampler || n == FIR4Resampler)) - ResamplerDefault = n; - else - WARN("Invalid resampler: %s\n", str); - } - } - - MixHrtfBlendSamples = SelectHrtfBlendMixer(); - MixHrtfSamples = SelectHrtfMixer(); - MixSamples = SelectMixer(); - MixRowSamples = SelectRowMixer(); -} - - -static void SendAsyncEvent(ALCcontext *context, ALuint enumtype, ALenum type, - ALuint objid, ALuint param, const char *msg) -{ - AsyncEvent evt; - evt.EnumType = enumtype; - evt.Type = type; - evt.ObjectId = objid; - evt.Param = param; - strcpy(evt.Message, msg); - if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) - alsem_post(&context->EventSem); -} - - -static inline ALfloat Sample_ALubyte(ALubyte val) -{ return (val-128) * (1.0f/128.0f); } - -static inline ALfloat Sample_ALshort(ALshort val) -{ return val * (1.0f/32768.0f); } - -static inline ALfloat Sample_ALfloat(ALfloat val) -{ return val; } - -static inline ALfloat Sample_ALdouble(ALdouble val) -{ return (ALfloat)val; } - -typedef ALubyte ALmulaw; -static inline ALfloat Sample_ALmulaw(ALmulaw val) -{ return muLawDecompressionTable[val] * (1.0f/32768.0f); } - -typedef ALubyte ALalaw; -static inline ALfloat Sample_ALalaw(ALalaw val) -{ return aLawDecompressionTable[val] * (1.0f/32768.0f); } - -#define DECL_TEMPLATE(T) \ -static inline void Load_##T(ALfloat *restrict dst, const T *restrict src, \ - ALint srcstep, ALsizei samples) \ -{ \ - ALsizei i; \ - for(i = 0;i < samples;i++) \ - dst[i] += Sample_##T(src[i*srcstep]); \ -} - -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - -static void LoadSamples(ALfloat *restrict dst, const ALvoid *restrict src, ALint srcstep, - enum FmtType srctype, ALsizei samples) -{ -#define HANDLE_FMT(ET, ST) case ET: Load_##ST(dst, src, srcstep, samples); break - switch(srctype) - { - HANDLE_FMT(FmtUByte, ALubyte); - HANDLE_FMT(FmtShort, ALshort); - HANDLE_FMT(FmtFloat, ALfloat); - HANDLE_FMT(FmtDouble, ALdouble); - HANDLE_FMT(FmtMulaw, ALmulaw); - HANDLE_FMT(FmtAlaw, ALalaw); - } -#undef HANDLE_FMT -} - - -static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter, - ALfloat *restrict dst, const ALfloat *restrict src, - ALsizei numsamples, enum ActiveFilters type) -{ - ALsizei i; - switch(type) - { - case AF_None: - ALfilterState_processPassthru(lpfilter, src, numsamples); - ALfilterState_processPassthru(hpfilter, src, numsamples); - break; - - case AF_LowPass: - ALfilterState_process(lpfilter, dst, src, numsamples); - ALfilterState_processPassthru(hpfilter, dst, numsamples); - return dst; - case AF_HighPass: - ALfilterState_processPassthru(lpfilter, src, numsamples); - ALfilterState_process(hpfilter, dst, src, numsamples); - return dst; - - case AF_BandPass: - for(i = 0;i < numsamples;) - { - ALfloat temp[256]; - ALsizei todo = mini(256, numsamples-i); - - ALfilterState_process(lpfilter, temp, src+i, todo); - ALfilterState_process(hpfilter, dst+i, temp, todo); - i += todo; - } - return dst; - } - return src; -} - - -/* This function uses these device temp buffers. */ -#define SOURCE_DATA_BUF 0 -#define RESAMPLED_BUF 1 -#define FILTERED_BUF 2 -#define NFC_DATA_BUF 3 -ALboolean MixSource(ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo) -{ - ALCdevice *Device = Context->Device; - ALbufferlistitem *BufferListItem; - ALbufferlistitem *BufferLoopItem; - ALsizei NumChannels, SampleSize; - ALbitfieldSOFT enabledevt; - ALsizei buffers_done = 0; - ResamplerFunc Resample; - ALsizei DataPosInt; - ALsizei DataPosFrac; - ALint64 DataSize64; - ALint increment; - ALsizei Counter; - ALsizei OutPos; - ALsizei IrSize; - bool isplaying; - bool firstpass; - bool isstatic; - ALsizei chan; - ALsizei send; - - /* Get source info */ - isplaying = true; /* Will only be called while playing. */ - isstatic = !!(voice->Flags&VOICE_IS_STATIC); - DataPosInt = ATOMIC_LOAD(&voice->position, almemory_order_acquire); - DataPosFrac = ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); - BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - BufferLoopItem = ATOMIC_LOAD(&voice->loop_buffer, almemory_order_relaxed); - NumChannels = voice->NumChannels; - SampleSize = voice->SampleSize; - increment = voice->Step; - - IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0); - - Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ? - Resample_copy_C : voice->Resampler); - - Counter = (voice->Flags&VOICE_IS_FADING) ? SamplesToDo : 0; - firstpass = true; - OutPos = 0; - - do { - ALsizei SrcBufferSize, DstBufferSize; - - /* Figure out how many buffer samples will be needed */ - DataSize64 = SamplesToDo-OutPos; - DataSize64 *= increment; - DataSize64 += DataPosFrac+FRACTIONMASK; - DataSize64 >>= FRACTIONBITS; - DataSize64 += MAX_RESAMPLE_PADDING*2; - SrcBufferSize = (ALsizei)mini64(DataSize64, BUFFERSIZE); - - /* Figure out how many samples we can actually mix from this. */ - DataSize64 = SrcBufferSize; - DataSize64 -= MAX_RESAMPLE_PADDING*2; - DataSize64 <<= FRACTIONBITS; - DataSize64 -= DataPosFrac; - DstBufferSize = (ALsizei)mini64((DataSize64+(increment-1)) / increment, - SamplesToDo - OutPos); - - /* Some mixers like having a multiple of 4, so try to give that unless - * this is the last update. */ - if(DstBufferSize < SamplesToDo-OutPos) - DstBufferSize &= ~3; - - /* It's impossible to have a buffer list item with no entries. */ - assert(BufferListItem->num_buffers > 0); - - for(chan = 0;chan < NumChannels;chan++) - { - const ALfloat *ResampledData; - ALfloat *SrcData = Device->TempBuffer[SOURCE_DATA_BUF]; - ALsizei FilledAmt; - - /* Load the previous samples into the source data first, and clear the rest. */ - memcpy(SrcData, voice->PrevSamples[chan], MAX_RESAMPLE_PADDING*sizeof(ALfloat)); - memset(SrcData+MAX_RESAMPLE_PADDING, 0, (BUFFERSIZE-MAX_RESAMPLE_PADDING)* - sizeof(ALfloat)); - FilledAmt = MAX_RESAMPLE_PADDING; - - if(isstatic) - { - /* TODO: For static sources, loop points are taken from the - * first buffer (should be adjusted by any buffer offset, to - * possibly be added later). - */ - const ALbuffer *Buffer0 = BufferListItem->buffers[0]; - const ALsizei LoopStart = Buffer0->LoopStart; - const ALsizei LoopEnd = Buffer0->LoopEnd; - const ALsizei LoopSize = LoopEnd - LoopStart; - - /* If current pos is beyond the loop range, do not loop */ - if(!BufferLoopItem || DataPosInt >= LoopEnd) - { - ALsizei SizeToDo = SrcBufferSize - FilledAmt; - ALsizei CompLen = 0; - ALsizei i; - - BufferLoopItem = NULL; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(DataPosInt >= buffer->SampleLen) - continue; - - /* Load what's left to play from the buffer */ - DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(DataPosInt*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - } - else - { - ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopEnd - DataPosInt); - ALsizei CompLen = 0; - ALsizei i; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(DataPosInt >= buffer->SampleLen) - continue; - - /* Load what's left of this loop iteration */ - DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(DataPosInt*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - - while(SrcBufferSize > FilledAmt) - { - const ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopSize); - - CompLen = 0; - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(LoopStart >= buffer->SampleLen) - continue; - - DataSize = mini(SizeToDo, buffer->SampleLen - LoopStart); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(LoopStart*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - } - } - } - else - { - /* Crawl the buffer queue to fill in the temp buffer */ - ALbufferlistitem *tmpiter = BufferListItem; - ALsizei pos = DataPosInt; - - while(tmpiter && SrcBufferSize > FilledAmt) - { - ALsizei SizeToDo = SrcBufferSize - FilledAmt; - ALsizei CompLen = 0; - ALsizei i; - - for(i = 0;i < tmpiter->num_buffers;i++) - { - const ALbuffer *ALBuffer = tmpiter->buffers[i]; - ALsizei DataSize = ALBuffer ? ALBuffer->SampleLen : 0; - CompLen = maxi(CompLen, DataSize); - - if(DataSize > pos) - { - const ALubyte *Data = ALBuffer->data; - Data += (pos*NumChannels + chan)*SampleSize; - - DataSize = minu(SizeToDo, DataSize - pos); - LoadSamples(&SrcData[FilledAmt], Data, NumChannels, - ALBuffer->FmtType, DataSize); - } - } - if(pos > CompLen) - pos -= CompLen; - else - { - FilledAmt += CompLen - pos; - pos = 0; - } - if(SrcBufferSize > FilledAmt) - { - tmpiter = ATOMIC_LOAD(&tmpiter->next, almemory_order_acquire); - if(!tmpiter) tmpiter = BufferLoopItem; - } - } - } - - /* Store the last source samples used for next time. */ - memcpy(voice->PrevSamples[chan], - &SrcData[(increment*DstBufferSize + DataPosFrac)>>FRACTIONBITS], - MAX_RESAMPLE_PADDING*sizeof(ALfloat) - ); - - /* Now resample, then filter and mix to the appropriate outputs. */ - ResampledData = Resample(&voice->ResampleState, - &SrcData[MAX_RESAMPLE_PADDING], DataPosFrac, increment, - Device->TempBuffer[RESAMPLED_BUF], DstBufferSize - ); - { - DirectParams *parms = &voice->Direct.Params[chan]; - const ALfloat *samples; - - samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], - ResampledData, DstBufferSize, voice->Direct.FilterType - ); - if(!(voice->Flags&VOICE_HAS_HRTF)) - { - if(!Counter) - memcpy(parms->Gains.Current, parms->Gains.Target, - sizeof(parms->Gains.Current)); - if(!(voice->Flags&VOICE_HAS_NFC)) - MixSamples(samples, voice->Direct.Channels, voice->Direct.Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, - DstBufferSize - ); - else - { - ALfloat *nfcsamples = Device->TempBuffer[NFC_DATA_BUF]; - ALsizei chanoffset = 0; - - MixSamples(samples, - voice->Direct.ChannelsPerOrder[0], voice->Direct.Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, - DstBufferSize - ); - chanoffset += voice->Direct.ChannelsPerOrder[0]; -#define APPLY_NFC_MIX(order) \ - if(voice->Direct.ChannelsPerOrder[order] > 0) \ - { \ - NfcFilterUpdate##order(&parms->NFCtrlFilter, nfcsamples, samples, \ - DstBufferSize); \ - MixSamples(nfcsamples, voice->Direct.ChannelsPerOrder[order], \ - voice->Direct.Buffer+chanoffset, parms->Gains.Current+chanoffset, \ - parms->Gains.Target+chanoffset, Counter, OutPos, DstBufferSize \ - ); \ - chanoffset += voice->Direct.ChannelsPerOrder[order]; \ - } - APPLY_NFC_MIX(1) - APPLY_NFC_MIX(2) - APPLY_NFC_MIX(3) -#undef APPLY_NFC_MIX - } - } - else - { - MixHrtfParams hrtfparams; - ALsizei fademix = 0; - int lidx, ridx; - - lidx = GetChannelIdxByName(&Device->RealOut, FrontLeft); - ridx = GetChannelIdxByName(&Device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - if(!Counter) - { - /* No fading, just overwrite the old HRTF params. */ - parms->Hrtf.Old = parms->Hrtf.Target; - } - else if(!(parms->Hrtf.Old.Gain > GAIN_SILENCE_THRESHOLD)) - { - /* The old HRTF params are silent, so overwrite the old - * coefficients with the new, and reset the old gain to - * 0. The future mix will then fade from silence. - */ - parms->Hrtf.Old = parms->Hrtf.Target; - parms->Hrtf.Old.Gain = 0.0f; - } - else if(firstpass) - { - ALfloat gain; - - /* Fade between the coefficients over 128 samples. */ - fademix = mini(DstBufferSize, 128); - - /* The new coefficients need to fade in completely - * since they're replacing the old ones. To keep the - * gain fading consistent, interpolate between the old - * and new target gains given how much of the fade time - * this mix handles. - */ - gain = lerp(parms->Hrtf.Old.Gain, parms->Hrtf.Target.Gain, - minf(1.0f, (ALfloat)fademix/Counter)); - hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; - hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; - hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; - hrtfparams.Gain = 0.0f; - hrtfparams.GainStep = gain / (ALfloat)fademix; - - MixHrtfBlendSamples( - voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], - samples, voice->Offset, OutPos, IrSize, &parms->Hrtf.Old, - &hrtfparams, &parms->Hrtf.State, fademix - ); - /* Update the old parameters with the result. */ - parms->Hrtf.Old = parms->Hrtf.Target; - if(fademix < Counter) - parms->Hrtf.Old.Gain = hrtfparams.Gain; - } - - if(fademix < DstBufferSize) - { - ALsizei todo = DstBufferSize - fademix; - ALfloat gain = parms->Hrtf.Target.Gain; - - /* Interpolate the target gain if the gain fading lasts - * longer than this mix. - */ - if(Counter > DstBufferSize) - gain = lerp(parms->Hrtf.Old.Gain, gain, - (ALfloat)todo/(Counter-fademix)); - - hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; - hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; - hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; - hrtfparams.Gain = parms->Hrtf.Old.Gain; - hrtfparams.GainStep = (gain - parms->Hrtf.Old.Gain) / (ALfloat)todo; - MixHrtfSamples( - voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], - samples+fademix, voice->Offset+fademix, OutPos+fademix, IrSize, - &hrtfparams, &parms->Hrtf.State, todo - ); - /* Store the interpolated gain or the final target gain - * depending if the fade is done. - */ - if(DstBufferSize < Counter) - parms->Hrtf.Old.Gain = gain; - else - parms->Hrtf.Old.Gain = parms->Hrtf.Target.Gain; - } - } - } - - for(send = 0;send < Device->NumAuxSends;send++) - { - SendParams *parms = &voice->Send[send].Params[chan]; - const ALfloat *samples; - - if(!voice->Send[send].Buffer) - continue; - - samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], - ResampledData, DstBufferSize, voice->Send[send].FilterType - ); - - if(!Counter) - memcpy(parms->Gains.Current, parms->Gains.Target, - sizeof(parms->Gains.Current)); - MixSamples(samples, voice->Send[send].Channels, voice->Send[send].Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, DstBufferSize - ); - } - } - /* Update positions */ - DataPosFrac += increment*DstBufferSize; - DataPosInt += DataPosFrac>>FRACTIONBITS; - DataPosFrac &= FRACTIONMASK; - - OutPos += DstBufferSize; - voice->Offset += DstBufferSize; - Counter = maxi(DstBufferSize, Counter) - DstBufferSize; - firstpass = false; - - if(isstatic) - { - if(BufferLoopItem) - { - /* Handle looping static source */ - const ALbuffer *Buffer = BufferListItem->buffers[0]; - ALsizei LoopStart = Buffer->LoopStart; - ALsizei LoopEnd = Buffer->LoopEnd; - if(DataPosInt >= LoopEnd) - { - assert(LoopEnd > LoopStart); - DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; - } - } - else - { - /* Handle non-looping static source */ - ALsizei CompLen = 0; - ALsizei i; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - if(buffer) CompLen = maxi(CompLen, buffer->SampleLen); - } - - if(DataPosInt >= CompLen) - { - isplaying = false; - BufferListItem = NULL; - DataPosInt = 0; - DataPosFrac = 0; - break; - } - } - } - else while(1) - { - /* Handle streaming source */ - ALsizei CompLen = 0; - ALsizei i; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - if(buffer) CompLen = maxi(CompLen, buffer->SampleLen); - } - - if(CompLen > DataPosInt) - break; - - buffers_done += BufferListItem->num_buffers; - BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_acquire); - if(!BufferListItem && !(BufferListItem=BufferLoopItem)) - { - isplaying = false; - DataPosInt = 0; - DataPosFrac = 0; - break; - } - - DataPosInt -= CompLen; - } - } while(isplaying && OutPos < SamplesToDo); - - voice->Flags |= VOICE_IS_FADING; - - /* Update source info */ - ATOMIC_STORE(&voice->position, DataPosInt, almemory_order_relaxed); - ATOMIC_STORE(&voice->position_fraction, DataPosFrac, almemory_order_relaxed); - ATOMIC_STORE(&voice->current_buffer, BufferListItem, almemory_order_release); - - /* Send any events now, after the position/buffer info was updated. */ - enabledevt = ATOMIC_LOAD(&Context->EnabledEvts, almemory_order_acquire); - if(buffers_done > 0 && (enabledevt&EventType_BufferCompleted)) - SendAsyncEvent(Context, EventType_BufferCompleted, - AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, SourceID, buffers_done, "Buffer completed" - ); - - return isplaying; -} diff --git a/Alc/mixer/defs.h b/Alc/mixer/defs.h new file mode 100644 index 00000000..fe19cef4 --- /dev/null +++ b/Alc/mixer/defs.h @@ -0,0 +1,119 @@ +#ifndef MIXER_DEFS_H +#define MIXER_DEFS_H + +#include "AL/alc.h" +#include "AL/al.h" +#include "alMain.h" +#include "alu.h" + +struct MixGains; + +struct MixHrtfParams; +struct HrtfState; + +/* C resamplers */ +const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_cubic_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); + + +/* C mixers */ +void MixHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, struct MixHrtfParams *hrtfparams, + struct HrtfState *hrtfstate, ALsizei BufferSize); +void MixHrtfBlend_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, const HrtfParams *oldparams, + MixHrtfParams *newparams, HrtfState *hrtfstate, + ALsizei BufferSize); +void MixDirectHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], + ALsizei BufferSize); +void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize); +void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, + const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, + ALsizei InPos, ALsizei BufferSize); + +/* SSE mixers */ +void MixHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, struct MixHrtfParams *hrtfparams, + struct HrtfState *hrtfstate, ALsizei BufferSize); +void MixHrtfBlend_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, const HrtfParams *oldparams, + MixHrtfParams *newparams, HrtfState *hrtfstate, + ALsizei BufferSize); +void MixDirectHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], + ALsizei BufferSize); +void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize); +void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, + const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, + ALsizei InPos, ALsizei BufferSize); + +/* SSE resamplers */ +inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) +{ + ALsizei i; + + pos_arr[0] = 0; + frac_arr[0] = frac; + for(i = 1;i < size;i++) + { + ALint frac_tmp = frac_arr[i-1] + increment; + pos_arr[i] = pos_arr[i-1] + (frac_tmp>>FRACTIONBITS); + frac_arr[i] = frac_tmp&FRACTIONMASK; + } +} + +const ALfloat *Resample_lerp_SSE2(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); + +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); + +/* Neon mixers */ +void MixHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, struct MixHrtfParams *hrtfparams, + struct HrtfState *hrtfstate, ALsizei BufferSize); +void MixHrtfBlend_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, const HrtfParams *oldparams, + MixHrtfParams *newparams, HrtfState *hrtfstate, + ALsizei BufferSize); +void MixDirectHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], + ALsizei BufferSize); +void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize); +void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, + const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, + ALsizei InPos, ALsizei BufferSize); + +/* Neon resamplers */ +const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); + +#endif /* MIXER_DEFS_H */ diff --git a/Alc/mixer/mixer_c.c b/Alc/mixer/mixer_c.c new file mode 100644 index 00000000..0c33e9b0 --- /dev/null +++ b/Alc/mixer/mixer_c.c @@ -0,0 +1,209 @@ +#include "config.h" + +#include + +#include "alMain.h" +#include "alu.h" +#include "alSource.h" +#include "alAuxEffectSlot.h" +#include "defs.h" + + +static inline ALfloat do_point(const ALfloat *restrict vals, ALsizei UNUSED(frac)) +{ return vals[0]; } +static inline ALfloat do_lerp(const ALfloat *restrict vals, ALsizei frac) +{ return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } +static inline ALfloat do_cubic(const ALfloat *restrict vals, ALsizei frac) +{ return cubic(vals[0], vals[1], vals[2], vals[3], frac * (1.0f/FRACTIONONE)); } + +const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), + ALfloat *restrict dst, ALsizei numsamples) +{ +#if defined(HAVE_SSE) || defined(HAVE_NEON) + /* Avoid copying the source data if it's aligned like the destination. */ + if((((intptr_t)src)&15) == (((intptr_t)dst)&15)) + return src; +#endif + memcpy(dst, src, numsamples*sizeof(ALfloat)); + return dst; +} + +#define DECL_TEMPLATE(Tag, Sampler, O) \ +const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ + const ALfloat *restrict src, ALsizei frac, ALint increment, \ + ALfloat *restrict dst, ALsizei numsamples) \ +{ \ + ALsizei i; \ + \ + src -= O; \ + for(i = 0;i < numsamples;i++) \ + { \ + dst[i] = Sampler(src, frac); \ + \ + frac += increment; \ + src += frac>>FRACTIONBITS; \ + frac &= FRACTIONMASK; \ + } \ + return dst; \ +} + +DECL_TEMPLATE(point, do_point, 0) +DECL_TEMPLATE(lerp, do_lerp, 0) +DECL_TEMPLATE(cubic, do_cubic, 1) + +#undef DECL_TEMPLATE + +const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) +{ + const ALfloat *fil, *scd, *phd, *spd; + const ALfloat *const filter = state->bsinc.filter; + const ALfloat sf = state->bsinc.sf; + const ALsizei m = state->bsinc.m; + ALsizei j_f, pi, i; + ALfloat pf, r; + + src += state->bsinc.l; + for(i = 0;i < dstlen;i++) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + pi = frac >> FRAC_PHASE_BITDIFF; + pf = (frac & ((1<>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + + +void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) +{ + ALsizei i; + if(LIKELY(numsamples > 1)) + { + ALfloat x0 = filter->x[0]; + ALfloat x1 = filter->x[1]; + ALfloat y0 = filter->y[0]; + ALfloat y1 = filter->y[1]; + + for(i = 0;i < numsamples;i++) + { + dst[i] = filter->b0* src[i] + + filter->b1*x0 + filter->b2*x1 - + filter->a1*y0 - filter->a2*y1; + y1 = y0; y0 = dst[i]; + x1 = x0; x0 = src[i]; + } + + filter->x[0] = x0; + filter->x[1] = x1; + filter->y[0] = y0; + filter->y[1] = y1; + } + else if(numsamples == 1) + { + dst[0] = filter->b0 * src[0] + + filter->b1 * filter->x[0] + + filter->b2 * filter->x[1] - + filter->a1 * filter->y[0] - + filter->a2 * filter->y[1]; + filter->x[1] = filter->x[0]; + filter->x[0] = src[0]; + filter->y[1] = filter->y[0]; + filter->y[0] = dst[0]; + } +} + + +static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], + const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], + ALfloat left, ALfloat right) +{ + ALsizei c; + for(c = 0;c < IrSize;c++) + { + const ALsizei off = (Offset+c)&HRIR_MASK; + Values[off][0] += Coeffs[c][0] * left; + Values[off][1] += Coeffs[c][1] * right; + } +} + +#define MixHrtf MixHrtf_C +#define MixHrtfBlend MixHrtfBlend_C +#define MixDirectHrtf MixDirectHrtf_C +#include "mixer_inc.c" +#undef MixHrtf + + +void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize) +{ + ALfloat gain, delta, step; + ALsizei c; + + delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + + for(c = 0;c < OutChans;c++) + { + ALsizei pos = 0; + gain = CurrentGains[c]; + step = (TargetGains[c] - gain) * delta; + if(fabsf(step) > FLT_EPSILON) + { + ALsizei minsize = mini(BufferSize, Counter); + for(;pos < minsize;pos++) + { + OutBuffer[c][OutPos+pos] += data[pos]*gain; + gain += step; + } + if(pos == Counter) + gain = TargetGains[c]; + CurrentGains[c] = gain; + } + + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + for(;pos < BufferSize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } +} + +/* Basically the inverse of the above. Rather than one input going to multiple + * outputs (each with its own gain), it's multiple inputs (each with its own + * gain) going to one output. This applies one row (vs one column) of a matrix + * transform. And as the matrices are more or less static once set up, no + * stepping is necessary. + */ +void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) +{ + ALsizei c, i; + + for(c = 0;c < InChans;c++) + { + ALfloat gain = Gains[c]; + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + for(i = 0;i < BufferSize;i++) + OutBuffer[i] += data[c][InPos+i] * gain; + } +} diff --git a/Alc/mixer/mixer_inc.c b/Alc/mixer/mixer_inc.c new file mode 100644 index 00000000..ad0daa63 --- /dev/null +++ b/Alc/mixer/mixer_inc.c @@ -0,0 +1,114 @@ +#include "config.h" + +#include "alMain.h" +#include "alSource.h" + +#include "hrtf.h" +#include "align.h" +#include "alu.h" +#include "defs.h" + + +static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], + const ALsizei irSize, + const ALfloat (*restrict Coeffs)[2], + ALfloat left, ALfloat right); + + +void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, MixHrtfParams *hrtfparams, HrtfState *hrtfstate, + ALsizei BufferSize) +{ + const ALfloat (*Coeffs)[2] = ASSUME_ALIGNED(hrtfparams->Coeffs, 16); + const ALsizei Delay[2] = { hrtfparams->Delay[0], hrtfparams->Delay[1] }; + ALfloat gainstep = hrtfparams->GainStep; + ALfloat gain = hrtfparams->Gain; + ALfloat left, right; + ALsizei i; + + LeftOut += OutPos; + RightOut += OutPos; + for(i = 0;i < BufferSize;i++) + { + hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); + left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*gain; + right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*gain; + + hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; + hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; + + ApplyCoeffs(Offset, hrtfstate->Values, IrSize, Coeffs, left, right); + *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; + *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; + + gain += gainstep; + Offset++; + } + hrtfparams->Gain = gain; +} + +void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, ALsizei OutPos, + const ALsizei IrSize, const HrtfParams *oldparams, + MixHrtfParams *newparams, HrtfState *hrtfstate, + ALsizei BufferSize) +{ + const ALfloat (*OldCoeffs)[2] = ASSUME_ALIGNED(oldparams->Coeffs, 16); + const ALsizei OldDelay[2] = { oldparams->Delay[0], oldparams->Delay[1] }; + ALfloat oldGain = oldparams->Gain; + ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize; + const ALfloat (*NewCoeffs)[2] = ASSUME_ALIGNED(newparams->Coeffs, 16); + const ALsizei NewDelay[2] = { newparams->Delay[0], newparams->Delay[1] }; + ALfloat newGain = newparams->Gain; + ALfloat newGainStep = newparams->GainStep; + ALfloat left, right; + ALsizei i; + + LeftOut += OutPos; + RightOut += OutPos; + for(i = 0;i < BufferSize;i++) + { + hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; + hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; + + hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); + + left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*oldGain; + right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*oldGain; + ApplyCoeffs(Offset, hrtfstate->Values, IrSize, OldCoeffs, left, right); + + left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*newGain; + right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*newGain; + ApplyCoeffs(Offset, hrtfstate->Values, IrSize, NewCoeffs, left, right); + + *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; + *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; + + oldGain += oldGainStep; + newGain += newGainStep; + Offset++; + } + newparams->Gain = newGain; +} + +void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, + const ALfloat *data, ALsizei Offset, const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], + ALsizei BufferSize) +{ + ALfloat insample; + ALsizei i; + + for(i = 0;i < BufferSize;i++) + { + Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f; + Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f; + Offset++; + + insample = *(data++); + ApplyCoeffs(Offset, Values, IrSize, Coeffs, insample, insample); + *(LeftOut++) += Values[Offset&HRIR_MASK][0]; + *(RightOut++) += Values[Offset&HRIR_MASK][1]; + } +} diff --git a/Alc/mixer/mixer_neon.c b/Alc/mixer/mixer_neon.c new file mode 100644 index 00000000..b93d11fd --- /dev/null +++ b/Alc/mixer/mixer_neon.c @@ -0,0 +1,261 @@ +#include "config.h" + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "alMain.h" +#include "alu.h" +#include "hrtf.h" +#include "defs.h" + + +const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) +{ + const int32x4_t increment4 = vdupq_n_s32(increment*4); + const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); + const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); + alignas(16) ALint pos_[4]; + alignas(16) ALsizei frac_[4]; + int32x4_t pos4; + int32x4_t frac4; + ALsizei i; + + InitiatePositionArrays(frac, increment, frac_, pos_, 4); + + frac4 = vld1q_s32(frac_); + pos4 = vld1q_s32(pos_); + + for(i = 0;numsamples-i > 3;i += 4) + { + const float32x4_t val1 = (float32x4_t){src[pos_[0]], src[pos_[1]], src[pos_[2]], src[pos_[3]]}; + const float32x4_t val2 = (float32x4_t){src[pos_[0]+1], src[pos_[1]+1], src[pos_[2]+1], src[pos_[3]+1]}; + + /* val1 + (val2-val1)*mu */ + const float32x4_t r0 = vsubq_f32(val2, val1); + const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); + const float32x4_t out = vmlaq_f32(val1, mu, r0); + + vst1q_f32(&dst[i], out); + + frac4 = vaddq_s32(frac4, increment4); + pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); + frac4 = vandq_s32(frac4, fracMask4); + + vst1q_s32(pos_, pos4); + } + + if(i < numsamples) + { + /* NOTE: These four elements represent the position *after* the last + * four samples, so the lowest element is the next position to + * resample. + */ + ALint pos = pos_[0]; + frac = vgetq_lane_s32(frac4, 0); + do { + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); + + frac += increment; + pos += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } while(++i < numsamples); + } + return dst; +} + +const ALfloat *Resample_bsinc_Neon(const InterpState *state, + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei dstlen) +{ + const ALfloat *const filter = state->bsinc.filter; + const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); + const ALsizei m = state->bsinc.m; + const float32x4_t *fil, *scd, *phd, *spd; + ALsizei pi, i, j, offset; + float32x4_t r4; + ALfloat pf; + + src += state->bsinc.l; + for(i = 0;i < dstlen;i++) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + pi = frac >> FRAC_PHASE_BITDIFF; + pf = (frac & ((1<>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + + +static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], + const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], + ALfloat left, ALfloat right) +{ + ALsizei c; + float32x4_t leftright4; + { + float32x2_t leftright2 = vdup_n_f32(0.0); + leftright2 = vset_lane_f32(left, leftright2, 0); + leftright2 = vset_lane_f32(right, leftright2, 1); + leftright4 = vcombine_f32(leftright2, leftright2); + } + Values = ASSUME_ALIGNED(Values, 16); + Coeffs = ASSUME_ALIGNED(Coeffs, 16); + for(c = 0;c < IrSize;c += 2) + { + const ALsizei o0 = (Offset+c)&HRIR_MASK; + const ALsizei o1 = (o0+1)&HRIR_MASK; + float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), + vld1_f32((float32_t*)&Values[o1][0])); + float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); + + vals = vmlaq_f32(vals, coefs, leftright4); + + vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); + vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); + } +} + +#define MixHrtf MixHrtf_Neon +#define MixHrtfBlend MixHrtfBlend_Neon +#define MixDirectHrtf MixDirectHrtf_Neon +#include "mixer_inc.c" +#undef MixHrtf + + +void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize) +{ + ALfloat gain, delta, step; + float32x4_t gain4; + ALsizei c; + + data = ASSUME_ALIGNED(data, 16); + OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); + + delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + + for(c = 0;c < OutChans;c++) + { + ALsizei pos = 0; + gain = CurrentGains[c]; + step = (TargetGains[c] - gain) * delta; + if(fabsf(step) > FLT_EPSILON) + { + ALsizei minsize = mini(BufferSize, Counter); + /* Mix with applying gain steps in aligned multiples of 4. */ + if(minsize-pos > 3) + { + float32x4_t step4; + gain4 = vsetq_lane_f32(gain, gain4, 0); + gain4 = vsetq_lane_f32(gain + step, gain4, 1); + gain4 = vsetq_lane_f32(gain + step + step, gain4, 2); + gain4 = vsetq_lane_f32(gain + step + step + step, gain4, 3); + step4 = vdupq_n_f32(step + step + step + step); + do { + const float32x4_t val4 = vld1q_f32(&data[pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); + dry4 = vmlaq_f32(dry4, val4, gain4); + gain4 = vaddq_f32(gain4, step4); + vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); + pos += 4; + } while(minsize-pos > 3); + /* NOTE: gain4 now represents the next four gains after the + * last four mixed samples, so the lowest element represents + * the next gain to apply. + */ + gain = vgetq_lane_f32(gain4, 0); + } + /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ + for(;pos < minsize;pos++) + { + OutBuffer[c][OutPos+pos] += data[pos]*gain; + gain += step; + } + if(pos == Counter) + gain = TargetGains[c]; + CurrentGains[c] = gain; + + /* Mix until pos is aligned with 4 or the mix is done. */ + minsize = mini(BufferSize, (pos+3)&~3); + for(;pos < minsize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } + + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + gain4 = vdupq_n_f32(gain); + for(;BufferSize-pos > 3;pos += 4) + { + const float32x4_t val4 = vld1q_f32(&data[pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); + } + for(;pos < BufferSize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } +} + +void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) +{ + float32x4_t gain4; + ALsizei c; + + data = ASSUME_ALIGNED(data, 16); + OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); + + for(c = 0;c < InChans;c++) + { + ALsizei pos = 0; + ALfloat gain = Gains[c]; + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + gain4 = vdupq_n_f32(gain); + for(;BufferSize-pos > 3;pos += 4) + { + const float32x4_t val4 = vld1q_f32(&data[c][InPos+pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[pos]); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(&OutBuffer[pos], dry4); + } + for(;pos < BufferSize;pos++) + OutBuffer[pos] += data[c][InPos+pos]*gain; + } +} diff --git a/Alc/mixer/mixer_sse.c b/Alc/mixer/mixer_sse.c new file mode 100644 index 00000000..288661b2 --- /dev/null +++ b/Alc/mixer/mixer_sse.c @@ -0,0 +1,229 @@ +#include "config.h" + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "alMain.h" +#include "alu.h" + +#include "alSource.h" +#include "alAuxEffectSlot.h" +#include "defs.h" + + +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) +{ + const ALfloat *const filter = state->bsinc.filter; + const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); + const ALsizei m = state->bsinc.m; + const __m128 *fil, *scd, *phd, *spd; + ALsizei pi, i, j, offset; + ALfloat pf; + __m128 r4; + + src += state->bsinc.l; + for(i = 0;i < dstlen;i++) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + pi = frac >> FRAC_PHASE_BITDIFF; + pf = (frac & ((1<>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + + +static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], + const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], + ALfloat left, ALfloat right) +{ + const __m128 lrlr = _mm_setr_ps(left, right, left, right); + __m128 vals = _mm_setzero_ps(); + __m128 coeffs; + ALsizei i; + + Values = ASSUME_ALIGNED(Values, 16); + Coeffs = ASSUME_ALIGNED(Coeffs, 16); + if((Offset&1)) + { + const ALsizei o0 = Offset&HRIR_MASK; + const ALsizei o1 = (Offset+IrSize-1)&HRIR_MASK; + __m128 imp0, imp1; + + coeffs = _mm_load_ps(&Coeffs[0][0]); + vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]); + imp0 = _mm_mul_ps(lrlr, coeffs); + vals = _mm_add_ps(imp0, vals); + _mm_storel_pi((__m64*)&Values[o0][0], vals); + for(i = 1;i < IrSize-1;i += 2) + { + const ALsizei o2 = (Offset+i)&HRIR_MASK; + + coeffs = _mm_load_ps(&Coeffs[i+1][0]); + vals = _mm_load_ps(&Values[o2][0]); + imp1 = _mm_mul_ps(lrlr, coeffs); + imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2)); + vals = _mm_add_ps(imp0, vals); + _mm_store_ps(&Values[o2][0], vals); + imp0 = imp1; + } + vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]); + imp0 = _mm_movehl_ps(imp0, imp0); + vals = _mm_add_ps(imp0, vals); + _mm_storel_pi((__m64*)&Values[o1][0], vals); + } + else + { + for(i = 0;i < IrSize;i += 2) + { + const ALsizei o = (Offset + i)&HRIR_MASK; + + coeffs = _mm_load_ps(&Coeffs[i][0]); + vals = _mm_load_ps(&Values[o][0]); + vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs)); + _mm_store_ps(&Values[o][0], vals); + } + } +} + +#define MixHrtf MixHrtf_SSE +#define MixHrtfBlend MixHrtfBlend_SSE +#define MixDirectHrtf MixDirectHrtf_SSE +#include "mixer_inc.c" +#undef MixHrtf + + +void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize) +{ + ALfloat gain, delta, step; + __m128 gain4; + ALsizei c; + + delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + + for(c = 0;c < OutChans;c++) + { + ALsizei pos = 0; + gain = CurrentGains[c]; + step = (TargetGains[c] - gain) * delta; + if(fabsf(step) > FLT_EPSILON) + { + ALsizei minsize = mini(BufferSize, Counter); + /* Mix with applying gain steps in aligned multiples of 4. */ + if(minsize-pos > 3) + { + __m128 step4; + gain4 = _mm_setr_ps( + gain, + gain + step, + gain + step + step, + gain + step + step + step + ); + step4 = _mm_set1_ps(step + step + step + step); + do { + const __m128 val4 = _mm_load_ps(&data[pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + gain4 = _mm_add_ps(gain4, step4); + _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); + pos += 4; + } while(minsize-pos > 3); + /* NOTE: gain4 now represents the next four gains after the + * last four mixed samples, so the lowest element represents + * the next gain to apply. + */ + gain = _mm_cvtss_f32(gain4); + } + /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ + for(;pos < minsize;pos++) + { + OutBuffer[c][OutPos+pos] += data[pos]*gain; + gain += step; + } + if(pos == Counter) + gain = TargetGains[c]; + CurrentGains[c] = gain; + + /* Mix until pos is aligned with 4 or the mix is done. */ + minsize = mini(BufferSize, (pos+3)&~3); + for(;pos < minsize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } + + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + gain4 = _mm_set1_ps(gain); + for(;BufferSize-pos > 3;pos += 4) + { + const __m128 val4 = _mm_load_ps(&data[pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); + } + for(;pos < BufferSize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } +} + +void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) +{ + __m128 gain4; + ALsizei c; + + for(c = 0;c < InChans;c++) + { + ALsizei pos = 0; + ALfloat gain = Gains[c]; + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + gain4 = _mm_set1_ps(gain); + for(;BufferSize-pos > 3;pos += 4) + { + const __m128 val4 = _mm_load_ps(&data[c][InPos+pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[pos]); + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(&OutBuffer[pos], dry4); + } + for(;pos < BufferSize;pos++) + OutBuffer[pos] += data[c][InPos+pos]*gain; + } +} diff --git a/Alc/mixer/mixer_sse2.c b/Alc/mixer/mixer_sse2.c new file mode 100644 index 00000000..19d07719 --- /dev/null +++ b/Alc/mixer/mixer_sse2.c @@ -0,0 +1,82 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2014 by Timothy Arceri . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alu.h" +#include "defs.h" + + +const ALfloat *Resample_lerp_SSE2(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) +{ + const __m128i increment4 = _mm_set1_epi32(increment*4); + const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); + const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); + union { alignas(16) ALint i[4]; float f[4]; } pos_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; + __m128i frac4, pos4; + ALint pos; + ALsizei i; + + InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); + + frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); + pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); + + for(i = 0;numsamples-i > 3;i += 4) + { + const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); + const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); + + /* val1 + (val2-val1)*mu */ + const __m128 r0 = _mm_sub_ps(val2, val1); + const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); + const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); + + _mm_store_ps(&dst[i], out); + + frac4 = _mm_add_epi32(frac4, increment4); + pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); + frac4 = _mm_and_si128(frac4, fracMask4); + + _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); + } + + /* NOTE: These four elements represent the position *after* the last four + * samples, so the lowest element is the next position to resample. + */ + pos = pos_.i[0]; + frac = _mm_cvtsi128_si32(frac4); + + for(;i < numsamples;i++) + { + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); + + frac += increment; + pos += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} diff --git a/Alc/mixer/mixer_sse3.c b/Alc/mixer/mixer_sse3.c new file mode 100644 index 00000000..e69de29b diff --git a/Alc/mixer/mixer_sse41.c b/Alc/mixer/mixer_sse41.c new file mode 100644 index 00000000..85fd0f5e --- /dev/null +++ b/Alc/mixer/mixer_sse41.c @@ -0,0 +1,86 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2014 by Timothy Arceri . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "alu.h" +#include "defs.h" + + +const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) +{ + const __m128i increment4 = _mm_set1_epi32(increment*4); + const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); + const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); + union { alignas(16) ALint i[4]; float f[4]; } pos_; + union { alignas(16) ALsizei i[4]; float f[4]; } frac_; + __m128i frac4, pos4; + ALint pos; + ALsizei i; + + InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); + + frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); + pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); + + for(i = 0;numsamples-i > 3;i += 4) + { + const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); + const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); + + /* val1 + (val2-val1)*mu */ + const __m128 r0 = _mm_sub_ps(val2, val1); + const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); + const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); + + _mm_store_ps(&dst[i], out); + + frac4 = _mm_add_epi32(frac4, increment4); + pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); + frac4 = _mm_and_si128(frac4, fracMask4); + + pos_.i[0] = _mm_extract_epi32(pos4, 0); + pos_.i[1] = _mm_extract_epi32(pos4, 1); + pos_.i[2] = _mm_extract_epi32(pos4, 2); + pos_.i[3] = _mm_extract_epi32(pos4, 3); + } + + /* NOTE: These four elements represent the position *after* the last four + * samples, so the lowest element is the next position to resample. + */ + pos = pos_.i[0]; + frac = _mm_cvtsi128_si32(frac4); + + for(;i < numsamples;i++) + { + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); + + frac += increment; + pos += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c deleted file mode 100644 index 2346080a..00000000 --- a/Alc/mixer_c.c +++ /dev/null @@ -1,208 +0,0 @@ -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" -#include "alSource.h" -#include "alAuxEffectSlot.h" - - -static inline ALfloat do_point(const ALfloat *restrict vals, ALsizei UNUSED(frac)) -{ return vals[0]; } -static inline ALfloat do_lerp(const ALfloat *restrict vals, ALsizei frac) -{ return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat do_cubic(const ALfloat *restrict vals, ALsizei frac) -{ return cubic(vals[0], vals[1], vals[2], vals[3], frac * (1.0f/FRACTIONONE)); } - -const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), - ALfloat *restrict dst, ALsizei numsamples) -{ -#if defined(HAVE_SSE) || defined(HAVE_NEON) - /* Avoid copying the source data if it's aligned like the destination. */ - if((((intptr_t)src)&15) == (((intptr_t)dst)&15)) - return src; -#endif - memcpy(dst, src, numsamples*sizeof(ALfloat)); - return dst; -} - -#define DECL_TEMPLATE(Tag, Sampler, O) \ -const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ - const ALfloat *restrict src, ALsizei frac, ALint increment, \ - ALfloat *restrict dst, ALsizei numsamples) \ -{ \ - ALsizei i; \ - \ - src -= O; \ - for(i = 0;i < numsamples;i++) \ - { \ - dst[i] = Sampler(src, frac); \ - \ - frac += increment; \ - src += frac>>FRACTIONBITS; \ - frac &= FRACTIONMASK; \ - } \ - return dst; \ -} - -DECL_TEMPLATE(point, do_point, 0) -DECL_TEMPLATE(lerp, do_lerp, 0) -DECL_TEMPLATE(cubic, do_cubic, 1) - -#undef DECL_TEMPLATE - -const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) -{ - const ALfloat *fil, *scd, *phd, *spd; - const ALfloat *const filter = state->bsinc.filter; - const ALfloat sf = state->bsinc.sf; - const ALsizei m = state->bsinc.m; - ALsizei j_f, pi, i; - ALfloat pf, r; - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) -{ - ALsizei i; - if(LIKELY(numsamples > 1)) - { - ALfloat x0 = filter->x[0]; - ALfloat x1 = filter->x[1]; - ALfloat y0 = filter->y[0]; - ALfloat y1 = filter->y[1]; - - for(i = 0;i < numsamples;i++) - { - dst[i] = filter->b0* src[i] + - filter->b1*x0 + filter->b2*x1 - - filter->a1*y0 - filter->a2*y1; - y1 = y0; y0 = dst[i]; - x1 = x0; x0 = src[i]; - } - - filter->x[0] = x0; - filter->x[1] = x1; - filter->y[0] = y0; - filter->y[1] = y1; - } - else if(numsamples == 1) - { - dst[0] = filter->b0 * src[0] + - filter->b1 * filter->x[0] + - filter->b2 * filter->x[1] - - filter->a1 * filter->y[0] - - filter->a2 * filter->y[1]; - filter->x[1] = filter->x[0]; - filter->x[0] = src[0]; - filter->y[1] = filter->y[0]; - filter->y[0] = dst[0]; - } -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - ALsizei c; - for(c = 0;c < IrSize;c++) - { - const ALsizei off = (Offset+c)&HRIR_MASK; - Values[off][0] += Coeffs[c][0] * left; - Values[off][1] += Coeffs[c][1] * right; - } -} - -#define MixHrtf MixHrtf_C -#define MixHrtfBlend MixHrtfBlend_C -#define MixDirectHrtf MixDirectHrtf_C -#include "mixer_inc.c" -#undef MixHrtf - - -void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - ALfloat gain, delta, step; - ALsizei c; - - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; - } - if(pos == Counter) - gain = TargetGains[c]; - CurrentGains[c] = gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -/* Basically the inverse of the above. Rather than one input going to multiple - * outputs (each with its own gain), it's multiple inputs (each with its own - * gain) going to one output. This applies one row (vs one column) of a matrix - * transform. And as the matrices are more or less static once set up, no - * stepping is necessary. - */ -void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - ALsizei c, i; - - for(c = 0;c < InChans;c++) - { - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(i = 0;i < BufferSize;i++) - OutBuffer[i] += data[c][InPos+i] * gain; - } -} diff --git a/Alc/mixer_defs.h b/Alc/mixer_defs.h deleted file mode 100644 index fe19cef4..00000000 --- a/Alc/mixer_defs.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef MIXER_DEFS_H -#define MIXER_DEFS_H - -#include "AL/alc.h" -#include "AL/al.h" -#include "alMain.h" -#include "alu.h" - -struct MixGains; - -struct MixHrtfParams; -struct HrtfState; - -/* C resamplers */ -const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_cubic_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); - - -/* C mixers */ -void MixHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* SSE mixers */ -void MixHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* SSE resamplers */ -inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) -{ - ALsizei i; - - pos_arr[0] = 0; - frac_arr[0] = frac; - for(i = 1;i < size;i++) - { - ALint frac_tmp = frac_arr[i-1] + increment; - pos_arr[i] = pos_arr[i-1] + (frac_tmp>>FRACTIONBITS); - frac_arr[i] = frac_tmp&FRACTIONMASK; - } -} - -const ALfloat *Resample_lerp_SSE2(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); - -const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); - -/* Neon mixers */ -void MixHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* Neon resamplers */ -const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); - -#endif /* MIXER_DEFS_H */ diff --git a/Alc/mixer_inc.c b/Alc/mixer_inc.c deleted file mode 100644 index 3c9d4dc5..00000000 --- a/Alc/mixer_inc.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "config.h" - -#include "alMain.h" -#include "alSource.h" - -#include "hrtf.h" -#include "mixer_defs.h" -#include "align.h" -#include "alu.h" - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei irSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right); - - -void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, MixHrtfParams *hrtfparams, HrtfState *hrtfstate, - ALsizei BufferSize) -{ - const ALfloat (*Coeffs)[2] = ASSUME_ALIGNED(hrtfparams->Coeffs, 16); - const ALsizei Delay[2] = { hrtfparams->Delay[0], hrtfparams->Delay[1] }; - ALfloat gainstep = hrtfparams->GainStep; - ALfloat gain = hrtfparams->Gain; - ALfloat left, right; - ALsizei i; - - LeftOut += OutPos; - RightOut += OutPos; - for(i = 0;i < BufferSize;i++) - { - hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*gain; - right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*gain; - - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; - - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, Coeffs, left, right); - *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; - *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - - gain += gainstep; - Offset++; - } - hrtfparams->Gain = gain; -} - -void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize) -{ - const ALfloat (*OldCoeffs)[2] = ASSUME_ALIGNED(oldparams->Coeffs, 16); - const ALsizei OldDelay[2] = { oldparams->Delay[0], oldparams->Delay[1] }; - ALfloat oldGain = oldparams->Gain; - ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize; - const ALfloat (*NewCoeffs)[2] = ASSUME_ALIGNED(newparams->Coeffs, 16); - const ALsizei NewDelay[2] = { newparams->Delay[0], newparams->Delay[1] }; - ALfloat newGain = newparams->Gain; - ALfloat newGainStep = newparams->GainStep; - ALfloat left, right; - ALsizei i; - - LeftOut += OutPos; - RightOut += OutPos; - for(i = 0;i < BufferSize;i++) - { - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; - - hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - - left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*oldGain; - right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*oldGain; - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, OldCoeffs, left, right); - - left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*newGain; - right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*newGain; - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, NewCoeffs, left, right); - - *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; - *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - - oldGain += oldGainStep; - newGain += newGainStep; - Offset++; - } - newparams->Gain = newGain; -} - -void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize) -{ - ALfloat insample; - ALsizei i; - - for(i = 0;i < BufferSize;i++) - { - Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f; - Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f; - Offset++; - - insample = *(data++); - ApplyCoeffs(Offset, Values, IrSize, Coeffs, insample, insample); - *(LeftOut++) += Values[Offset&HRIR_MASK][0]; - *(RightOut++) += Values[Offset&HRIR_MASK][1]; - } -} diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c deleted file mode 100644 index 631e4f7c..00000000 --- a/Alc/mixer_neon.c +++ /dev/null @@ -1,261 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alu.h" -#include "hrtf.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); - const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALsizei frac_[4]; - int32x4_t pos4; - int32x4_t frac4; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - - frac4 = vld1q_s32(frac_); - pos4 = vld1q_s32(pos_); - - for(i = 0;numsamples-i > 3;i += 4) - { - const float32x4_t val1 = (float32x4_t){src[pos_[0]], src[pos_[1]], src[pos_[2]], src[pos_[3]]}; - const float32x4_t val2 = (float32x4_t){src[pos_[0]+1], src[pos_[1]+1], src[pos_[2]+1], src[pos_[3]+1]}; - - /* val1 + (val2-val1)*mu */ - const float32x4_t r0 = vsubq_f32(val2, val1); - const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); - const float32x4_t out = vmlaq_f32(val1, mu, r0); - - vst1q_f32(&dst[i], out); - - frac4 = vaddq_s32(frac4, increment4); - pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); - frac4 = vandq_s32(frac4, fracMask4); - - vst1q_s32(pos_, pos4); - } - - if(i < numsamples) - { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - ALint pos = pos_[0]; - frac = vgetq_lane_s32(frac4, 0); - do { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); - } - return dst; -} - -const ALfloat *Resample_bsinc_Neon(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei dstlen) -{ - const ALfloat *const filter = state->bsinc.filter; - const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); - const ALsizei m = state->bsinc.m; - const float32x4_t *fil, *scd, *phd, *spd; - ALsizei pi, i, j, offset; - float32x4_t r4; - ALfloat pf; - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - ALsizei c; - float32x4_t leftright4; - { - float32x2_t leftright2 = vdup_n_f32(0.0); - leftright2 = vset_lane_f32(left, leftright2, 0); - leftright2 = vset_lane_f32(right, leftright2, 1); - leftright4 = vcombine_f32(leftright2, leftright2); - } - Values = ASSUME_ALIGNED(Values, 16); - Coeffs = ASSUME_ALIGNED(Coeffs, 16); - for(c = 0;c < IrSize;c += 2) - { - const ALsizei o0 = (Offset+c)&HRIR_MASK; - const ALsizei o1 = (o0+1)&HRIR_MASK; - float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), - vld1_f32((float32_t*)&Values[o1][0])); - float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); - - vals = vmlaq_f32(vals, coefs, leftright4); - - vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); - vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); - } -} - -#define MixHrtf MixHrtf_Neon -#define MixHrtfBlend MixHrtfBlend_Neon -#define MixDirectHrtf MixDirectHrtf_Neon -#include "mixer_inc.c" -#undef MixHrtf - - -void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - ALfloat gain, delta, step; - float32x4_t gain4; - ALsizei c; - - data = ASSUME_ALIGNED(data, 16); - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - /* Mix with applying gain steps in aligned multiples of 4. */ - if(minsize-pos > 3) - { - float32x4_t step4; - gain4 = vsetq_lane_f32(gain, gain4, 0); - gain4 = vsetq_lane_f32(gain + step, gain4, 1); - gain4 = vsetq_lane_f32(gain + step + step, gain4, 2); - gain4 = vsetq_lane_f32(gain + step + step + step, gain4, 3); - step4 = vdupq_n_f32(step + step + step + step); - do { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - gain4 = vaddq_f32(gain4, step4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(minsize-pos > 3); - /* NOTE: gain4 now represents the next four gains after the - * last four mixed samples, so the lowest element represents - * the next gain to apply. - */ - gain = vgetq_lane_f32(gain4, 0); - } - /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; - } - if(pos == Counter) - gain = TargetGains[c]; - CurrentGains[c] = gain; - - /* Mix until pos is aligned with 4 or the mix is done. */ - minsize = mini(BufferSize, (pos+3)&~3); - for(;pos < minsize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - gain4 = vdupq_n_f32(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - float32x4_t gain4; - ALsizei c; - - data = ASSUME_ALIGNED(data, 16); - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - - for(c = 0;c < InChans;c++) - { - ALsizei pos = 0; - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - gain4 = vdupq_n_f32(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const float32x4_t val4 = vld1q_f32(&data[c][InPos+pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[pos] += data[c][InPos+pos]*gain; - } -} diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c deleted file mode 100644 index 281b6f85..00000000 --- a/Alc/mixer_sse.c +++ /dev/null @@ -1,229 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alu.h" - -#include "alSource.h" -#include "alAuxEffectSlot.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) -{ - const ALfloat *const filter = state->bsinc.filter; - const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); - const ALsizei m = state->bsinc.m; - const __m128 *fil, *scd, *phd, *spd; - ALsizei pi, i, j, offset; - ALfloat pf; - __m128 r4; - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - const __m128 lrlr = _mm_setr_ps(left, right, left, right); - __m128 vals = _mm_setzero_ps(); - __m128 coeffs; - ALsizei i; - - Values = ASSUME_ALIGNED(Values, 16); - Coeffs = ASSUME_ALIGNED(Coeffs, 16); - if((Offset&1)) - { - const ALsizei o0 = Offset&HRIR_MASK; - const ALsizei o1 = (Offset+IrSize-1)&HRIR_MASK; - __m128 imp0, imp1; - - coeffs = _mm_load_ps(&Coeffs[0][0]); - vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]); - imp0 = _mm_mul_ps(lrlr, coeffs); - vals = _mm_add_ps(imp0, vals); - _mm_storel_pi((__m64*)&Values[o0][0], vals); - for(i = 1;i < IrSize-1;i += 2) - { - const ALsizei o2 = (Offset+i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i+1][0]); - vals = _mm_load_ps(&Values[o2][0]); - imp1 = _mm_mul_ps(lrlr, coeffs); - imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2)); - vals = _mm_add_ps(imp0, vals); - _mm_store_ps(&Values[o2][0], vals); - imp0 = imp1; - } - vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]); - imp0 = _mm_movehl_ps(imp0, imp0); - vals = _mm_add_ps(imp0, vals); - _mm_storel_pi((__m64*)&Values[o1][0], vals); - } - else - { - for(i = 0;i < IrSize;i += 2) - { - const ALsizei o = (Offset + i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i][0]); - vals = _mm_load_ps(&Values[o][0]); - vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs)); - _mm_store_ps(&Values[o][0], vals); - } - } -} - -#define MixHrtf MixHrtf_SSE -#define MixHrtfBlend MixHrtfBlend_SSE -#define MixDirectHrtf MixDirectHrtf_SSE -#include "mixer_inc.c" -#undef MixHrtf - - -void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - ALfloat gain, delta, step; - __m128 gain4; - ALsizei c; - - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - /* Mix with applying gain steps in aligned multiples of 4. */ - if(minsize-pos > 3) - { - __m128 step4; - gain4 = _mm_setr_ps( - gain, - gain + step, - gain + step + step, - gain + step + step + step - ); - step4 = _mm_set1_ps(step + step + step + step); - do { - const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - gain4 = _mm_add_ps(gain4, step4); - _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(minsize-pos > 3); - /* NOTE: gain4 now represents the next four gains after the - * last four mixed samples, so the lowest element represents - * the next gain to apply. - */ - gain = _mm_cvtss_f32(gain4); - } - /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; - } - if(pos == Counter) - gain = TargetGains[c]; - CurrentGains[c] = gain; - - /* Mix until pos is aligned with 4 or the mix is done. */ - minsize = mini(BufferSize, (pos+3)&~3); - for(;pos < minsize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - gain4 = _mm_set1_ps(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - __m128 gain4; - ALsizei c; - - for(c = 0;c < InChans;c++) - { - ALsizei pos = 0; - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - gain4 = _mm_set1_ps(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const __m128 val4 = _mm_load_ps(&data[c][InPos+pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[pos] += data[c][InPos+pos]*gain; - } -} diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c deleted file mode 100644 index 3f8224e7..00000000 --- a/Alc/mixer_sse2.c +++ /dev/null @@ -1,82 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2014 by Timothy Arceri . - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alu.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_lerp_SSE2(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); - const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); - - /* val1 + (val2-val1)*mu */ - const __m128 r0 = _mm_sub_ps(val2, val1); - const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); - const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = pos_.i[0]; - frac = _mm_cvtsi128_si32(frac4); - - for(;i < numsamples;i++) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c deleted file mode 100644 index e69de29b..00000000 diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c deleted file mode 100644 index 4f88d540..00000000 --- a/Alc/mixer_sse41.c +++ /dev/null @@ -1,86 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2014 by Timothy Arceri . - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alu.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); - const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); - - /* val1 + (val2-val1)*mu */ - const __m128 r0 = _mm_sub_ps(val2, val1); - const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); - const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - pos_.i[0] = _mm_extract_epi32(pos4, 0); - pos_.i[1] = _mm_extract_epi32(pos4, 1); - pos_.i[2] = _mm_extract_epi32(pos4, 2); - pos_.i[3] = _mm_extract_epi32(pos4, 3); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = pos_.i[0]; - frac = _mm_cvtsi128_si32(frac4); - - for(;i < numsamples;i++) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixvoice.c b/Alc/mixvoice.c new file mode 100644 index 00000000..0e039115 --- /dev/null +++ b/Alc/mixvoice.c @@ -0,0 +1,781 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "alMain.h" +#include "AL/al.h" +#include "AL/alc.h" +#include "alSource.h" +#include "alBuffer.h" +#include "alListener.h" +#include "alAuxEffectSlot.h" +#include "sample_cvt.h" +#include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" + +#include "cpu_caps.h" +#include "mixer/defs.h" + + +static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, + "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); + +extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); + + +/* BSinc24 requires up to 23 extra samples before the current position, and 24 after. */ +static_assert(MAX_RESAMPLE_PADDING >= 24, "MAX_RESAMPLE_PADDING must be at least 24!"); + + +enum Resampler ResamplerDefault = LinearResampler; + +MixerFunc MixSamples = Mix_C; +RowMixerFunc MixRowSamples = MixRow_C; +static HrtfMixerFunc MixHrtfSamples = MixHrtf_C; +static HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_C; + +static MixerFunc SelectMixer(void) +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Mix_Neon; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return Mix_SSE; +#endif + return Mix_C; +} + +static RowMixerFunc SelectRowMixer(void) +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixRow_Neon; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixRow_SSE; +#endif + return MixRow_C; +} + +static inline HrtfMixerFunc SelectHrtfMixer(void) +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixHrtf_Neon; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixHrtf_SSE; +#endif + return MixHrtf_C; +} + +static inline HrtfMixerBlendFunc SelectHrtfBlendMixer(void) +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixHrtfBlend_Neon; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixHrtfBlend_SSE; +#endif + return MixHrtfBlend_C; +} + +ResamplerFunc SelectResampler(enum Resampler resampler) +{ + switch(resampler) + { + case PointResampler: + return Resample_point_C; + case LinearResampler: +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Resample_lerp_Neon; +#endif +#ifdef HAVE_SSE4_1 + if((CPUCapFlags&CPU_CAP_SSE4_1)) + return Resample_lerp_SSE41; +#endif +#ifdef HAVE_SSE2 + if((CPUCapFlags&CPU_CAP_SSE2)) + return Resample_lerp_SSE2; +#endif + return Resample_lerp_C; + case FIR4Resampler: + return Resample_cubic_C; + case BSinc12Resampler: + case BSinc24Resampler: +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Resample_bsinc_Neon; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return Resample_bsinc_SSE; +#endif + return Resample_bsinc_C; + } + + return Resample_point_C; +} + + +void aluInitMixer(void) +{ + const char *str; + + if(ConfigValueStr(NULL, NULL, "resampler", &str)) + { + if(strcasecmp(str, "point") == 0 || strcasecmp(str, "none") == 0) + ResamplerDefault = PointResampler; + else if(strcasecmp(str, "linear") == 0) + ResamplerDefault = LinearResampler; + else if(strcasecmp(str, "cubic") == 0) + ResamplerDefault = FIR4Resampler; + else if(strcasecmp(str, "bsinc12") == 0) + ResamplerDefault = BSinc12Resampler; + else if(strcasecmp(str, "bsinc24") == 0) + ResamplerDefault = BSinc24Resampler; + else if(strcasecmp(str, "bsinc") == 0) + { + WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); + ResamplerDefault = BSinc12Resampler; + } + else if(strcasecmp(str, "sinc4") == 0 || strcasecmp(str, "sinc8") == 0) + { + WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); + ResamplerDefault = FIR4Resampler; + } + else + { + char *end; + long n = strtol(str, &end, 0); + if(*end == '\0' && (n == PointResampler || n == LinearResampler || n == FIR4Resampler)) + ResamplerDefault = n; + else + WARN("Invalid resampler: %s\n", str); + } + } + + MixHrtfBlendSamples = SelectHrtfBlendMixer(); + MixHrtfSamples = SelectHrtfMixer(); + MixSamples = SelectMixer(); + MixRowSamples = SelectRowMixer(); +} + + +static void SendAsyncEvent(ALCcontext *context, ALuint enumtype, ALenum type, + ALuint objid, ALuint param, const char *msg) +{ + AsyncEvent evt; + evt.EnumType = enumtype; + evt.Type = type; + evt.ObjectId = objid; + evt.Param = param; + strcpy(evt.Message, msg); + if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) + alsem_post(&context->EventSem); +} + + +static inline ALfloat Sample_ALubyte(ALubyte val) +{ return (val-128) * (1.0f/128.0f); } + +static inline ALfloat Sample_ALshort(ALshort val) +{ return val * (1.0f/32768.0f); } + +static inline ALfloat Sample_ALfloat(ALfloat val) +{ return val; } + +static inline ALfloat Sample_ALdouble(ALdouble val) +{ return (ALfloat)val; } + +typedef ALubyte ALmulaw; +static inline ALfloat Sample_ALmulaw(ALmulaw val) +{ return muLawDecompressionTable[val] * (1.0f/32768.0f); } + +typedef ALubyte ALalaw; +static inline ALfloat Sample_ALalaw(ALalaw val) +{ return aLawDecompressionTable[val] * (1.0f/32768.0f); } + +#define DECL_TEMPLATE(T) \ +static inline void Load_##T(ALfloat *restrict dst, const T *restrict src, \ + ALint srcstep, ALsizei samples) \ +{ \ + ALsizei i; \ + for(i = 0;i < samples;i++) \ + dst[i] += Sample_##T(src[i*srcstep]); \ +} + +DECL_TEMPLATE(ALubyte) +DECL_TEMPLATE(ALshort) +DECL_TEMPLATE(ALfloat) +DECL_TEMPLATE(ALdouble) +DECL_TEMPLATE(ALmulaw) +DECL_TEMPLATE(ALalaw) + +#undef DECL_TEMPLATE + +static void LoadSamples(ALfloat *restrict dst, const ALvoid *restrict src, ALint srcstep, + enum FmtType srctype, ALsizei samples) +{ +#define HANDLE_FMT(ET, ST) case ET: Load_##ST(dst, src, srcstep, samples); break + switch(srctype) + { + HANDLE_FMT(FmtUByte, ALubyte); + HANDLE_FMT(FmtShort, ALshort); + HANDLE_FMT(FmtFloat, ALfloat); + HANDLE_FMT(FmtDouble, ALdouble); + HANDLE_FMT(FmtMulaw, ALmulaw); + HANDLE_FMT(FmtAlaw, ALalaw); + } +#undef HANDLE_FMT +} + + +static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter, + ALfloat *restrict dst, const ALfloat *restrict src, + ALsizei numsamples, enum ActiveFilters type) +{ + ALsizei i; + switch(type) + { + case AF_None: + ALfilterState_processPassthru(lpfilter, src, numsamples); + ALfilterState_processPassthru(hpfilter, src, numsamples); + break; + + case AF_LowPass: + ALfilterState_process(lpfilter, dst, src, numsamples); + ALfilterState_processPassthru(hpfilter, dst, numsamples); + return dst; + case AF_HighPass: + ALfilterState_processPassthru(lpfilter, src, numsamples); + ALfilterState_process(hpfilter, dst, src, numsamples); + return dst; + + case AF_BandPass: + for(i = 0;i < numsamples;) + { + ALfloat temp[256]; + ALsizei todo = mini(256, numsamples-i); + + ALfilterState_process(lpfilter, temp, src+i, todo); + ALfilterState_process(hpfilter, dst+i, temp, todo); + i += todo; + } + return dst; + } + return src; +} + + +/* This function uses these device temp buffers. */ +#define SOURCE_DATA_BUF 0 +#define RESAMPLED_BUF 1 +#define FILTERED_BUF 2 +#define NFC_DATA_BUF 3 +ALboolean MixSource(ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo) +{ + ALCdevice *Device = Context->Device; + ALbufferlistitem *BufferListItem; + ALbufferlistitem *BufferLoopItem; + ALsizei NumChannels, SampleSize; + ALbitfieldSOFT enabledevt; + ALsizei buffers_done = 0; + ResamplerFunc Resample; + ALsizei DataPosInt; + ALsizei DataPosFrac; + ALint64 DataSize64; + ALint increment; + ALsizei Counter; + ALsizei OutPos; + ALsizei IrSize; + bool isplaying; + bool firstpass; + bool isstatic; + ALsizei chan; + ALsizei send; + + /* Get source info */ + isplaying = true; /* Will only be called while playing. */ + isstatic = !!(voice->Flags&VOICE_IS_STATIC); + DataPosInt = ATOMIC_LOAD(&voice->position, almemory_order_acquire); + DataPosFrac = ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); + BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); + BufferLoopItem = ATOMIC_LOAD(&voice->loop_buffer, almemory_order_relaxed); + NumChannels = voice->NumChannels; + SampleSize = voice->SampleSize; + increment = voice->Step; + + IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0); + + Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ? + Resample_copy_C : voice->Resampler); + + Counter = (voice->Flags&VOICE_IS_FADING) ? SamplesToDo : 0; + firstpass = true; + OutPos = 0; + + do { + ALsizei SrcBufferSize, DstBufferSize; + + /* Figure out how many buffer samples will be needed */ + DataSize64 = SamplesToDo-OutPos; + DataSize64 *= increment; + DataSize64 += DataPosFrac+FRACTIONMASK; + DataSize64 >>= FRACTIONBITS; + DataSize64 += MAX_RESAMPLE_PADDING*2; + SrcBufferSize = (ALsizei)mini64(DataSize64, BUFFERSIZE); + + /* Figure out how many samples we can actually mix from this. */ + DataSize64 = SrcBufferSize; + DataSize64 -= MAX_RESAMPLE_PADDING*2; + DataSize64 <<= FRACTIONBITS; + DataSize64 -= DataPosFrac; + DstBufferSize = (ALsizei)mini64((DataSize64+(increment-1)) / increment, + SamplesToDo - OutPos); + + /* Some mixers like having a multiple of 4, so try to give that unless + * this is the last update. */ + if(DstBufferSize < SamplesToDo-OutPos) + DstBufferSize &= ~3; + + /* It's impossible to have a buffer list item with no entries. */ + assert(BufferListItem->num_buffers > 0); + + for(chan = 0;chan < NumChannels;chan++) + { + const ALfloat *ResampledData; + ALfloat *SrcData = Device->TempBuffer[SOURCE_DATA_BUF]; + ALsizei FilledAmt; + + /* Load the previous samples into the source data first, and clear the rest. */ + memcpy(SrcData, voice->PrevSamples[chan], MAX_RESAMPLE_PADDING*sizeof(ALfloat)); + memset(SrcData+MAX_RESAMPLE_PADDING, 0, (BUFFERSIZE-MAX_RESAMPLE_PADDING)* + sizeof(ALfloat)); + FilledAmt = MAX_RESAMPLE_PADDING; + + if(isstatic) + { + /* TODO: For static sources, loop points are taken from the + * first buffer (should be adjusted by any buffer offset, to + * possibly be added later). + */ + const ALbuffer *Buffer0 = BufferListItem->buffers[0]; + const ALsizei LoopStart = Buffer0->LoopStart; + const ALsizei LoopEnd = Buffer0->LoopEnd; + const ALsizei LoopSize = LoopEnd - LoopStart; + + /* If current pos is beyond the loop range, do not loop */ + if(!BufferLoopItem || DataPosInt >= LoopEnd) + { + ALsizei SizeToDo = SrcBufferSize - FilledAmt; + ALsizei CompLen = 0; + ALsizei i; + + BufferLoopItem = NULL; + + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; + + if(DataPosInt >= buffer->SampleLen) + continue; + + /* Load what's left to play from the buffer */ + DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(DataPosInt*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; + } + else + { + ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopEnd - DataPosInt); + ALsizei CompLen = 0; + ALsizei i; + + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; + + if(DataPosInt >= buffer->SampleLen) + continue; + + /* Load what's left of this loop iteration */ + DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(DataPosInt*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; + + while(SrcBufferSize > FilledAmt) + { + const ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopSize); + + CompLen = 0; + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; + + if(LoopStart >= buffer->SampleLen) + continue; + + DataSize = mini(SizeToDo, buffer->SampleLen - LoopStart); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(LoopStart*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; + } + } + } + else + { + /* Crawl the buffer queue to fill in the temp buffer */ + ALbufferlistitem *tmpiter = BufferListItem; + ALsizei pos = DataPosInt; + + while(tmpiter && SrcBufferSize > FilledAmt) + { + ALsizei SizeToDo = SrcBufferSize - FilledAmt; + ALsizei CompLen = 0; + ALsizei i; + + for(i = 0;i < tmpiter->num_buffers;i++) + { + const ALbuffer *ALBuffer = tmpiter->buffers[i]; + ALsizei DataSize = ALBuffer ? ALBuffer->SampleLen : 0; + CompLen = maxi(CompLen, DataSize); + + if(DataSize > pos) + { + const ALubyte *Data = ALBuffer->data; + Data += (pos*NumChannels + chan)*SampleSize; + + DataSize = minu(SizeToDo, DataSize - pos); + LoadSamples(&SrcData[FilledAmt], Data, NumChannels, + ALBuffer->FmtType, DataSize); + } + } + if(pos > CompLen) + pos -= CompLen; + else + { + FilledAmt += CompLen - pos; + pos = 0; + } + if(SrcBufferSize > FilledAmt) + { + tmpiter = ATOMIC_LOAD(&tmpiter->next, almemory_order_acquire); + if(!tmpiter) tmpiter = BufferLoopItem; + } + } + } + + /* Store the last source samples used for next time. */ + memcpy(voice->PrevSamples[chan], + &SrcData[(increment*DstBufferSize + DataPosFrac)>>FRACTIONBITS], + MAX_RESAMPLE_PADDING*sizeof(ALfloat) + ); + + /* Now resample, then filter and mix to the appropriate outputs. */ + ResampledData = Resample(&voice->ResampleState, + &SrcData[MAX_RESAMPLE_PADDING], DataPosFrac, increment, + Device->TempBuffer[RESAMPLED_BUF], DstBufferSize + ); + { + DirectParams *parms = &voice->Direct.Params[chan]; + const ALfloat *samples; + + samples = DoFilters( + &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], + ResampledData, DstBufferSize, voice->Direct.FilterType + ); + if(!(voice->Flags&VOICE_HAS_HRTF)) + { + if(!Counter) + memcpy(parms->Gains.Current, parms->Gains.Target, + sizeof(parms->Gains.Current)); + if(!(voice->Flags&VOICE_HAS_NFC)) + MixSamples(samples, voice->Direct.Channels, voice->Direct.Buffer, + parms->Gains.Current, parms->Gains.Target, Counter, OutPos, + DstBufferSize + ); + else + { + ALfloat *nfcsamples = Device->TempBuffer[NFC_DATA_BUF]; + ALsizei chanoffset = 0; + + MixSamples(samples, + voice->Direct.ChannelsPerOrder[0], voice->Direct.Buffer, + parms->Gains.Current, parms->Gains.Target, Counter, OutPos, + DstBufferSize + ); + chanoffset += voice->Direct.ChannelsPerOrder[0]; +#define APPLY_NFC_MIX(order) \ + if(voice->Direct.ChannelsPerOrder[order] > 0) \ + { \ + NfcFilterUpdate##order(&parms->NFCtrlFilter, nfcsamples, samples, \ + DstBufferSize); \ + MixSamples(nfcsamples, voice->Direct.ChannelsPerOrder[order], \ + voice->Direct.Buffer+chanoffset, parms->Gains.Current+chanoffset, \ + parms->Gains.Target+chanoffset, Counter, OutPos, DstBufferSize \ + ); \ + chanoffset += voice->Direct.ChannelsPerOrder[order]; \ + } + APPLY_NFC_MIX(1) + APPLY_NFC_MIX(2) + APPLY_NFC_MIX(3) +#undef APPLY_NFC_MIX + } + } + else + { + MixHrtfParams hrtfparams; + ALsizei fademix = 0; + int lidx, ridx; + + lidx = GetChannelIdxByName(&Device->RealOut, FrontLeft); + ridx = GetChannelIdxByName(&Device->RealOut, FrontRight); + assert(lidx != -1 && ridx != -1); + + if(!Counter) + { + /* No fading, just overwrite the old HRTF params. */ + parms->Hrtf.Old = parms->Hrtf.Target; + } + else if(!(parms->Hrtf.Old.Gain > GAIN_SILENCE_THRESHOLD)) + { + /* The old HRTF params are silent, so overwrite the old + * coefficients with the new, and reset the old gain to + * 0. The future mix will then fade from silence. + */ + parms->Hrtf.Old = parms->Hrtf.Target; + parms->Hrtf.Old.Gain = 0.0f; + } + else if(firstpass) + { + ALfloat gain; + + /* Fade between the coefficients over 128 samples. */ + fademix = mini(DstBufferSize, 128); + + /* The new coefficients need to fade in completely + * since they're replacing the old ones. To keep the + * gain fading consistent, interpolate between the old + * and new target gains given how much of the fade time + * this mix handles. + */ + gain = lerp(parms->Hrtf.Old.Gain, parms->Hrtf.Target.Gain, + minf(1.0f, (ALfloat)fademix/Counter)); + hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; + hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; + hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; + hrtfparams.Gain = 0.0f; + hrtfparams.GainStep = gain / (ALfloat)fademix; + + MixHrtfBlendSamples( + voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], + samples, voice->Offset, OutPos, IrSize, &parms->Hrtf.Old, + &hrtfparams, &parms->Hrtf.State, fademix + ); + /* Update the old parameters with the result. */ + parms->Hrtf.Old = parms->Hrtf.Target; + if(fademix < Counter) + parms->Hrtf.Old.Gain = hrtfparams.Gain; + } + + if(fademix < DstBufferSize) + { + ALsizei todo = DstBufferSize - fademix; + ALfloat gain = parms->Hrtf.Target.Gain; + + /* Interpolate the target gain if the gain fading lasts + * longer than this mix. + */ + if(Counter > DstBufferSize) + gain = lerp(parms->Hrtf.Old.Gain, gain, + (ALfloat)todo/(Counter-fademix)); + + hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; + hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; + hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; + hrtfparams.Gain = parms->Hrtf.Old.Gain; + hrtfparams.GainStep = (gain - parms->Hrtf.Old.Gain) / (ALfloat)todo; + MixHrtfSamples( + voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], + samples+fademix, voice->Offset+fademix, OutPos+fademix, IrSize, + &hrtfparams, &parms->Hrtf.State, todo + ); + /* Store the interpolated gain or the final target gain + * depending if the fade is done. + */ + if(DstBufferSize < Counter) + parms->Hrtf.Old.Gain = gain; + else + parms->Hrtf.Old.Gain = parms->Hrtf.Target.Gain; + } + } + } + + for(send = 0;send < Device->NumAuxSends;send++) + { + SendParams *parms = &voice->Send[send].Params[chan]; + const ALfloat *samples; + + if(!voice->Send[send].Buffer) + continue; + + samples = DoFilters( + &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], + ResampledData, DstBufferSize, voice->Send[send].FilterType + ); + + if(!Counter) + memcpy(parms->Gains.Current, parms->Gains.Target, + sizeof(parms->Gains.Current)); + MixSamples(samples, voice->Send[send].Channels, voice->Send[send].Buffer, + parms->Gains.Current, parms->Gains.Target, Counter, OutPos, DstBufferSize + ); + } + } + /* Update positions */ + DataPosFrac += increment*DstBufferSize; + DataPosInt += DataPosFrac>>FRACTIONBITS; + DataPosFrac &= FRACTIONMASK; + + OutPos += DstBufferSize; + voice->Offset += DstBufferSize; + Counter = maxi(DstBufferSize, Counter) - DstBufferSize; + firstpass = false; + + if(isstatic) + { + if(BufferLoopItem) + { + /* Handle looping static source */ + const ALbuffer *Buffer = BufferListItem->buffers[0]; + ALsizei LoopStart = Buffer->LoopStart; + ALsizei LoopEnd = Buffer->LoopEnd; + if(DataPosInt >= LoopEnd) + { + assert(LoopEnd > LoopStart); + DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; + } + } + else + { + /* Handle non-looping static source */ + ALsizei CompLen = 0; + ALsizei i; + + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + if(buffer) CompLen = maxi(CompLen, buffer->SampleLen); + } + + if(DataPosInt >= CompLen) + { + isplaying = false; + BufferListItem = NULL; + DataPosInt = 0; + DataPosFrac = 0; + break; + } + } + } + else while(1) + { + /* Handle streaming source */ + ALsizei CompLen = 0; + ALsizei i; + + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + if(buffer) CompLen = maxi(CompLen, buffer->SampleLen); + } + + if(CompLen > DataPosInt) + break; + + buffers_done += BufferListItem->num_buffers; + BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_acquire); + if(!BufferListItem && !(BufferListItem=BufferLoopItem)) + { + isplaying = false; + DataPosInt = 0; + DataPosFrac = 0; + break; + } + + DataPosInt -= CompLen; + } + } while(isplaying && OutPos < SamplesToDo); + + voice->Flags |= VOICE_IS_FADING; + + /* Update source info */ + ATOMIC_STORE(&voice->position, DataPosInt, almemory_order_relaxed); + ATOMIC_STORE(&voice->position_fraction, DataPosFrac, almemory_order_relaxed); + ATOMIC_STORE(&voice->current_buffer, BufferListItem, almemory_order_release); + + /* Send any events now, after the position/buffer info was updated. */ + enabledevt = ATOMIC_LOAD(&Context->EnabledEvts, almemory_order_acquire); + if(buffers_done > 0 && (enabledevt&EventType_BufferCompleted)) + SendAsyncEvent(Context, EventType_BufferCompleted, + AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, SourceID, buffers_done, "Buffer completed" + ); + + return isplaying; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 986a6c32..646a437c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -735,8 +735,8 @@ SET(ALC_OBJS Alc/ALc.c Alc/bformatdec.c Alc/nfcfilter.c Alc/panning.c - Alc/mixer.c - Alc/mixer_c.c + Alc/mixvoice.c + Alc/mixer/mixer_c.c ) @@ -770,9 +770,9 @@ IF(HAVE_XMMINTRIN_H) IF(ALSOFT_CPUEXT_SSE) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse.c) IF(SSE_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse.c PROPERTIES COMPILE_FLAGS "${SSE_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE") @@ -790,9 +790,9 @@ IF(HAVE_EMMINTRIN_H) IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE2 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse2.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse2.c) IF(SSE2_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse2.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse2.c PROPERTIES COMPILE_FLAGS "${SSE2_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE2") @@ -810,9 +810,9 @@ IF(HAVE_EMMINTRIN_H) IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE3) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE3 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse3.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse3.c) IF(SSE2_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse3.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse3.c PROPERTIES COMPILE_FLAGS "${SSE3_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE3") @@ -830,9 +830,9 @@ IF(HAVE_SMMINTRIN_H) IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE4_1 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse41.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse41.c) IF(SSE4_1_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse41.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse41.c PROPERTIES COMPILE_FLAGS "${SSE4_1_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE4.1") @@ -850,9 +850,9 @@ IF(HAVE_ARM_NEON_H) OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON) IF(ALSOFT_CPUEXT_NEON) SET(HAVE_NEON 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_neon.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_neon.c) IF(FPU_NEON_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_neon.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_neon.c PROPERTIES COMPILE_FLAGS "${FPU_NEON_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, Neon") -- cgit v1.2.3