@@ -1077,14 +1077,17 @@ static pseudo_t linearize_load_gen(struct entrypoint *ep, struct access_data *ad
{
struct symbol *ctype = ad->result_type;
pseudo_t new = add_load(ep, ad);
+ unsigned int off = ctype->bit_offset;
+ unsigned int siz = ctype->bit_size;
- if (ctype->bit_offset) {
- pseudo_t shift = value_pseudo(ctype->bit_offset);
- pseudo_t newval = add_binary_op(ep, ad->source_type, OP_LSR, new, shift);
- new = newval;
+ if (siz != type_size(ad->source_type)) {
+ pseudo_t mask = value_pseudo(((1ULL << siz) - 1) << off);
+ new = add_binary_op(ep, ad->source_type, OP_AND, new, mask);
+ }
+ if (off) {
+ pseudo_t shift = value_pseudo(off);
+ new = add_binary_op(ep, ad->source_type, OP_LSR, new, shift);
}
- if (ctype->bit_size != type_size(ad->source_type))
- new = cast_pseudo(ep, new, ad->source_type, ad->result_type);
return new;
}
@@ -35,7 +35,9 @@ unsigned int get_pbfi_b(struct bfi *bf) { return bf->b; }
* check-command: test-linearize -Wno-decl $file
* check-output-ignore
*
- * check-output-pattern-24-times: cast\\.
- * check-output-pattern-12-times: cast\\.4
+ * check-output-excludes: cast\\.4
+ * check-output-pattern-6-times: cast\\.
* check-output-pattern-6-times: lsr\\..*\\$6
+ * check-output-pattern-6-times: and\\..*\\$15
+ * check-output-pattern-6-times: and\\..*\\$960
*/
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- linearize.c | 15 +++++++++------ validation/bitfield-size.c | 6 ++++-- 2 files changed, 13 insertions(+), 8 deletions(-)