do_incdec.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Sources of the "INCREMENT/DECREMENT/ZERO" group instructions
  3. */
  4. /* $Id$ */
  5. #include <em_abs.h>
  6. #include "global.h"
  7. #include "log.h"
  8. #include "nofloat.h"
  9. #include "trap.h"
  10. #include "mem.h"
  11. #include "text.h"
  12. #include "fra.h"
  13. #include "warn.h"
  14. PRIVATE long inc(), dec();
  15. DoINC()
  16. {
  17. /* INC -: Increment word on top of stack by 1 (*) */
  18. LOG(("@Z6 DoINC()"));
  19. spoilFRA();
  20. wpush(inc(swpop()));
  21. }
  22. DoINL(l)
  23. register long l;
  24. {
  25. /* INL l: Increment local or parameter (*) */
  26. register ptr p;
  27. LOG(("@Z6 DoINL(%ld)", l));
  28. spoilFRA();
  29. p = loc_addr(arg_l(l));
  30. st_stw(p, inc(st_ldsw(p)));
  31. }
  32. DoINE(arg)
  33. register long arg;
  34. {
  35. /* INE g: Increment external (*) */
  36. register ptr p = i2p(arg);
  37. LOG(("@Z6 DoINE(%lu)", p));
  38. spoilFRA();
  39. p = arg_g(p);
  40. dt_stw(p, inc(dt_ldsw(p)));
  41. }
  42. DoDEC()
  43. {
  44. /* DEC -: Decrement word on top of stack by 1 (*) */
  45. LOG(("@Z6 DoDEC()"));
  46. spoilFRA();
  47. wpush(dec(swpop()));
  48. }
  49. DoDEL(l)
  50. register long l;
  51. {
  52. /* DEL l: Decrement local or parameter (*) */
  53. register ptr p;
  54. LOG(("@Z6 DoDEL(%ld)", l));
  55. spoilFRA();
  56. l = arg_l(l);
  57. p = loc_addr(l);
  58. st_stw(p, dec(st_ldsw(p)));
  59. }
  60. DoDEE(arg)
  61. register long arg;
  62. {
  63. /* DEE g: Decrement external (*) */
  64. register ptr p = i2p(arg);
  65. LOG(("@Z6 DoDEE(%lu)", p));
  66. spoilFRA();
  67. p = arg_g(p);
  68. dt_stw(p, dec(dt_ldsw(p)));
  69. }
  70. DoZRL(l)
  71. register long l;
  72. {
  73. /* ZRL l: Zero local or parameter */
  74. LOG(("@Z6 DoZRL(%ld)", l));
  75. spoilFRA();
  76. l = arg_l(l);
  77. st_stw(loc_addr(l), 0L);
  78. }
  79. DoZRE(arg)
  80. register long arg;
  81. {
  82. /* ZRE g: Zero external */
  83. register ptr p = i2p(arg);
  84. LOG(("@Z6 DoZRE(%lu)", p));
  85. spoilFRA();
  86. dt_stw(arg_g(p), 0L);
  87. }
  88. DoZRF(l)
  89. register size l;
  90. {
  91. /* ZRF w: Load a floating zero of size w */
  92. #ifndef NOFLOAT
  93. LOG(("@Z6 DoZRF(%ld)", l));
  94. spoilFRA();
  95. fpush(0.0, arg_wf(l));
  96. #else /* NOFLOAT */
  97. arg = arg;
  98. nofloat();
  99. #endif /* NOFLOAT */
  100. }
  101. DoZER(l)
  102. register size l;
  103. {
  104. /* ZER w: Load w zero bytes */
  105. register size i;
  106. LOG(("@Z6 DoZER(%ld)", l));
  107. spoilFRA();
  108. npush(0L, arg_w(l));
  109. /*
  110. for (i = arg_w(l); i; i -= wsize)
  111. wpush(0L);
  112. */
  113. }
  114. PRIVATE long inc(l)
  115. long l;
  116. {
  117. if (must_test && !(IgnMask&BIT(EIOVFL))) {
  118. if (l == i_maxsw)
  119. trap(EIOVFL);
  120. }
  121. return (l + 1);
  122. }
  123. PRIVATE long dec(l)
  124. long l;
  125. {
  126. if (must_test && !(IgnMask&BIT(EIOVFL))) {
  127. if (l == i_minsw)
  128. trap(EIOVFL);
  129. }
  130. return (l - 1);
  131. }