Path: blob/master/Utilities/cmliblzma/liblzma/simple/ia64.c
3156 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file ia64.c5/// \brief Filter for IA64 (Itanium) binaries6///7// Authors: Igor Pavlov8// Lasse Collin9//10///////////////////////////////////////////////////////////////////////////////1112#include "simple_private.h"131415static size_t16ia64_code(void *simple lzma_attribute((__unused__)),17uint32_t now_pos, bool is_encoder,18uint8_t *buffer, size_t size)19{20static const uint32_t BRANCH_TABLE[32] = {210, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,234, 4, 6, 6, 0, 0, 7, 7,244, 4, 0, 0, 4, 4, 0, 025};2627size_t i;28for (i = 0; i + 16 <= size; i += 16) {29const uint32_t instr_template = buffer[i] & 0x1F;30const uint32_t mask = BRANCH_TABLE[instr_template];31uint32_t bit_pos = 5;3233for (size_t slot = 0; slot < 3; ++slot, bit_pos += 41) {34if (((mask >> slot) & 1) == 0)35continue;3637const size_t byte_pos = (bit_pos >> 3);38const uint32_t bit_res = bit_pos & 0x7;39uint64_t instruction = 0;4041for (size_t j = 0; j < 6; ++j)42instruction += (uint64_t)(43buffer[i + j + byte_pos])44<< (8 * j);4546uint64_t inst_norm = instruction >> bit_res;4748if (((inst_norm >> 37) & 0xF) == 0x549&& ((inst_norm >> 9) & 0x7) == 050/* && (inst_norm & 0x3F)== 0 */51) {52uint32_t src = (uint32_t)(53(inst_norm >> 13) & 0xFFFFF);54src |= ((inst_norm >> 36) & 1) << 20;5556src <<= 4;5758uint32_t dest;59if (is_encoder)60dest = now_pos + (uint32_t)(i) + src;61else62dest = src - (now_pos + (uint32_t)(i));6364dest >>= 4;6566inst_norm &= ~((uint64_t)(0x8FFFFF) << 13);67inst_norm |= (uint64_t)(dest & 0xFFFFF) << 13;68inst_norm |= (uint64_t)(dest & 0x100000)69<< (36 - 20);7071instruction &= (1U << bit_res) - 1;72instruction |= (inst_norm << bit_res);7374for (size_t j = 0; j < 6; j++)75buffer[i + j + byte_pos] = (uint8_t)(76instruction77>> (8 * j));78}79}80}8182return i;83}848586static lzma_ret87ia64_coder_init(lzma_next_coder *next, const lzma_allocator *allocator,88const lzma_filter_info *filters, bool is_encoder)89{90return lzma_simple_coder_init(next, allocator, filters,91&ia64_code, 0, 16, 16, is_encoder);92}939495#ifdef HAVE_ENCODER_IA6496extern lzma_ret97lzma_simple_ia64_encoder_init(lzma_next_coder *next,98const lzma_allocator *allocator,99const lzma_filter_info *filters)100{101return ia64_coder_init(next, allocator, filters, true);102}103#endif104105106#ifdef HAVE_DECODER_IA64107extern lzma_ret108lzma_simple_ia64_decoder_init(lzma_next_coder *next,109const lzma_allocator *allocator,110const lzma_filter_info *filters)111{112return ia64_coder_init(next, allocator, filters, false);113}114#endif115116117