ependency weakness. */ /* Dependence can be overcome with generation of new data speculative instruction. */ #define BEGIN_DATA (((ds_t) DEP_WEAK_MASK) << BEGIN_DATA_BITS_OFFSET) /* This dependence is to the instruction in the recovery block, that was formed to recover after data-speculation failure. Thus, this dependence can overcome with generating of the copy of this instruction in the recovery block. */ #define BE_IN_DATA (((ds_t) DEP_WEAK_MASK) << BE_IN_DATA_BITS_OFFSET) /* Dependence can be overcome with generation of new control speculative instruction. */ #define BEGIN_CONTROL (((ds_t) DEP_WEAK_MASK) << BEGIN_CONTROL_BITS_OFFSET) /* This dependence is to the instruction in the recovery block, that was formed to recover after control-speculation failure. Thus, this dependence can be overcome with generating of the copy of this instruction in the recovery block. */ #define BE_IN_CONTROL (((ds_t) DEP_WEAK_MASK) << BE_IN_CONTROL_BITS_OFFSET) /* A few convenient combinations. */ #define BEGIN_SPEC (BEGIN_DATA | BEGIN_CONTROL) #define DATA_SPEC (BEGIN_DATA | BE_IN_DATA) #define CONTROL_SPEC (BEGIN_CONTROL | BE_IN_CONTROL) #define SPECULATIVE (DATA_SPEC | CONTROL_SPEC) #define BE_IN_SPEC (BE_IN_DATA | BE_IN_CONTROL) /* Constants, that are helpful in iterating through dep_status. */ #define FIRST_SPEC_TYPE BEGIN_DATA #define LAST_SPEC_TYPE BE_IN_CONTROL #define SPEC_TYPE_SHIFT BITS_PER_DEP_WEAK /* Dependence on instruction can be of multiple types (e.g. true and output). This fields enhance REG_NOTE_KIND information of the dependence. */ #define DEP_TRUE (((ds_t) 1) << (BE_IN_CONTROL_BITS_OFFSET + BITS_PER_DEP_WEAK)) #define DEP_OUTPUT (DEP_TRUE << 1) #define DEP_ANTI (DEP_OUTPUT << 1) #define DEP_CONTROL (DEP_ANTI << 1) #define DEP_TYPES (DEP_TRUE | DEP_OUTPUT | DEP_ANTI | DEP_CONTROL) /* Instruction has non-speculative dependence. This bit represents the property of an instruction - not the one of a dependence. Therefore, it can appear only in the TODO_SPEC field of an instruction. */ #define HARD_DEP (DEP_CONTROL << 1) /* Like HARD_DEP, but dependencies can perhaps be broken by modifying the instructions. This is used for example to change: rn++ => rm=[rn + 4] rm=[rn] rn++ For instructions that have this bit set, one of the dependencies of the instructions will have a non-NULL REPLACE field in its DEP_T. Just like HARD_DEP, this bit is only ever set in TODO_SPEC. */ #define DEP_POSTPONED (HARD_DEP << 1) /* Set if a dependency is cancelled via speculation. */ #define DEP_CANCELLED (DEP_POSTPONED << 1)