+
+ uint start = new_dist[i] - new_val;
+ uint freq = new_val;
+
+ uint x_max = ((RANS_BYTE_L >> (prob_bits + 1)) << 8) * freq;
+ uint cmpl_freq = ((1 << (prob_bits + 1)) - freq);
+ uint rcp_freq, rcp_shift, bias;
+ if (freq < 2) {
+ rcp_freq = ~0u;
+ rcp_shift = 0;
+ bias = start + (1 << (prob_bits + 1)) - 1;
+ } else {
+ uint shift = 0;
+ while (freq > (1u << shift)) {
+ shift++;
+ }
+
+ rcp_freq = uint(((uint64_t(1) << (shift + 31)) + freq-1) / freq);
+ rcp_shift = shift - 1;
+ bias = start;
+ }
+
+ ransfreq[base + i] = freq;
+ ransdist[base + i] = uvec4(x_max, rcp_freq, bias, (cmpl_freq << 16) | rcp_shift);
+
+ if (i == 255) {
+ sign_biases[gl_WorkGroupID.x] = new_dist[i];
+ }