home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume25 / trash / part01 / i_j.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-22  |  1.9 KB  |  131 lines

  1. #include    "register.h"
  2. #include    "symtab.h"
  3. #include    "diblock.h"
  4. #include    "instrn.h"
  5. #include    "process.h"
  6.  
  7. dinstrn    *
  8. i_j(dipc, target)
  9. dinstrn        *dipc;
  10. unsigned long    target;
  11. {
  12.     dipc = do_delayed_branch(dipc, (dipc->di_addr & 0xF0000000) | (target << 2));
  13.  
  14.     return dipc;
  15. }
  16.  
  17. static
  18. dinstrn    *
  19. c_jal(dipc)
  20. dinstrn    *dipc;
  21. {
  22.     P.p_state[R_RA] = (unsigned long)dipc->di_0;
  23.     do_known_delayed_branch;
  24.  
  25.     return dipc;
  26. }
  27.  
  28. static
  29. dinstrn    *
  30. c_jal_up(dipc)
  31. dinstrn    *dipc;
  32. {
  33.     P.p_state[R_RA] = (unsigned long)dipc->di_0;
  34.     do_known_delayed_upbranch;
  35.  
  36.     return dipc;
  37. }
  38.  
  39. dinstrn    *
  40. i_jal(dipc, target)
  41. dinstrn        *dipc;
  42. unsigned long    target;
  43. {
  44.     unsigned long    ra;
  45.     unsigned long    addr;
  46.  
  47.     ra = dipc->di_addr + 2 * sizeof(unsigned long);
  48.     addr = (dipc->di_addr & 0xF0000000) | (target << 2);
  49.  
  50.     if (compile_ok)
  51.     {
  52.         dipc->di_handler = (addr > dipc->di_addr) ? c_jal : c_jal_up;
  53.         dipc->di_0 = (unsigned long *)ra;
  54.         (void)compile_known_delayed_branch(dipc, addr);
  55.  
  56.         return (*dipc->di_handler)(dipc);
  57.     }
  58.  
  59.     /*
  60.      * Save the link address in the link register.
  61.      */
  62.     procsput(R_RA, ra);
  63.  
  64.     dipc = do_delayed_branch(dipc, addr);
  65.  
  66.     return dipc;
  67. }
  68.  
  69. dinstrn    *
  70. i_jalr(dipc, rs, rt, rd, shamt, funct)
  71. dinstrn    *dipc;
  72. int    rs;
  73. int    rt;
  74. int    rd;
  75. int    shamt;
  76. int    funct;
  77. {
  78.     unsigned long    ra;
  79.     unsigned long    s;
  80.  
  81.     ra = dipc->di_addr + 2 * sizeof(unsigned long);
  82.  
  83.     procsget(rs, s);
  84.  
  85.     /*
  86.      * Save the link address in the link register.
  87.      */
  88.     procsput(rd, ra);
  89.  
  90.     dipc = do_delayed_branch(dipc, s);
  91.  
  92.     return dipc;
  93. }
  94.  
  95. static
  96. dinstrn    *
  97. c_jr(dipc)
  98. dinstrn    *dipc;
  99. {
  100.     do_unknown_delayed_branch;
  101.  
  102.     return dipc;
  103. }
  104.  
  105. dinstrn    *
  106. i_jr(dipc, rs, rt, rd, shamt, funct)
  107. dinstrn    *dipc;
  108. int    rs;
  109. int    rt;
  110. int    rd;
  111. int    shamt;
  112. int    funct;
  113. {
  114.     unsigned long    s;
  115.  
  116.     if (compile_ok)
  117.     {
  118.         dipc->di_handler = c_jr;
  119.         dipc->di_0 = &P.p_state[rs];
  120.         (void)compile_unknown_delayed_branch(dipc);
  121.  
  122.         return (*dipc->di_handler)(dipc);
  123.     }
  124.  
  125.     procsget(rs, s);
  126.  
  127.     dipc = do_delayed_branch(dipc, s);
  128.  
  129.     return dipc;
  130. }
  131.