Есть ли хитрость для эффективной распаковки 16-битного упакованного номера BCD?
Для этого по пешеходному пути требуется 10 операций (3 смены, 4 AND и 3 OR или ADD):
x = (bcd & 0xF000) << 12
| (bcd & 0x0F00) << 8
| (bcd & 0x00F0) << 4
| (bcd & 0x000F)
При многоканальном ADD / OR критическая длина пути составит 3 но эти операции, как правило, являются двоичными, и поэтому большинство процессоров будут искать критический путь длиной 4.
Может ли это быть сделано более эффективно?
Примечание: для некоторых целей это может быть одинаково полезно, если некоторую перестановку кусочков можно распаковать особенно эффективно, например, если слово, которое нужно распаковать, происходит из справочной таблицы, над созданием которой у меня есть полный контроль (так что я могу прикрепить каждый ди git куда угодно Я хочу). Целью использования упакованного вместо распакованного BCD в этом случае было бы вдвое уменьшить нагрузку на память и избежать превышения размера кэша L1, снимая некоторую нагрузку с перенасыщенной подсистемы памяти, увеличивая нагрузку на ALU ЦП.
Например, если я переставлю цифры как 0x1324, то простое обратное чередование даст 0x01020304:
x = ((bcd << 12) | bcd) & 0x0F0F0F0F
Это всего три операции с критической длиной пути 3, что значительно лучше, чем в исходной версии ...