diff --git a/src/cst/expression.rs b/src/cst/expression.rs index fe9fbe8..a45bb89 100644 --- a/src/cst/expression.rs +++ b/src/cst/expression.rs @@ -100,35 +100,36 @@ impl Expression { fn gen_reference_value(json: &JsonValue, context: &mut ModuleContext) -> Option { let (symbol, range) = Self::gen_reference_call(json, context); - if range.is_some() { - warn!("FIXME: bitfield access at CST node '{}'", json); - } if context.unit_ctx.data.is_some() { let unit_ctx = &mut context.unit_ctx; let raw_name_to_value = &mut unit_ctx.raw_name_to_value; let raw_name_to_shadow = &unit_ctx.raw_name_to_shadow; - if raw_name_to_value.contains_key(&symbol) { - let value = raw_name_to_value[&symbol]; + let mut builder = UnitContext::builder(&mut unit_ctx.data); + let bb_head = *unit_ctx.bb_head.last().unwrap(); + builder.append_to(bb_head); + + let value = if raw_name_to_value.contains_key(&symbol) { + let symbol_value = raw_name_to_value[&symbol]; let shadow = raw_name_to_shadow.get(&symbol).cloned(); - let mut builder = UnitContext::builder(&mut unit_ctx.data); - let bb_head = *unit_ctx.bb_head.last().unwrap(); - builder.append_to(bb_head); - - Some(match shadow { - None => builder.ins().prb(value), + match shadow { + None => builder.ins().prb(symbol_value), Some(s) => builder.ins().ld(s), - }) + } } else if context.param.contains_key(&symbol) { - let mut builder = UnitContext::builder(&mut unit_ctx.data); - let bb_head = *unit_ctx.bb_head.last().unwrap(); - builder.append_to(bb_head); - - Some(builder.ins().const_int(context.param[&symbol].clone())) + builder.ins().const_int(context.param[&symbol].clone()) } else { panic!("unknown error at CST node {}", json); + }; + + if range.is_some() { + let base = range.unwrap().1; + let width = range.unwrap().0 - range.unwrap().1 + 1; + Some(builder.ins().ext_slice(value, base, width)) + } else { + Some(value) } } else { None