arch_register_class_put() is only used locally
[libfirm] / ir / be / arm / arm_transform.c
index 72f1998..aa376a9 100644 (file)
@@ -224,11 +224,11 @@ static ir_node *gen_Conv(ir_node *node) {
                        }
                }
                else if (USE_VFP(env_cg->isa)) {
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                        return NULL;
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                        return NULL;
                }
        }
@@ -264,7 +264,7 @@ static ir_node *gen_Conv(ir_node *node) {
                                return gen_zero_extension(dbg, block, new_op, min_bits);
                        }
                } else {
-                       panic("Cannot handle Conv %+F->%+F with %d->%d bits\n", src_mode, dst_mode,
+                       panic("Cannot handle Conv %+F->%+F with %d->%d bits", src_mode, dst_mode,
                                src_bits, dst_bits);
                        return NULL;
                }
@@ -317,11 +317,11 @@ static ir_node *gen_Add(ir_node *node) {
                        return new_rd_arm_fpaAdf(dbg, irg, block, new_op1, new_op2, mode);
                } else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                        return NULL;
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                        return NULL;
                }
        } else {
@@ -393,11 +393,11 @@ static ir_node *gen_Mul(ir_node *node) {
                }
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                        return NULL;
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                        return NULL;
                }
        }
@@ -432,10 +432,10 @@ static ir_node *gen_Quot(ir_node *node) {
                return new_rd_arm_fpaDvf(dbg, current_ir_graph, block, new_op1, new_op2, mode);
        } else if (USE_VFP(env_cg->isa)) {
                assert(mode != mode_E && "IEEE Extended FP not supported");
-               panic("VFP not supported yet\n");
+               panic("VFP not supported yet");
        }
        else {
-               panic("Softfloat not supported yet\n");
+               panic("Softfloat not supported yet");
                return NULL;
        }
 }
@@ -526,11 +526,11 @@ static ir_node *gen_Sub(ir_node *node) {
                        return new_rd_arm_fpaSuf(dbg, irg, block, new_op1, new_op2, mode);
                } else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                        return NULL;
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                        return NULL;
                }
        }
@@ -650,7 +650,9 @@ static ir_node *gen_Rol(ir_node *node, ir_node *op1, ir_node *op2) {
        ir_node  *new_op1 = be_transform_node(op1);
        ir_mode  *mode    = mode_Iu;
        dbg_info *dbg     = get_irn_dbg_info(node);
-       ir_node  *new_op2 = new_rd_arm_Rsb_i(dbg, current_ir_graph, block, op2, mode, 32);
+       ir_node  *new_op2 = be_transform_node(op2);
+
+       new_op2 = new_rd_arm_Rsb_i(dbg, current_ir_graph, block, new_op2, mode, 32);
        return new_rd_arm_Ror(dbg, current_ir_graph, block, new_op1, new_op2, mode);
 }
 
@@ -669,20 +671,46 @@ static ir_node *gen_Rotl(ir_node *node) {
           that means we can create a RotR. */
 
        if (is_Add(op2)) {
-               ir_node *add = op2;
-               ir_node *left = get_Add_left(add);
-               ir_node *right = get_Add_right(add);
+               ir_node *right = get_Add_right(op2);
                if (is_Const(right)) {
                        tarval  *tv   = get_Const_tarval(right);
                        ir_mode *mode = get_irn_mode(node);
                        long     bits = get_mode_size_bits(mode);
+                       ir_node *left = get_Add_left(op2);
 
                        if (is_Minus(left) &&
-                           tarval_is_long(tv)       &&
+                           tarval_is_long(tv)          &&
                            get_tarval_long(tv) == bits &&
                            bits                == 32)
                                rotate = gen_Ror(node, op1, get_Minus_op(left));
                }
+       } else if (is_Sub(op2)) {
+               ir_node *left = get_Sub_left(op2);
+               if (is_Const(left)) {
+                       tarval  *tv   = get_Const_tarval(left);
+                       ir_mode *mode = get_irn_mode(node);
+                       long     bits = get_mode_size_bits(mode);
+                       ir_node *right = get_Sub_right(op2);
+
+                       if (tarval_is_long(tv)          &&
+                           get_tarval_long(tv) == bits &&
+                           bits                == 32)
+                               rotate = gen_Ror(node, op1, right);
+               }
+       } else if (is_Const(op2)) {
+                       tarval  *tv   = get_Const_tarval(op2);
+                       ir_mode *mode = get_irn_mode(node);
+                       long     bits = get_mode_size_bits(mode);
+
+                       if (tarval_is_long(tv) && bits == 32) {
+                               ir_node  *block   = be_transform_node(get_nodes_block(node));
+                               ir_node  *new_op1 = be_transform_node(op1);
+                               ir_mode  *mode    = mode_Iu;
+                               dbg_info *dbg     = get_irn_dbg_info(node);
+
+                               bits = (bits - get_tarval_long(tv)) & 31;
+                               rotate = new_rd_arm_Mov(dbg, current_ir_graph, block, new_op1, mode, ARM_SHF_ROR, bits);
+                       }
        }
 
        if (rotate == NULL) {
@@ -731,10 +759,10 @@ static ir_node *gen_Abs(ir_node *node) {
                        return new_rd_arm_fpaAbs(dbg, current_ir_graph, block, new_op, mode);
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                }
        }
        assert(mode_is_data(mode));
@@ -760,10 +788,10 @@ static ir_node *gen_Minus(ir_node *node) {
                        return new_rd_arm_fpaMvf(dbg, current_ir_graph, block, op, mode);
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                }
        }
        assert(mode_is_data(mode));
