diff options
author | iximeow <me@iximeow.net> | 2020-12-06 15:54:31 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-12-06 15:54:31 -0800 |
commit | c9f67f0f30cbd1459b80b2d8380fba3407e36bfa (patch) | |
tree | 454977f569696d4f913225cac8a54c4433c4bfb9 /src/armv7 | |
parent | fde906acd802e071c8a7f9435ea205692e4b26b4 (diff) |
propagate up invalid thumb immediate expansion
Diffstat (limited to 'src/armv7')
-rw-r--r-- | src/armv7/thumb.rs | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/armv7/thumb.rs b/src/armv7/thumb.rs index d314d7e..0d2a36e 100644 --- a/src/armv7/thumb.rs +++ b/src/armv7/thumb.rs @@ -23,31 +23,31 @@ fn ROR_C(x: u32, shift: u16) -> (u32, bool) { } #[allow(non_snake_case)] -fn ThumbExpandImm_C(imm: u16) -> u32 { +fn ThumbExpandImm_C(imm: u16) -> Result<u32, DecodeError> { if imm & 0b1100_0000_0000 == 0 { let ty = (imm >> 8) & 0b11; let imm_low = (imm & 0b11111111) as u32; match ty { 0b00 => { - imm_low + Ok(imm_low) } 0b01 => { if imm_low == 0 { - panic!("unpredictable"); + return Err(DecodeError::Unpredictable); } - (imm_low << 16) | imm_low + Ok((imm_low << 16) | imm_low) } 0b10 => { if imm_low == 0 { - panic!("unpredictable"); + return Err(DecodeError::Unpredictable); } - (imm_low << 24) | (imm_low << 8) + Ok((imm_low << 24) | (imm_low << 8)) } 0b11 => { if imm_low == 0 { - panic!("unpredictable"); + return Err(DecodeError::Unpredictable); } - (imm_low << 24) | (imm_low << 16) | (imm_low << 8) | imm_low + Ok((imm_low << 24) | (imm_low << 16) | (imm_low << 8) | imm_low) } _ => { unreachable!("impossible bit pattern"); @@ -58,7 +58,7 @@ fn ThumbExpandImm_C(imm: u16) -> u32 { let rot = (imm >> 7) & 0b11111; // TODO: figure out what to do with carry_out let (imm32, _carry_out) = ROR_C(unrotated_value, rot); - imm32 + Ok(imm32) } } @@ -1049,7 +1049,7 @@ pub fn decode_into<T: IntoIterator<Item=u8>>(decoder: &InstDecoder, inst: &mut I inst.s = s; - let imm = ThumbExpandImm_C(imm); + let imm = ThumbExpandImm_C(imm)?; match op { 0b0000 => { |