#include "forth.h"
/* Arithmetic ops */

PRIMITIVE ("+", Fplus, Splus, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  sp[2] += sp[0];
  POP;
}


PRIMITIVE ("-", Fminus, Sminus, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  sp[2] -= sp[0];
  POP;
}


PRIMITIVE ("*", Fmultiply, Smultiply, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  sp[2] *= sp[0];
  POP;
}


PRIMITIVE ("/", Fdivide, Sdivide, NON_IMMEDIATE, ( n1 n2  -- n ) )
{
  sp[2] /= sp[0];
  POP;
}


PRIMITIVE ("mod", Fmod, Smod, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  sp[2] %= sp[0];
  POP;
}


PRIMITIVE ("abs", Fabs, Sabs, NON_IMMEDIATE, ( (n || -n) -- n ) )
{
  sp[0] = labs (sp[0]);
}


PRIMITIVE ("neg", Fneg, Sneg, NON_IMMEDIATE, ( n -- -n ) )
{
  sp[0] = 0 - sp[0];
}


PRIMITIVE ("max", Fmax, Smax, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  if (sp[0] > sp[2])
    sp[2] = sp[0];
  POP;
}


PRIMITIVE ("min", Fmin, Smin, NON_IMMEDIATE, ( n1 n2 -- n ) )
{
  if (sp[0] < sp[2])
    sp[0] = sp[2];
  POP;
}


PRIMITIVE (">", Fgt, Sgt, NON_IMMEDIATE, ( n1 n2 -- [n1 > n2] ) )
{
  if (sp[2] > sp[0])
    {
      POP;
      sp[0] = TRUE;
    }
  else
    {
      POP;
      sp[0] = FALSE;
    }
}


PRIMITIVE ("<", Flt, Slt, NON_IMMEDIATE, ( n1 n2 -- [n1 < n2] ) )
{
  if (sp[2] < sp[0])
    {
      POP;
      sp[0] = TRUE;
    }
  else
    {
      POP;
      sp[0] = FALSE;
    }
}


PRIMITIVE (">=", Fgte, Sgte, NON_IMMEDIATE, ( n1 n2 -- [n1 >= n2] ) )
{
  if (sp[2] >= sp[0])
    {
      POP;
      sp[0] = TRUE;
    }
  else
    {
      POP;
      sp[0] = FALSE;
    }
}


PRIMITIVE ("<=", Flte, Slte, NON_IMMEDIATE, ( n1 n2 -- [n1 <= n2] ) )
{
  if (sp[2] <= sp[0])
    {
      POP;
      sp[0] = TRUE;
    }
  else
    {
      POP;
      sp[0] = FALSE;
    }
}


PRIMITIVE ("lsh", Flsh, Slsh, NON_IMMEDIATE, ( n1 n2 -- [n1 << n2] ) )
{
  sp[2] <<= sp[0];
  POP;
}


PRIMITIVE ("rsh", Frsh, Srsh, NON_IMMEDIATE, ( n1 n2 -- [n1 >> n2] ) )
{
  sp[2] >>= sp[0];
  POP;
}