@@ -793,10 +821,10 @@ static ir_node *gen_Load(ir_node *node) {
                        new_load = new_rd_arm_fpaLdf(dbg, irg, block, new_ptr, new_mem, mode);
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                }
        }
        else {
@@ -815,7 +843,7 @@ static ir_node *gen_Load(ir_node *node) {
                                new_load = new_rd_arm_Load(dbg, irg, block, new_ptr, new_mem);
                                break;
                        default:
-                               panic("mode size not supported\n");
+                               panic("mode size not supported");
                        }
                } else {
                        /* zero extended loads */
@@ -830,7 +858,7 @@ static ir_node *gen_Load(ir_node *node) {
                                new_load = new_rd_arm_Load(dbg, irg, block, new_ptr, new_mem);
                                break;
                        default:
-                               panic("mode size not supported\n");
+                               panic("mode size not supported");
                        }
                }
        }
@@ -870,9 +898,9 @@ static ir_node *gen_Store(ir_node *node) {
                        new_store = new_rd_arm_fpaStf(dbg, irg, block, new_ptr, new_val, new_mem, mode);
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                } else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                }
        } else {
                assert(mode_is_data(mode) && "unsupported mode for Store");
@@ -907,9 +935,9 @@ static ir_node *gen_Cond(ir_node *node) {
                ir_node *op1      = get_Cmp_left(cmp_node);
                ir_node *new_op1  = be_transform_node(op1);
                ir_node *op2      = get_Cmp_right(cmp_node);
-               ir_node *new_op2  = be_transform_node(op2);
 
                if (mode_is_float(get_irn_mode(op1))) {
+                       ir_node *new_op2  = be_transform_node(op2);
                        /* floating point compare */
                        pn_Cmp pnc = get_Proj_proj(selector);
 
@@ -919,8 +947,12 @@ static ir_node *gen_Cond(ir_node *node) {
                        }
                        /* Hmm: use need cmfe */
                        return new_rd_arm_fpaCmfeBra(dbg, irg, block, new_op1, new_op2, pnc);
+               } else if (is_Const(op2) && tarval_is_null(get_Const_tarval(op2))) {
+                       /* compare with 0 */
+                       return new_rd_arm_TstBra(dbg, irg, block, new_op1, new_op1, get_Proj_proj(selector));
                } else {
                        /* integer compare */
+                       ir_node *new_op2  = be_transform_node(op2);
                        return new_rd_arm_CmpBra(dbg, irg, block, new_op1, new_op2, get_Proj_proj(selector));
                }
        } else {
@@ -1051,10 +1083,10 @@ static ir_node *gen_Const(ir_node *node) {
                }
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
-                       panic("VFP not supported yet\n");
+                       panic("VFP not supported yet");
                }
                else {
-                       panic("Softfloat not supported yet\n");
+                       panic("Softfloat not supported yet");
                }
        }
        return create_const_graph(node, block);
@@ -1418,7 +1450,7 @@ static ir_node *gen_Proj_be_SubSP(ir_node *node) {
  */
 static ir_node *gen_Proj_Cmp(ir_node *node) {
        (void) node;
-       panic("Psi NYI\n");
+       panic("Mux NYI");
 }
 
 
@@ -1587,7 +1619,7 @@ static ir_node *gen_Phi(ir_node *node) {
  * the BAD transformer.
  */
 static ir_node *bad_transform(ir_node *irn) {
-       panic("ARM backend: Not implemented: %+F\n", irn);
+       panic("ARM backend: Not implemented: %+F", irn);
        return irn;
 }
 
@@ -1640,8 +1672,7 @@ static void arm_register_transformers(void) {
 
        BAD(ASM);       /* unsupported yet */
        GEN(CopyB);
-       BAD(Mux);
-       BAD(Psi);       /* unsupported yet */
+       BAD(Mux);       /* unsupported yet */
        GEN(Proj);
        GEN(Phi);