Lines Matching refs:regs
11 static int get_reg(struct pt_regs *regs, int nr) in get_reg() argument
16 val = *(unsigned long *)(®s->r0 + nr); in get_reg()
18 val = *(unsigned long *)(®s->r4 + (nr - 4)); in get_reg()
20 val = *(unsigned long *)(®s->r7 + (nr - 7)); in get_reg()
22 val = *(unsigned long *)(®s->fp + (nr - 13)); in get_reg()
27 static void set_reg(struct pt_regs *regs, int nr, int val) in set_reg() argument
30 *(unsigned long *)(®s->r0 + nr) = val; in set_reg()
32 *(unsigned long *)(®s->r4 + (nr - 4)) = val; in set_reg()
34 *(unsigned long *)(®s->r7 + (nr - 7)) = val; in set_reg()
36 *(unsigned long *)(®s->fp + (nr - 13)) = val; in set_reg()
82 static int emu_addi(unsigned short insn, struct pt_regs *regs) in emu_addi() argument
88 val = get_reg(regs, dest); in emu_addi()
90 set_reg(regs, dest, val); in emu_addi()
95 static int emu_ldi(unsigned short insn, struct pt_regs *regs) in emu_ldi() argument
99 set_reg(regs, REG1(insn), (int)imm); in emu_ldi()
104 static int emu_add(unsigned short insn, struct pt_regs *regs) in emu_add() argument
110 val = get_reg(regs, dest); in emu_add()
111 val += get_reg(regs, src); in emu_add()
112 set_reg(regs, dest, val); in emu_add()
117 static int emu_addx(unsigned short insn, struct pt_regs *regs) in emu_addx() argument
122 val = regs->psw & PSW_BC ? 1 : 0; in emu_addx()
123 tmp = get_reg(regs, dest); in emu_addx()
125 val += (unsigned int)get_reg(regs, REG2(insn)); in emu_addx()
126 set_reg(regs, dest, val); in emu_addx()
130 regs->psw |= PSW_BC; in emu_addx()
132 regs->psw &= ~(PSW_BC); in emu_addx()
137 static int emu_and(unsigned short insn, struct pt_regs *regs) in emu_and() argument
142 val = get_reg(regs, dest); in emu_and()
143 val &= get_reg(regs, REG2(insn)); in emu_and()
144 set_reg(regs, dest, val); in emu_and()
149 static int emu_cmp(unsigned short insn, struct pt_regs *regs) in emu_cmp() argument
151 if (get_reg(regs, REG1(insn)) < get_reg(regs, REG2(insn))) in emu_cmp()
152 regs->psw |= PSW_BC; in emu_cmp()
154 regs->psw &= ~(PSW_BC); in emu_cmp()
159 static int emu_cmpeq(unsigned short insn, struct pt_regs *regs) in emu_cmpeq() argument
161 if (get_reg(regs, REG1(insn)) == get_reg(regs, REG2(insn))) in emu_cmpeq()
162 regs->psw |= PSW_BC; in emu_cmpeq()
164 regs->psw &= ~(PSW_BC); in emu_cmpeq()
169 static int emu_cmpu(unsigned short insn, struct pt_regs *regs) in emu_cmpu() argument
171 if ((unsigned int)get_reg(regs, REG1(insn)) in emu_cmpu()
172 < (unsigned int)get_reg(regs, REG2(insn))) in emu_cmpu()
173 regs->psw |= PSW_BC; in emu_cmpu()
175 regs->psw &= ~(PSW_BC); in emu_cmpu()
180 static int emu_cmpz(unsigned short insn, struct pt_regs *regs) in emu_cmpz() argument
182 if (!get_reg(regs, REG2(insn))) in emu_cmpz()
183 regs->psw |= PSW_BC; in emu_cmpz()
185 regs->psw &= ~(PSW_BC); in emu_cmpz()
190 static int emu_mv(unsigned short insn, struct pt_regs *regs) in emu_mv() argument
194 val = get_reg(regs, REG2(insn)); in emu_mv()
195 set_reg(regs, REG1(insn), val); in emu_mv()
200 static int emu_neg(unsigned short insn, struct pt_regs *regs) in emu_neg() argument
204 val = get_reg(regs, REG2(insn)); in emu_neg()
205 set_reg(regs, REG1(insn), 0 - val); in emu_neg()
210 static int emu_not(unsigned short insn, struct pt_regs *regs) in emu_not() argument
214 val = get_reg(regs, REG2(insn)); in emu_not()
215 set_reg(regs, REG1(insn), ~val); in emu_not()
220 static int emu_or(unsigned short insn, struct pt_regs *regs) in emu_or() argument
225 val = get_reg(regs, dest); in emu_or()
226 val |= get_reg(regs, REG2(insn)); in emu_or()
227 set_reg(regs, dest, val); in emu_or()
232 static int emu_sub(unsigned short insn, struct pt_regs *regs) in emu_sub() argument
237 val = get_reg(regs, dest); in emu_sub()
238 val -= get_reg(regs, REG2(insn)); in emu_sub()
239 set_reg(regs, dest, val); in emu_sub()
244 static int emu_subx(unsigned short insn, struct pt_regs *regs) in emu_subx() argument
249 val = tmp = get_reg(regs, dest); in emu_subx()
250 val -= (unsigned int)get_reg(regs, REG2(insn)); in emu_subx()
251 val -= regs->psw & PSW_BC ? 1 : 0; in emu_subx()
252 set_reg(regs, dest, val); in emu_subx()
256 regs->psw |= PSW_BC; in emu_subx()
258 regs->psw &= ~(PSW_BC); in emu_subx()
263 static int emu_xor(unsigned short insn, struct pt_regs *regs) in emu_xor() argument
268 val = (unsigned int)get_reg(regs, dest); in emu_xor()
269 val ^= (unsigned int)get_reg(regs, REG2(insn)); in emu_xor()
270 set_reg(regs, dest, val); in emu_xor()
275 static int emu_mul(unsigned short insn, struct pt_regs *regs) in emu_mul() argument
280 reg1 = get_reg(regs, dest); in emu_mul()
281 reg2 = get_reg(regs, REG2(insn)); in emu_mul()
288 set_reg(regs, dest, reg1); in emu_mul()
293 static int emu_mullo_a0(unsigned short insn, struct pt_regs *regs) in emu_mullo_a0() argument
297 reg1 = get_reg(regs, REG1(insn)); in emu_mullo_a0()
298 reg2 = get_reg(regs, REG2(insn)); in emu_mullo_a0()
307 regs->acc0h = reg1; in emu_mullo_a0()
308 regs->acc0l = reg2; in emu_mullo_a0()
313 static int emu_mullo_a1(unsigned short insn, struct pt_regs *regs) in emu_mullo_a1() argument
317 reg1 = get_reg(regs, REG1(insn)); in emu_mullo_a1()
318 reg2 = get_reg(regs, REG2(insn)); in emu_mullo_a1()
327 regs->acc1h = reg1; in emu_mullo_a1()
328 regs->acc1l = reg2; in emu_mullo_a1()
333 static int emu_mvfacmi_a0(unsigned short insn, struct pt_regs *regs) in emu_mvfacmi_a0() argument
337 val = (regs->acc0h << 16) | (regs->acc0l >> 16); in emu_mvfacmi_a0()
338 set_reg(regs, REG1(insn), (int)val); in emu_mvfacmi_a0()
343 static int emu_mvfacmi_a1(unsigned short insn, struct pt_regs *regs) in emu_mvfacmi_a1() argument
347 val = (regs->acc1h << 16) | (regs->acc1l >> 16); in emu_mvfacmi_a1()
348 set_reg(regs, REG1(insn), (int)val); in emu_mvfacmi_a1()
353 static int emu_m32r2(unsigned short insn, struct pt_regs *regs) in emu_m32r2() argument
362 res = emu_addi(insn, regs); in emu_m32r2()
365 res = emu_ldi(insn, regs); in emu_m32r2()
376 res = emu_add(insn, regs); in emu_m32r2()
379 res = emu_addx(insn, regs); in emu_m32r2()
382 res = emu_and(insn, regs); in emu_m32r2()
385 res = emu_cmp(insn, regs); in emu_m32r2()
388 res = emu_cmpeq(insn, regs); in emu_m32r2()
391 res = emu_cmpu(insn, regs); in emu_m32r2()
394 res = emu_cmpz(insn, regs); in emu_m32r2()
397 res = emu_mv(insn, regs); in emu_m32r2()
400 res = emu_neg(insn, regs); in emu_m32r2()
403 res = emu_not(insn, regs); in emu_m32r2()
406 res = emu_or(insn, regs); in emu_m32r2()
409 res = emu_sub(insn, regs); in emu_m32r2()
412 res = emu_subx(insn, regs); in emu_m32r2()
415 res = emu_xor(insn, regs); in emu_m32r2()
418 res = emu_mul(insn, regs); in emu_m32r2()
421 res = emu_mullo_a0(insn, regs); in emu_m32r2()
424 res = emu_mullo_a1(insn, regs); in emu_m32r2()
435 res = emu_mvfacmi_a0(insn, regs); in emu_m32r2()
438 res = emu_mvfacmi_a1(insn, regs); in emu_m32r2()
460 static int insn_check(unsigned long insn, struct pt_regs *regs, in insn_check() argument
472 regs->bpc += 4; in insn_check()
476 if (!(regs->bpc & 0x2) && insn & 0x8000) { in insn_check()
477 res = emu_m32r2((unsigned short)insn, regs); in insn_check()
478 regs->bpc += 4; in insn_check()
481 regs->bpc += 2; in insn_check()
487 static int emu_ld(unsigned long insn32, struct pt_regs *regs) in emu_ld() argument
496 ucp = (unsigned char *)get_reg(regs, src); in emu_ld()
498 if (insn_check(insn32, regs, &ucp)) in emu_ld()
512 set_reg(regs, REG1(insn16), val); in emu_ld()
516 set_reg(regs, src, (unsigned long)(ucp + 4)); in emu_ld()
521 static int emu_st(unsigned long insn32, struct pt_regs *regs) in emu_st() argument
531 ucp = (unsigned char *)get_reg(regs, src2); in emu_st()
533 if (insn_check(insn32, regs, &ucp)) in emu_st()
537 val = get_reg(regs, REG1(insn16)); in emu_st()
548 set_reg(regs, src2, (unsigned long)ucp); in emu_st()
557 set_reg(regs, src2, (unsigned long)ucp); in emu_st()
563 int handle_unaligned_access(unsigned long insn32, struct pt_regs *regs) in handle_unaligned_access() argument
575 if ((insn16 & 0x8000) && (regs->bpc & 3)) in handle_unaligned_access()
579 res = emu_ld(insn32, regs); in handle_unaligned_access()
581 res = emu_st(insn32, regs); in handle_unaligned_access()