fixed 8bit Store bugs
authorChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 17 Mar 2006 17:00:59 +0000 (17:00 +0000)
committerChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 17 Mar 2006 17:00:59 +0000 (17:00 +0000)
ir/be/ia32/ia32_optimize.c
ir/be/ia32/ia32_transform.c

index b03599f..e897c0f 100644 (file)
@@ -692,7 +692,7 @@ void ia32_optimize_am(ir_node *irn, void *env) {
 
        if ((res == irn) && (get_ia32_am_support(irn) != ia32_am_None) && !is_ia32_Lea(irn)) {
                /* 1st: check for Load/Store -> LEA   */
-               if (is_ia32_Ld(irn) || is_ia32_St(irn)) {
+               if (is_ia32_Ld(irn) || is_ia32_St(irn) || is_ia32_Store8Bit(irn)) {
                        left = get_irn_n(irn, 0);
 
                        if (is_ia32_Lea(left)) {
@@ -703,7 +703,7 @@ void ia32_optimize_am(ir_node *irn, void *env) {
                                set_ia32_am_scale(irn, get_ia32_am_scale(left));
                                set_ia32_am_flavour(irn, get_ia32_am_flavour(left));
 
-                               set_ia32_op_type(irn, is_ia32_St(irn) ? ia32_AddrModeD : ia32_AddrModeS);
+                               set_ia32_op_type(irn, is_ia32_Ld(irn) ? ia32_AddrModeS : ia32_AddrModeD);
 
                                /* set base and index */
                                set_irn_n(irn, 0, get_irn_n(left, 0));
index f3fea44..c843f42 100644 (file)
@@ -1238,6 +1238,7 @@ static ir_node *gen_Store(ia32_transform_env_t *env) {
        ir_node *val   = get_Store_value(node);
        ir_node *ptr   = get_Store_ptr(node);
        ir_node *mem   = get_Store_mem(node);
+       ir_node *mode  = get_irn_mode(val);
        ir_node *sval  = val;
        ir_node *new_op;
 
@@ -1246,14 +1247,14 @@ static ir_node *gen_Store(ia32_transform_env_t *env) {
                sval = noreg;
        }
 
-       if (mode_is_float(env->mode)) {
-               new_op = new_rd_ia32_fStore(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, env->mode);
+       if (mode_is_float(mode)) {
+               new_op = new_rd_ia32_fStore(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, mode_T);
        }
-       else if (get_mode_size_bits(env->mode) == 8) {
-               new_op = new_rd_ia32_Store8Bit(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, env->mode);
+       else if (get_mode_size_bits(mode) == 8) {
+               new_op = new_rd_ia32_Store8Bit(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, mode_T);
        }
        else {
-               new_op = new_rd_ia32_Store(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, env->mode);
+               new_op = new_rd_ia32_Store(env->dbg, env->irg, env->block, ptr, noreg, sval, mem, mode_T);
        }
 
        /* stored const is an attribute (saves a register) */