+ /* kill upper bits */
+ ir_entity *entity = expression->compound_entry->v.entity;
+ int bitoffset = get_entity_offset_bits_remainder(entity);
+ ir_type *entity_type = get_entity_type(entity);
+ int bitsize = get_mode_size_bits(get_type_mode(entity_type));
+ long shift_bitsl = machine_size - bitoffset - bitsize;
+ assert(shift_bitsl >= 0);
+ tarval *tvl = new_tarval_from_long(shift_bitsl, mode_uint);
+ ir_node *countl = new_d_Const(dbgi, mode_uint, tvl);
+ ir_node *shiftl = new_d_Shl(dbgi, load_res, countl, mode_int);
+
+ long shift_bitsr = bitoffset + shift_bitsl;
+ assert(shift_bitsr <= (long) machine_size);
+ tarval *tvr = new_tarval_from_long(shift_bitsr, mode_uint);
+ ir_node *countr = new_d_Const(dbgi, mode_uint, tvr);
+ ir_node *shiftr;
+ if (mode_is_signed(mode)) {
+ shiftr = new_d_Shrs(dbgi, shiftl, countr, mode_int);
+ } else {
+ shiftr = new_d_Shr(dbgi, shiftl, countr, mode_int);
+ }
+
+ return create_conv(dbgi, shiftr, mode);
+}
+
+static void set_value_for_expression_addr(const expression_t *expression,
+ ir_node *value, ir_node *addr)
+{
+ dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
+ value = do_strict_conv(dbgi, value);
+
+ if (expression->kind == EXPR_REFERENCE) {
+ const reference_expression_t *ref = &expression->reference;
+
+ declaration_t *declaration = ref->declaration;
+ assert(declaration->declaration_kind != DECLARATION_KIND_UNKNOWN);
+ if (declaration->declaration_kind == DECLARATION_KIND_LOCAL_VARIABLE) {
+ set_value(declaration->v.value_number, value);
+ return;
+ }
+ }
+
+ if (addr == NULL)
+ addr = expression_to_addr(expression);
+
+ type_t *type = skip_typeref(expression->base.type);
+
+ if (expression->kind == EXPR_SELECT) {
+ const select_expression_t *select = &expression->select;
+
+ declaration_t *declaration = select->compound_entry;
+ if (declaration->type->kind == TYPE_BITFIELD) {
+ bitfield_store_to_firm(select, addr, value);
+ return;
+ }
+ }