home *** CD-ROM | disk | FTP | other *** search
- #include "register.h"
- #include "symtab.h"
- #include "diblock.h"
- #include "instrn.h"
- #include "process.h"
-
- dinstrn *
- i_j(dipc, target)
- dinstrn *dipc;
- unsigned long target;
- {
- dipc = do_delayed_branch(dipc, (dipc->di_addr & 0xF0000000) | (target << 2));
-
- return dipc;
- }
-
- static
- dinstrn *
- c_jal(dipc)
- dinstrn *dipc;
- {
- P.p_state[R_RA] = (unsigned long)dipc->di_0;
- do_known_delayed_branch;
-
- return dipc;
- }
-
- static
- dinstrn *
- c_jal_up(dipc)
- dinstrn *dipc;
- {
- P.p_state[R_RA] = (unsigned long)dipc->di_0;
- do_known_delayed_upbranch;
-
- return dipc;
- }
-
- dinstrn *
- i_jal(dipc, target)
- dinstrn *dipc;
- unsigned long target;
- {
- unsigned long ra;
- unsigned long addr;
-
- ra = dipc->di_addr + 2 * sizeof(unsigned long);
- addr = (dipc->di_addr & 0xF0000000) | (target << 2);
-
- if (compile_ok)
- {
- dipc->di_handler = (addr > dipc->di_addr) ? c_jal : c_jal_up;
- dipc->di_0 = (unsigned long *)ra;
- (void)compile_known_delayed_branch(dipc, addr);
-
- return (*dipc->di_handler)(dipc);
- }
-
- /*
- * Save the link address in the link register.
- */
- procsput(R_RA, ra);
-
- dipc = do_delayed_branch(dipc, addr);
-
- return dipc;
- }
-
- dinstrn *
- i_jalr(dipc, rs, rt, rd, shamt, funct)
- dinstrn *dipc;
- int rs;
- int rt;
- int rd;
- int shamt;
- int funct;
- {
- unsigned long ra;
- unsigned long s;
-
- ra = dipc->di_addr + 2 * sizeof(unsigned long);
-
- procsget(rs, s);
-
- /*
- * Save the link address in the link register.
- */
- procsput(rd, ra);
-
- dipc = do_delayed_branch(dipc, s);
-
- return dipc;
- }
-
- static
- dinstrn *
- c_jr(dipc)
- dinstrn *dipc;
- {
- do_unknown_delayed_branch;
-
- return dipc;
- }
-
- dinstrn *
- i_jr(dipc, rs, rt, rd, shamt, funct)
- dinstrn *dipc;
- int rs;
- int rt;
- int rd;
- int shamt;
- int funct;
- {
- unsigned long s;
-
- if (compile_ok)
- {
- dipc->di_handler = c_jr;
- dipc->di_0 = &P.p_state[rs];
- (void)compile_unknown_delayed_branch(dipc);
-
- return (*dipc->di_handler)(dipc);
- }
-
- procsget(rs, s);
-
- dipc = do_delayed_branch(dipc, s);
-
- return dipc;
- }
-