Factor out shared logic for widening ops.

Copyright (c) 2021, Arm Limited
This commit is contained in:
dheaton-arm
2021-09-14 13:08:35 +01:00
parent a595bd22e3
commit 99cc95d630

View File

@@ -840,40 +840,29 @@ where
V::bool(true, types::B1)?, V::bool(true, types::B1)?,
|acc, lane| acc.and(lane), |acc, lane| acc.and(lane),
)?), )?),
Opcode::SwidenLow => { Opcode::SwidenLow | Opcode::SwidenHigh | Opcode::UwidenLow | Opcode::UwidenHigh => {
let new_type = ctrl_ty.merge_lanes().unwrap(); let new_type = ctrl_ty.merge_lanes().unwrap();
let new_vec = extractlanes(&arg(0)?, ctrl_ty.lane_type())? let conv_type = match inst.opcode() {
.into_iter() Opcode::SwidenLow | Opcode::SwidenHigh => {
.take(new_type.lane_count() as usize) ValueConversionKind::SignExtend(new_type.lane_type())
.map(|lane| lane.convert(ValueConversionKind::SignExtend(new_type.lane_type()))) }
.collect::<ValueResult<Vec<_>>>()?; Opcode::UwidenLow | Opcode::UwidenHigh => {
assign(vectorizelanes(&new_vec, new_type)?) ValueConversionKind::ZeroExtend(new_type.lane_type())
} }
Opcode::SwidenHigh => { _ => unreachable!(),
let new_type = ctrl_ty.merge_lanes().unwrap(); };
let new_vec = extractlanes(&arg(0)?, ctrl_ty.lane_type())? let vec_iter = extractlanes(&arg(0)?, ctrl_ty.lane_type())?.into_iter();
.into_iter() let new_vec = match inst.opcode() {
.skip(new_type.lane_count() as usize) Opcode::SwidenLow | Opcode::UwidenLow => vec_iter
.map(|lane| lane.convert(ValueConversionKind::SignExtend(new_type.lane_type()))) .take(new_type.lane_count() as usize)
.collect::<ValueResult<Vec<_>>>()?; .map(|lane| lane.convert(conv_type.clone()))
assign(vectorizelanes(&new_vec, new_type)?) .collect::<ValueResult<Vec<_>>>()?,
} Opcode::SwidenHigh | Opcode::UwidenHigh => vec_iter
Opcode::UwidenLow => { .skip(new_type.lane_count() as usize)
let new_type = ctrl_ty.merge_lanes().unwrap(); .map(|lane| lane.convert(conv_type.clone()))
let new_vec = extractlanes(&arg(0)?, ctrl_ty.lane_type())? .collect::<ValueResult<Vec<_>>>()?,
.into_iter() _ => unreachable!(),
.take(new_type.lane_count() as usize) };
.map(|lane| lane.convert(ValueConversionKind::ZeroExtend(new_type.lane_type())))
.collect::<ValueResult<Vec<_>>>()?;
assign(vectorizelanes(&new_vec, new_type)?)
}
Opcode::UwidenHigh => {
let new_type = ctrl_ty.merge_lanes().unwrap();
let new_vec = extractlanes(&arg(0)?, ctrl_ty.lane_type())?
.into_iter()
.skip(new_type.lane_count() as usize)
.map(|lane| lane.convert(ValueConversionKind::ZeroExtend(new_type.lane_type())))
.collect::<ValueResult<Vec<_>>>()?;
assign(vectorizelanes(&new_vec, new_type)?) assign(vectorizelanes(&new_vec, new_type)?)
} }
Opcode::FcvtToUint => unimplemented!("FcvtToUint"), Opcode::FcvtToUint => unimplemented!("FcvtToUint"),