diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expr.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/gcc/expr.cc b/gcc/expr.cc index 5578e3d..980ac41 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -14336,29 +14336,32 @@ generate_crc_table (unsigned HOST_WIDE_INT polynom, unsigned short crc_bits) void calculate_table_based_CRC (rtx *crc, const rtx &input_data, const rtx &polynomial, - machine_mode crc_mode, machine_mode data_mode) + machine_mode data_mode) { - unsigned short crc_bit_size = GET_MODE_BITSIZE (crc_mode).to_constant (); - unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); machine_mode mode = GET_MODE (*crc); + unsigned short crc_bit_size = GET_MODE_BITSIZE (mode).to_constant (); + unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); rtx tab = generate_crc_table (UINTVAL (polynomial), crc_bit_size); for (unsigned short i = 0; i < data_size; i++) { /* crc >> (crc_bit_size - 8). */ - *crc = force_reg (crc_mode, *crc); + *crc = force_reg (mode, *crc); rtx op1 = expand_shift (RSHIFT_EXPR, mode, *crc, crc_bit_size - 8, NULL_RTX, 1); /* data >> (8 * (GET_MODE_SIZE (data_mode).to_constant () - i - 1)). */ unsigned range_8 = 8 * (data_size - i - 1); - rtx data = force_reg (data_mode, input_data); + /* CRC's mode is always at least as wide as INPUT_DATA. Convert + INPUT_DATA into CRC's mode. */ + rtx data = gen_reg_rtx (mode); + convert_move (data, input_data, 1); data = expand_shift (RSHIFT_EXPR, mode, data, range_8, NULL_RTX, 1); - /* data >> (8 * (GET_MODE_SIZE (data_mode) + /* data >> (8 * (GET_MODE_SIZE (mode) .to_constant () - i - 1)) & 0xFF. */ rtx data_final = expand_and (mode, data, - gen_int_mode (255, data_mode), NULL_RTX); + gen_int_mode (255, mode), NULL_RTX); /* (crc >> (crc_bit_size - 8)) ^ data_8bit. */ rtx in = expand_binop (mode, xor_optab, op1, data_final, @@ -14367,7 +14370,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, /* ((crc >> (crc_bit_size - 8)) ^ data_8bit) & 0xFF. */ rtx index = expand_and (mode, in, gen_int_mode (255, mode), NULL_RTX); - int log_crc_size = exact_log2 (GET_MODE_SIZE (crc_mode).to_constant ()); + int log_crc_size = exact_log2 (GET_MODE_SIZE (mode).to_constant ()); index = expand_shift (LSHIFT_EXPR, mode, index, log_crc_size, NULL_RTX, 0); @@ -14377,7 +14380,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, 0, OPTAB_DIRECT); /* crc_table[(crc >> (crc_bit_size - 8)) ^ data_8bit] */ - rtx tab_el = validize_mem (gen_rtx_MEM (crc_mode, addr)); + rtx tab_el = validize_mem (gen_rtx_MEM (mode, addr)); /* (crc << 8) if CRC is larger than 8, otherwise crc = 0. */ rtx high = NULL_RTX; @@ -14420,7 +14423,7 @@ expand_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, machine_mode crc_mode = GET_MODE (op0); rtx crc = gen_reg_rtx (crc_mode); convert_move (crc, op1, 0); - calculate_table_based_CRC (&crc, op2, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, op2, op3, data_mode); convert_move (op0, crc, 0); } @@ -14563,7 +14566,7 @@ expand_reversed_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, convert_move (data, op2, 0); gen_reflecting_code (&data); - calculate_table_based_CRC (&crc, data, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, data, op3, data_mode); gen_reflecting_code (&crc); convert_move (op0, crc, 0); |