GPUs have cmovs as standard.
Unified · Split
| @@ -219,7 +219,7 @@ void refill(inout RangeCoder c) · 218 unmodified lines | |||
| 219 | c.range <<= 8; | 219 | c.range <<= 8; |
| 220 | c.low <<= 8; | 220 | c.low <<= 8; |
| 221 | if (c.bytestream < c.bytestream_end) { | 221 | if (c.bytestream < c.bytestream_end) { |
| 222 | c.low += u8buf(c.bytestream).v; | 222 | c.low |= u8buf(c.bytestream).v; |
| 223 | c.bytestream++; | 223 | c.bytestream++; |
| 224 | } else { | 224 | } else { |
| 225 | overread++; | 225 | overread++; |
| @@ -234,11 +234,10 @@ bool get_rac(inout RangeCoder c, uint64_t state) · 8 unmodified lines | |||
| 234 | int ranged = c.range + range1; | 234 | int ranged = c.range + range1; |
| 235 | 235 | ||
| 236 | bool bit = c.low >= ranged; | 236 | bool bit = c.low >= ranged; |
| 237 | int bv = bit ? 0xFFFFFFFF : 0; | 237 | sb.v = zero_one_state[val + (bit ? 256 : 0)]; |
| 238 | sb.v = zero_one_state[(bv & 0x100) + val]; | ||
| 239 | 238 | ||
| 240 | c.low = c.low - (bv & ranged); | 239 | c.low = c.low - (bit ? ranged : 0); |
| 241 | c.range = (ranged & ~bv) - (range1 & bv); | 240 | c.range = (bit ? 0 : ranged) - (bit ? range1 : 0); |
| 242 | 241 | ||
| 243 | if (c.range < 0x100) | 242 | if (c.range < 0x100) |
| 244 | refill(c); | 243 | refill(c); |