Lines Matching refs:instr
19 int patch_instruction(unsigned int *addr, unsigned int instr) in patch_instruction() argument
23 __put_user_size(instr, addr, 4, err); in patch_instruction()
75 static unsigned int branch_opcode(unsigned int instr) in branch_opcode() argument
77 return (instr >> 26) & 0x3F; in branch_opcode()
80 static int instr_is_branch_iform(unsigned int instr) in instr_is_branch_iform() argument
82 return branch_opcode(instr) == 18; in instr_is_branch_iform()
85 static int instr_is_branch_bform(unsigned int instr) in instr_is_branch_bform() argument
87 return branch_opcode(instr) == 16; in instr_is_branch_bform()
90 int instr_is_relative_branch(unsigned int instr) in instr_is_relative_branch() argument
92 if (instr & BRANCH_ABSOLUTE) in instr_is_relative_branch()
95 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr); in instr_is_relative_branch()
98 static unsigned long branch_iform_target(const unsigned int *instr) in branch_iform_target() argument
102 imm = *instr & 0x3FFFFFC; in branch_iform_target()
108 if ((*instr & BRANCH_ABSOLUTE) == 0) in branch_iform_target()
109 imm += (unsigned long)instr; in branch_iform_target()
114 static unsigned long branch_bform_target(const unsigned int *instr) in branch_bform_target() argument
118 imm = *instr & 0xFFFC; in branch_bform_target()
124 if ((*instr & BRANCH_ABSOLUTE) == 0) in branch_bform_target()
125 imm += (unsigned long)instr; in branch_bform_target()
130 unsigned long branch_target(const unsigned int *instr) in branch_target() argument
132 if (instr_is_branch_iform(*instr)) in branch_target()
133 return branch_iform_target(instr); in branch_target()
134 else if (instr_is_branch_bform(*instr)) in branch_target()
135 return branch_bform_target(instr); in branch_target()
140 int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr) in instr_is_branch_to_addr() argument
142 if (instr_is_branch_iform(*instr) || instr_is_branch_bform(*instr)) in instr_is_branch_to_addr()
143 return branch_target(instr) == addr; in instr_is_branch_to_addr()
190 unsigned int instr; in test_branch_iform() local
193 addr = (unsigned long)&instr; in test_branch_iform()
214 instr = 0x48000103; in test_branch_iform()
215 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_iform()
217 instr = 0x480420ff; in test_branch_iform()
218 check(instr_is_branch_to_addr(&instr, 0x420fc)); in test_branch_iform()
220 instr = 0x49fffffc; in test_branch_iform()
221 check(instr_is_branch_to_addr(&instr, addr + 0x1FFFFFC)); in test_branch_iform()
223 instr = 0x4bfffffc; in test_branch_iform()
224 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_iform()
226 instr = 0x4a000000; in test_branch_iform()
227 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
230 instr = create_branch(&instr, addr, BRANCH_SET_LINK); in test_branch_iform()
231 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
234 instr = create_branch(&instr, addr - 0x100, BRANCH_SET_LINK); in test_branch_iform()
235 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_iform()
238 instr = create_branch(&instr, addr + 0x100, 0); in test_branch_iform()
239 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_iform()
242 instr = create_branch(&instr, addr - 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
243 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
246 instr = create_branch(&instr, addr - 0x2000004, BRANCH_SET_LINK); in test_branch_iform()
247 check(instr == 0); in test_branch_iform()
250 instr = create_branch(&instr, addr + 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
251 check(instr == 0); in test_branch_iform()
254 instr = create_branch(&instr, addr + 3, BRANCH_SET_LINK); in test_branch_iform()
255 check(instr == 0); in test_branch_iform()
258 instr = create_branch(&instr, addr, 0xFFFFFFFC); in test_branch_iform()
259 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
260 check(instr == 0x48000000); in test_branch_iform()
278 unsigned int *iptr, instr, flags; in test_branch_bform() local
280 iptr = &instr; in test_branch_bform()
293 instr = 0x43ff0103; in test_branch_bform()
294 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_bform()
296 instr = 0x43ff20ff; in test_branch_bform()
297 check(instr_is_branch_to_addr(&instr, 0x20fc)); in test_branch_bform()
299 instr = 0x43ff7ffc; in test_branch_bform()
300 check(instr_is_branch_to_addr(&instr, addr + 0x7FFC)); in test_branch_bform()
302 instr = 0x43fffffc; in test_branch_bform()
303 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_bform()
305 instr = 0x43ff8000; in test_branch_bform()
306 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
312 instr = create_cond_branch(iptr, addr, flags); in test_branch_bform()
313 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
316 instr = create_cond_branch(iptr, addr - 0x100, flags); in test_branch_bform()
317 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_bform()
320 instr = create_cond_branch(iptr, addr + 0x100, flags); in test_branch_bform()
321 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_bform()
324 instr = create_cond_branch(iptr, addr - 0x8000, flags); in test_branch_bform()
325 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
328 instr = create_cond_branch(iptr, addr - 0x8004, flags); in test_branch_bform()
329 check(instr == 0); in test_branch_bform()
332 instr = create_cond_branch(iptr, addr + 0x8000, flags); in test_branch_bform()
333 check(instr == 0); in test_branch_bform()
336 instr = create_cond_branch(iptr, addr + 3, flags); in test_branch_bform()
337 check(instr == 0); in test_branch_bform()
340 instr = create_cond_branch(iptr, addr, 0xFFFFFFFC); in test_branch_bform()
341 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
342 check(instr == 0x43FF0000); in test_branch_bform()