123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * Sources of the "BRANCH" group instructions
- */
- /* $Id$ */
- #include <em_abs.h>
- #include "global.h"
- #include "log.h"
- #include "mem.h"
- #include "trap.h"
- #include "text.h"
- #include "fra.h"
- #include "warn.h"
- /* Note that in the EM assembly language brach instructions have
- lables as their arguments, where in the EM machine language they
- have (relative) offsets as parameters. This is not described in the
- EM manual but follows from the Pascal interpreter.
- */
- #define do_jump(j) { newPC(PC + (j)); }
- DoBRA(jump)
- register long jump;
- {
- /* BRA b: Branch unconditionally to label b */
- LOG(("@B6 DoBRA(%ld)", jump));
- do_jump(arg_c(jump));
- }
- DoBLT(jump)
- register long jump;
- {
- /* BLT b: Branch less (pop 2 words, branch if top > second) */
- register long t = wpop();
- LOG(("@B6 DoBLT(%ld)", jump));
- spoilFRA();
- if (wpop() < t)
- do_jump(arg_c(jump));
- }
- DoBLE(jump)
- register long jump;
- {
- /* BLE b: Branch less or equal */
- register long t = wpop();
- LOG(("@B6 DoBLE(%ld)", jump));
- spoilFRA();
- if (wpop() <= t)
- do_jump(arg_c(jump));
- }
- DoBEQ(jump)
- register long jump;
- {
- /* BEQ b: Branch equal */
- register long t = wpop();
- LOG(("@B6 DoBEQ(%ld)", jump));
- spoilFRA();
- if (t == wpop())
- do_jump(arg_c(jump));
- }
- DoBNE(jump)
- register long jump;
- {
- /* BNE b: Branch not equal */
- register long t = wpop();
- LOG(("@B6 DoBNE(%ld)", jump));
- spoilFRA();
- if (t != wpop())
- do_jump(arg_c(jump));
- }
- DoBGE(jump)
- register long jump;
- {
- /* BGE b: Branch greater or equal */
- register long t = wpop();
- LOG(("@B6 DoBGE(%ld)", jump));
- spoilFRA();
- if (wpop() >= t)
- do_jump(arg_c(jump));
- }
- DoBGT(jump)
- register long jump;
- {
- /* BGT b: Branch greater */
- register long t = wpop();
- LOG(("@B6 DoBGT(%ld)", jump));
- spoilFRA();
- if (wpop() > t)
- do_jump(arg_c(jump));
- }
- DoZLT(jump)
- register long jump;
- {
- /* ZLT b: Branch less than zero (pop 1 word, branch negative) */
- LOG(("@B6 DoZLT(%ld)", jump));
- spoilFRA();
- if (wpop() < 0)
- do_jump(arg_c(jump));
- }
- DoZLE(jump)
- register long jump;
- {
- /* ZLE b: Branch less or equal to zero */
- LOG(("@B6 DoZLE(%ld)", jump));
- spoilFRA();
- if (wpop() <= 0)
- do_jump(arg_c(jump));
- }
- DoZEQ(jump)
- register long jump;
- {
- /* ZEQ b: Branch equal zero */
- LOG(("@B6 DoZEQ(%ld)", jump));
- spoilFRA();
- if (wpop() == 0)
- do_jump(arg_c(jump));
- }
- DoZNE(jump)
- register long jump;
- {
- /* ZNE b: Branch not zero */
- LOG(("@B6 DoZNE(%ld)", jump));
- spoilFRA();
- if (wpop() != 0)
- do_jump(arg_c(jump));
- }
- DoZGE(jump)
- register long jump;
- {
- /* ZGE b: Branch greater or equal zero */
- LOG(("@B6 DoZGE(%ld)", jump));
- spoilFRA();
- if (wpop() >= 0)
- do_jump(arg_c(jump));
- }
- DoZGT(jump)
- register long jump;
- {
- /* ZGT b: Branch greater than zero */
- LOG(("@B6 DoZGT(%ld)", jump));
- spoilFRA();
- if (wpop() > 0)
- do_jump(arg_c(jump));
- }
|