Index: /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/convert_to_RPN.c
===================================================================
--- /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 41136)
+++ /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 41137)
@@ -78,4 +78,8 @@
     if (!strcmp (argv[i], "atan2"))  { type = ST_BINARY; strcpy (argv[i], "a"); goto gotit; }
     if (!strcmp (argv[i], "datan2")) { type = ST_BINARY; strcpy (argv[i], "d"); goto gotit; }
+
+    if (!strcmp (argv[i], "<-"))     { type = ST_BINARY; strcpy (argv[i], "l"); goto gotit; }
+    if (!strcmp (argv[i], "->"))     { type = ST_BINARY; strcpy (argv[i], "r"); goto gotit; }
+
     if (!strcmp (argv[i], ","))      { type = ST_COMMA; goto gotit; }
 
@@ -99,4 +103,8 @@
     if (!strcmp (argv[i], ">>"))     { type = ST_LOGIC; strcpy (argv[i], "U"); goto gotit; }
     if (!strcmp (argv[i], "<<"))     { type = ST_LOGIC; strcpy (argv[i], "D"); goto gotit; }
+
+    /* XXX I would like to change the syntax to allow << and >> to mean bitshifts
+       but that means breaking these older values which means MIN and MAX */
+    // for now, use <- and -> to mean bitshift 
 
     if (!strcmp (argv[i], "&&"))     { type = ST_AND; strcpy (argv[i], "A"); goto gotit; }
Index: /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/stack_math.c
===================================================================
--- /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/stack_math.c	(revision 41136)
+++ /branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/stack_math.c	(revision 41137)
@@ -357,4 +357,43 @@
     case 'A': VV_FUNC(ST_SCALAR_INT, (*M1 && *M2) ? 1 : 0);
     case 'O': VV_FUNC(ST_SCALAR_INT, (*M1 || *M2) ? 1 : 0);
+
+    case 'l': {
+      if ((V1->vector->type == OPIHI_FLT) || (V2->vector->type == OPIHI_FLT)) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      // I could just do this for all types and bitshift regardless...
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int *M2  =  V2[0].vector[0].elements.Int;
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++, M2++) {
+  	*out = *M1 << *M2;
+      }
+      break;
+    }
+
+    case 'r': {
+      if ((V1->vector->type == OPIHI_FLT) || (V2->vector->type == OPIHI_FLT)) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      // I could just do this for all types and bitshift regardless...
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int *M2  =  V2[0].vector[0].elements.Int;
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++, M2++) {
+  	*out = *M1 >> *M2;
+      }
+      break;
+    }
+
     default:
       snprintf (line, 512, "error: op %c not defined!", op[0]);
@@ -469,4 +508,41 @@
     case 'A': SV_FUNC(ST_SCALAR_INT, (M1 && *M2) ? 1 : 0);
     case 'O': SV_FUNC(ST_SCALAR_INT, (M1 || *M2) ? 1 : 0);
+
+    case 'l': {
+      if (V2->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V2[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int  M1  =  V1[0].IntValue;					\
+      opihi_int *M2  =  V2[0].vector[0].elements.Int;
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M2++) {
+  	*out = M1 << *M2;
+      }
+      break;
+    }
+
+    case 'r': {
+      if (V2->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V2[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int  M1  =  V1[0].IntValue;					\
+      opihi_int *M2  =  V2[0].vector[0].elements.Int;
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M2++) {
+  	*out = M1 >> *M2;
+      }
+      break;
+    }
+
     default:
       snprintf (line, 512, "error: op %c not defined!", op[0]);
@@ -577,4 +653,41 @@
     case 'A': VS_FUNC(ST_SCALAR_INT, (*M1 && M2) ? 1 : 0);
     case 'O': VS_FUNC(ST_SCALAR_INT, (*M1 || M2) ? 1 : 0);
+
+    case 'l': {
+      if (V1->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int  M2  =  V2[0].IntValue;					\
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++) {
+  	*out = *M1 << M2;
+      }
+      break;
+    }
+
+    case 'r': {
+      if (V1->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int  M2  =  V2[0].IntValue;					\
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++) {
+  	*out = *M1 >> M2;
+      }
+      break;
+    }
+
     default:
       snprintf (line, 512, "error: op %c not defined!", op[0]);
@@ -670,4 +783,41 @@
     case 'A': MV_FUNC((*M1 && *M2) ? 1 : 0);
     case 'O': MV_FUNC((*M1 || *M2) ? 1 : 0);
+
+    case 'l': {
+      if (V1->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int  M2  =  V2[0].IntValue;					\
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++) {
+  	*out = *M1 << M2;
+      }
+      break;
+    }
+
+    case 'r': {
+      if (V1->vector->type == OPIHI_FLT) {
+	// bitshift is not valid with float valuess
+	CopyVector (OUT[0].vector, V1[0].vector);
+	for (i = 0; i < Nx; i++) {
+	  OUT[0].vector[0].elements.Flt[i] = NAN;
+	}
+	break;
+      }
+      opihi_int *M1  =  V1[0].vector[0].elements.Int;
+      opihi_int  M2  =  V2[0].IntValue;					\
+      opihi_int *out = OUT[0].vector[0].elements.Int;
+      for (i = 0; i < Nx; i++, out++, M1++) {
+  	*out = *M1 >> M2;
+      }
+      break;
+    }
+
     default:
       snprintf (line, 512, "error: op %c not defined!", op[0]);
