Lines Matching defs:instr
30 u16 br_get_offset(u64 instr)
34 addr_lo = FIELD_GET(OP_BR_ADDR_LO, instr);
35 addr_hi = FIELD_GET(OP_BR_ADDR_HI, instr);
41 void br_set_offset(u64 *instr, u16 offset)
47 *instr &= ~(OP_BR_ADDR_HI | OP_BR_ADDR_LO);
48 *instr |= FIELD_PREP(OP_BR_ADDR_HI, addr_hi);
49 *instr |= FIELD_PREP(OP_BR_ADDR_LO, addr_lo);
52 void br_add_offset(u64 *instr, u16 offset)
56 addr = br_get_offset(*instr);
57 br_set_offset(instr, addr + offset);
60 static bool immed_can_modify(u64 instr)
62 if (FIELD_GET(OP_IMMED_INV, instr) ||
63 FIELD_GET(OP_IMMED_SHIFT, instr) ||
64 FIELD_GET(OP_IMMED_WIDTH, instr) != IMMED_WIDTH_ALL) {
71 u16 immed_get_value(u64 instr)
75 if (!immed_can_modify(instr))
78 reg = FIELD_GET(OP_IMMED_A_SRC, instr);
80 reg = FIELD_GET(OP_IMMED_B_SRC, instr);
82 return (reg & 0xff) | FIELD_GET(OP_IMMED_IMM, instr) << 8;
85 void immed_set_value(u64 *instr, u16 immed)
87 if (!immed_can_modify(*instr))
90 if (unreg_is_imm(FIELD_GET(OP_IMMED_A_SRC, *instr))) {
91 *instr &= ~FIELD_PREP(OP_IMMED_A_SRC, 0xff);
92 *instr |= FIELD_PREP(OP_IMMED_A_SRC, immed & 0xff);
94 *instr &= ~FIELD_PREP(OP_IMMED_B_SRC, 0xff);
95 *instr |= FIELD_PREP(OP_IMMED_B_SRC, immed & 0xff);
98 *instr &= ~OP_IMMED_IMM;
99 *instr |= FIELD_PREP(OP_IMMED_IMM, immed >> 8);
102 void immed_add_value(u64 *instr, u16 offset)
106 if (!immed_can_modify(*instr))
109 val = immed_get_value(*instr);
110 immed_set_value(instr, val + offset);