do_branch.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Sources of the "BRANCH" group instructions
  3. */
  4. /* $Id$ */
  5. #include <em_abs.h>
  6. #include "global.h"
  7. #include "log.h"
  8. #include "mem.h"
  9. #include "trap.h"
  10. #include "text.h"
  11. #include "fra.h"
  12. #include "warn.h"
  13. /* Note that in the EM assembly language brach instructions have
  14. lables as their arguments, where in the EM machine language they
  15. have (relative) offsets as parameters. This is not described in the
  16. EM manual but follows from the Pascal interpreter.
  17. */
  18. #define do_jump(j) { newPC(PC + (j)); }
  19. DoBRA(jump)
  20. register long jump;
  21. {
  22. /* BRA b: Branch unconditionally to label b */
  23. LOG(("@B6 DoBRA(%ld)", jump));
  24. do_jump(arg_c(jump));
  25. }
  26. DoBLT(jump)
  27. register long jump;
  28. {
  29. /* BLT b: Branch less (pop 2 words, branch if top > second) */
  30. register long t = wpop();
  31. LOG(("@B6 DoBLT(%ld)", jump));
  32. spoilFRA();
  33. if (wpop() < t)
  34. do_jump(arg_c(jump));
  35. }
  36. DoBLE(jump)
  37. register long jump;
  38. {
  39. /* BLE b: Branch less or equal */
  40. register long t = wpop();
  41. LOG(("@B6 DoBLE(%ld)", jump));
  42. spoilFRA();
  43. if (wpop() <= t)
  44. do_jump(arg_c(jump));
  45. }
  46. DoBEQ(jump)
  47. register long jump;
  48. {
  49. /* BEQ b: Branch equal */
  50. register long t = wpop();
  51. LOG(("@B6 DoBEQ(%ld)", jump));
  52. spoilFRA();
  53. if (t == wpop())
  54. do_jump(arg_c(jump));
  55. }
  56. DoBNE(jump)
  57. register long jump;
  58. {
  59. /* BNE b: Branch not equal */
  60. register long t = wpop();
  61. LOG(("@B6 DoBNE(%ld)", jump));
  62. spoilFRA();
  63. if (t != wpop())
  64. do_jump(arg_c(jump));
  65. }
  66. DoBGE(jump)
  67. register long jump;
  68. {
  69. /* BGE b: Branch greater or equal */
  70. register long t = wpop();
  71. LOG(("@B6 DoBGE(%ld)", jump));
  72. spoilFRA();
  73. if (wpop() >= t)
  74. do_jump(arg_c(jump));
  75. }
  76. DoBGT(jump)
  77. register long jump;
  78. {
  79. /* BGT b: Branch greater */
  80. register long t = wpop();
  81. LOG(("@B6 DoBGT(%ld)", jump));
  82. spoilFRA();
  83. if (wpop() > t)
  84. do_jump(arg_c(jump));
  85. }
  86. DoZLT(jump)
  87. register long jump;
  88. {
  89. /* ZLT b: Branch less than zero (pop 1 word, branch negative) */
  90. LOG(("@B6 DoZLT(%ld)", jump));
  91. spoilFRA();
  92. if (wpop() < 0)
  93. do_jump(arg_c(jump));
  94. }
  95. DoZLE(jump)
  96. register long jump;
  97. {
  98. /* ZLE b: Branch less or equal to zero */
  99. LOG(("@B6 DoZLE(%ld)", jump));
  100. spoilFRA();
  101. if (wpop() <= 0)
  102. do_jump(arg_c(jump));
  103. }
  104. DoZEQ(jump)
  105. register long jump;
  106. {
  107. /* ZEQ b: Branch equal zero */
  108. LOG(("@B6 DoZEQ(%ld)", jump));
  109. spoilFRA();
  110. if (wpop() == 0)
  111. do_jump(arg_c(jump));
  112. }
  113. DoZNE(jump)
  114. register long jump;
  115. {
  116. /* ZNE b: Branch not zero */
  117. LOG(("@B6 DoZNE(%ld)", jump));
  118. spoilFRA();
  119. if (wpop() != 0)
  120. do_jump(arg_c(jump));
  121. }
  122. DoZGE(jump)
  123. register long jump;
  124. {
  125. /* ZGE b: Branch greater or equal zero */
  126. LOG(("@B6 DoZGE(%ld)", jump));
  127. spoilFRA();
  128. if (wpop() >= 0)
  129. do_jump(arg_c(jump));
  130. }
  131. DoZGT(jump)
  132. register long jump;
  133. {
  134. /* ZGT b: Branch greater than zero */
  135. LOG(("@B6 DoZGT(%ld)", jump));
  136. spoilFRA();
  137. if (wpop() > 0)
  138. do_jump(arg_c(jump));
  139. }