1 /* 2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. 3 * 4 * This file is part of libFirm. 5 * 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. 10 * 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. 14 * 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 17 * PURPOSE. 18 */ 19 20 /** 21 * @file 22 * @brief declarations for ARM node attributes 23 * @author Oliver Richter, Tobias Gneist, Michael Beck 24 */ 25 #ifndef FIRM_BE_ARM_ARM_NODES_ATTR_H 26 #define FIRM_BE_ARM_ARM_NODES_ATTR_H 27 28 #include "firm_types.h" 29 #include "irnode_t.h" 30 #include "bearch.h" 31 32 /** 33 * Possible ARM "shifter operand" addressing mode types. 34 */ 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; 49 50 /** Encoding for fpa immediates */ 51 enum fpa_immediates { 52 fpa_null = 0, 53 fpa_one, 54 fpa_two, 55 fpa_three, 56 fpa_four, 57 fpa_five, 58 fpa_ten, 59 fpa_half, 60 fpa_max 61 }; 62 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 */ 67 } arm_attr_t; 68 69 /** 70 * This struct holds information needed to produce the arm 71 * "data processing operands" also called "shifter operand" addressing modes 72 */ 73 typedef struct arm_shifter_operand_t { 74 arm_attr_t base; 75 arm_shift_modifier_t shift_modifier; 76 unsigned char immediate_value; 77 unsigned char shift_immediate; 78 } arm_shifter_operand_t; 79 80 typedef struct arm_cmp_attr_t { 81 arm_shifter_operand_t base; 82 bool ins_permuted : 1; 83 bool is_unsigned : 1; 84 } arm_cmp_attr_t; 85 86 /** 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 { 91 arm_attr_t base; 92 ir_mode *load_store_mode; 93 ir_entity *entity; 94 long offset; 95 bool is_frame_entity : 1; 96 bool entity_sign : 1; 97 } arm_load_store_attr_t; 98 99 /** Attributes for a SymConst */ 100 typedef struct arm_SymConst_attr_t { 101 arm_attr_t base; 102 ir_entity *entity; 103 int fp_offset; 104 } arm_SymConst_attr_t; 105 106 /** Attributes for a CondJmp */ 107 typedef struct arm_CondJmp_attr_t { 108 arm_attr_t base; 109 ir_relation relation; 110 } arm_CondJmp_attr_t; 111 112 /** Attributes for a SwitchJmp */ 113 typedef struct arm_SwitchJmp_attr_t { 114 arm_attr_t base; 115 const ir_switch_table *table; 116 } arm_SwitchJmp_attr_t; 117 118 /** CopyB attributes */ 119 typedef struct arm_CopyB_attr_t { 120 arm_attr_t base; 121 unsigned size; 122 } arm_CopyB_attr_t; 123 124 /** Attributes for a fConst */ 125 typedef struct arm_fConst_attr_t { 126 arm_attr_t base; 127 ir_tarval *tv; /**< the tarval representing the FP const */ 128 } arm_fConst_attr_t; 129 130 /** attributes for floatingpoint arithmetic operations */ 131 typedef struct arm_farith_attr_t { 132 arm_attr_t base; 133 ir_mode *mode; /* operation mode */ 134 } arm_farith_attr_t; 135 136 #define CAST_ARM_ATTR(type,ptr) ((type *)(ptr)) 137 #define CONST_CAST_ARM_ATTR(type,ptr) ((const type *)(ptr)) 138 139 #endif 140