2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief declarations for ARM node attributes
23 * @author Oliver Richter, Tobias Gneist, Michael Beck
25 #ifndef FIRM_BE_ARM_ARM_NODES_ATTR_H
26 #define FIRM_BE_ARM_ARM_NODES_ATTR_H
28 #include "firm_types.h"
33 * Possible ARM "shifter operand" addressing mode types.
35 typedef enum arm_shift_modifier_t {
36 ARM_SHF_INVALID, /**< invalid shift */
37 ARM_SHF_REG, /**< simple register operand */
38 ARM_SHF_IMM, /**< immediate operand with implicit ROR */
39 ARM_SHF_ASR_IMM, /**< arithmetic shift right */
40 ARM_SHF_ASR_REG, /**< arithmetic shift right */
41 ARM_SHF_LSL_IMM, /**< logical shift left */
42 ARM_SHF_LSL_REG, /**< logical shift left */
43 ARM_SHF_LSR_IMM, /**< logical shift right */
44 ARM_SHF_LSR_REG, /**< logical shift right */
45 ARM_SHF_ROR_IMM, /**< rotate right */
46 ARM_SHF_ROR_REG, /**< rotate right */
47 ARM_SHF_RRX, /**< rotate right through carry bits */
48 } arm_shift_modifier_t;
50 /** Encoding for fpa immediates */
63 /** Generic ARM node attributes. */
64 typedef struct arm_attr_t {
65 except_attr exc; /**< the exception attribute. MUST be the first one. */
66 bool is_load_store : 1; /**< if set, this is a load or store instruction */
70 * This struct holds information needed to produce the arm
71 * "data processing operands" also called "shifter operand" addressing modes
73 typedef struct arm_shifter_operand_t {
75 arm_shift_modifier_t shift_modifier;
76 unsigned char immediate_value;
77 unsigned char shift_immediate;
78 } arm_shifter_operand_t;
80 typedef struct arm_cmp_attr_t {
81 arm_shifter_operand_t base;
82 bool ins_permuted : 1;
87 * this struct holds information needed to produce the arm addressing modes
88 * for "Load and Store Word or Unsigned Byte", "Miscellaneous Loads and Stores"
89 * and "Load and Store Multiple" */
90 typedef struct arm_load_store_attr_t {
92 ir_mode *load_store_mode;
95 bool is_frame_entity : 1;
97 } arm_load_store_attr_t;
99 /** Attributes for a SymConst */
100 typedef struct arm_SymConst_attr_t {
104 } arm_SymConst_attr_t;
106 /** Attributes for a CondJmp */
107 typedef struct arm_CondJmp_attr_t {
109 ir_relation relation;
110 } arm_CondJmp_attr_t;
112 /** Attributes for a SwitchJmp */
113 typedef struct arm_SwitchJmp_attr_t {
115 const ir_switch_table *table;
116 } arm_SwitchJmp_attr_t;
118 /** CopyB attributes */
119 typedef struct arm_CopyB_attr_t {
124 /** Attributes for a fConst */
125 typedef struct arm_fConst_attr_t {
127 ir_tarval *tv; /**< the tarval representing the FP const */
130 /** attributes for floatingpoint arithmetic operations */
131 typedef struct arm_farith_attr_t {
133 ir_mode *mode; /* operation mode */
136 #define CAST_ARM_ATTR(type,ptr) ((type *)(ptr))
137 #define CONST_CAST_ARM_ATTR(type,ptr) ((const type *)(ptr))