- ir_node *addr)
-{
- dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
- type_t *type = expression->base.type;
- ir_mode *mode = get_ir_mode_storage(type);
- ir_node *mem = get_store();
- ir_node *load = new_d_Load(dbgi, mem, addr, mode, cons_none);
- ir_node *load_mem = new_d_Proj(dbgi, load, mode_M, pn_Load_M);
- ir_node *load_res = new_d_Proj(dbgi, load, mode, pn_Load_res);
-
- load_res = create_conv(dbgi, load_res, mode_int);
+ ir_node *addr)
+{
+ dbg_info *dbgi = get_dbg_info(&expression->base.source_position);
+ entity_t *entity = expression->compound_entry;
+ type_t *base_type = entity->declaration.type;
+ ir_mode *mode = get_ir_mode_storage(base_type);
+ ir_node *mem = get_store();
+ ir_node *load = new_d_Load(dbgi, mem, addr, mode, cons_none);
+ ir_node *load_mem = new_d_Proj(dbgi, load, mode_M, pn_Load_M);
+ ir_node *load_res = new_d_Proj(dbgi, load, mode, pn_Load_res);
+
+ ir_mode *amode = mode;
+ /* optimisation, since shifting in modes < machine_size is usually
+ * less efficient */
+ if (get_mode_size_bits(amode) < get_mode_size_bits(mode_uint)) {
+ amode = mode_uint;
+ }
+ unsigned amode_size = get_mode_size_bits(amode);
+ load_res = create_conv(dbgi, load_res, amode);