Mozilla MPL TODO: evaluate license, possibly rewrite https://github.com/Siguza/iometa/blob/master/src/a64.c */
| 531 | TODO: evaluate license, possibly rewrite |
| 532 | https://github.com/Siguza/iometa/blob/master/src/a64.c */ |
| 533 | uint64_t Replicate(uint64_t val, uint8_t times, uint64_t width) |
| 534 | { |
| 535 | // Fast path |
| 536 | switch (times) |
| 537 | { |
| 538 | case 64: |
| 539 | val |= val << width; |
| 540 | width <<= 1; |
| 541 | case 32: |
| 542 | val |= val << width; |
| 543 | width <<= 1; |
| 544 | case 16: |
| 545 | val |= val << width; |
| 546 | width <<= 1; |
| 547 | case 8: |
| 548 | val |= val << width; |
| 549 | width <<= 1; |
| 550 | case 4: |
| 551 | val |= val << width; |
| 552 | width <<= 1; |
| 553 | case 2: |
| 554 | val |= val << width; |
| 555 | case 1: |
| 556 | return val; |
| 557 | case 0: |
| 558 | return 0; |
| 559 | default: |
| 560 | break; |
| 561 | } |
| 562 | // Slow path |
| 563 | uint64_t orig = val; |
| 564 | for (size_t i = 0; i < times; ++i) |
| 565 | { |
| 566 | val <<= width; |
| 567 | val |= orig; |
| 568 | } |
| 569 | return val; |
| 570 | } |
| 571 | |
| 572 | /* Mozilla MPL |
| 573 | TODO: evaluate license, possibly rewrite |
no outgoing calls
no test coverage detected