volume: convert from liboil to orc
authorDavid Schleef <ds@schleef.org>
Mon, 7 Jun 2010 06:48:15 +0000 (23:48 -0700)
committerDavid Schleef <ds@schleef.org>
Tue, 8 Jun 2010 06:58:54 +0000 (23:58 -0700)
gst/volume/Makefile.am
gst/volume/gstvolume.c
gst/volume/gstvolumeorc-dist.c [new file with mode: 0644]
gst/volume/gstvolumeorc-dist.h [new file with mode: 0644]
gst/volume/gstvolumeorc.orc [new file with mode: 0644]

index 393b2ef..04c348d 100644 (file)
@@ -1,7 +1,11 @@
 plugin_LTLIBRARIES = libgstvolume.la
 
+ORC_SOURCE=gstvolumeorc
+include $(top_srcdir)/common/orc.mak
+
 libgstvolume_la_SOURCES = gstvolume.c
-libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(LIBOIL_CFLAGS)
+nodist_libgstvolume_la_SOURCES = $(ORC_NODIST_SOURCES)
+libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS)
 libgstvolume_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstvolume_la_LIBADD = \
        $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
@@ -9,8 +13,9 @@ libgstvolume_la_LIBADD = \
        $(GST_BASE_LIBS) \
        $(GST_CONTROLLER_LIBS) \
        $(GST_LIBS) \
-       $(LIBOIL_LIBS)
+       $(ORC_LIBS)
 libgstvolume_la_LIBTOOLFLAGS = --tag=disable-static
 
 noinst_HEADERS = gstvolume.h
 
+
index 2cf2427..09318f5 100644 (file)
@@ -49,7 +49,7 @@
 #include <gst/controller/gstcontroller.h>
 #include <gst/audio/audio.h>
 #include <gst/audio/gstaudiofilter.h>
-#include <liboil/liboil.h>
+#include "gstvolumeorc.h"
 
 #include "gstvolume.h"
 
@@ -502,10 +502,13 @@ volume_process_double (GstVolume * self, gpointer bytes, guint n_bytes)
 {
   gdouble *data = (gdouble *) bytes;
   guint num_samples = n_bytes / sizeof (gdouble);
+  int i;
 
   gdouble vol = self->current_volume;
 
-  oil_scalarmultiply_f64_ns (data, data, &vol, num_samples);
+  for (i = 0; i < num_samples; i++) {
+    data[i] *= vol;
+  }
 }
 
 static void
@@ -531,17 +534,15 @@ volume_process_float (GstVolume * self, gpointer bytes, guint n_bytes)
   gfloat *data = (gfloat *) bytes;
   guint num_samples = n_bytes / sizeof (gfloat);
 
-#if 0
-  guint i;
-
+#ifndef broken
+  int i;
   for (i = 0; i < num_samples; i++) {
-    *data++ *= self->real_vol_f;
+    *data++ *= self->current_volume;
   }
-  /* time "gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float !
-   * volume volume=1.5 ! fakesink" goes from 0m0.850s -> 0m0.717s with liboil
-   */
+#else
+  /* FIXME compiler doesn't set the float parameter correctly */
+  orc_scalarmultiply_f32_ns (data, data, self->current_volume, num_samples);
 #endif
-  oil_scalarmultiply_f32_ns (data, data, &self->current_volume, num_samples);
 }
 
 static void
@@ -717,28 +718,40 @@ volume_process_int16 (GstVolume * self, gpointer bytes, guint n_bytes)
         (gint16) ((self->current_vol_i16 *
             val) >> VOLUME_UNITY_INT16_BIT_SHIFT);
   }
+#if 0
+  /* FIXME */
+  /* hard coded in volume.orc */
+  g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13);
+
+  orc_process_int16 (data, this->current_vol_i16, num_samples);
+#endif
 }
 
 static void
 volume_process_int16_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
 {
   gint16 *data = (gint16 *) bytes;
-  guint i, num_samples;
-  gint val;
+  guint num_samples = n_bytes / sizeof (gint16);
+  int i;
 
-  num_samples = n_bytes / sizeof (gint16);
+  /* hard coded in volume.orc */
+  g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13);
 
   /* FIXME: oil_scalarmultiply_s16_ns ?
    * https://bugs.freedesktop.org/show_bug.cgi?id=7060
    */
   for (i = 0; i < num_samples; i++) {
     /* we use bitshifting instead of dividing by UNITY_INT for speed */
-    val = (gint) * data;
+    int val = (gint) * data;
     *data++ =
         (gint16) CLAMP ((self->current_vol_i16 *
             val) >> VOLUME_UNITY_INT16_BIT_SHIFT, VOLUME_MIN_INT16,
         VOLUME_MAX_INT16);
   }
+#if 0
+  /* FIXME */
+  orc_process_int16_clamp (data, this->current_vol_i16, num_samples);
+#endif
 }
 
 static void
@@ -764,34 +777,45 @@ volume_process_int8 (GstVolume * self, gpointer bytes, guint n_bytes)
 {
   gint8 *data = (gint8 *) bytes;
   guint num_samples = n_bytes / sizeof (gint8);
-  guint i;
-  gint val;
+  int i;
 
   for (i = 0; i < num_samples; i++) {
     /* we use bitshifting instead of dividing by UNITY_INT for speed */
-    val = (gint) * data;
+    int val = (gint) * data;
     *data++ =
         (gint8) ((self->current_vol_i8 * val) >> VOLUME_UNITY_INT8_BIT_SHIFT);
   }
+#if 0
+  /* FIXME */
+  /* hard coded in volume.orc */
+  g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5);
+
+  orc_process_int8 (data, this->current_vol_i8, num_samples);
+#endif
 }
 
 static void
 volume_process_int8_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
 {
   gint8 *data = (gint8 *) bytes;
-  guint i, num_samples;
-  gint val;
+  guint num_samples = n_bytes / sizeof (gint8);
+  int i;
 
-  num_samples = n_bytes / sizeof (gint8);
+  /* hard coded in volume.orc */
+  g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5);
 
   for (i = 0; i < num_samples; i++) {
     /* we use bitshifting instead of dividing by UNITY_INT for speed */
-    val = (gint) * data;
+    int val = (gint) * data;
     *data++ =
         (gint8) CLAMP ((self->current_vol_i8 *
             val) >> VOLUME_UNITY_INT8_BIT_SHIFT, VOLUME_MIN_INT8,
         VOLUME_MAX_INT8);
   }
+#if 0
+  /* FIXME */
+  orc_process_int8_clamp (data, this->current_vol_i8, num_samples);
+#endif
 }
 
 static void
@@ -1053,8 +1077,6 @@ volume_get_property (GObject * object, guint prop_id, GValue * value,
 static gboolean
 plugin_init (GstPlugin * plugin)
 {
-  oil_init ();
-
   /* initialize gst controller library */
   gst_controller_init (NULL, NULL);
 
diff --git a/gst/volume/gstvolumeorc-dist.c b/gst/volume/gstvolumeorc-dist.c
new file mode 100644 (file)
index 0000000..a251912
--- /dev/null
@@ -0,0 +1,458 @@
+
+/* autogenerated from gstvolumeorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifndef DISABLE_ORC
+#include <orc/orc.h>
+#else
+#include <stdint.h>
+#endif
+#include <glib.h>
+
+void orc_process_int16 (gint16 * d1, int p1, int n);
+void orc_process_int16_clamp (gint16 * d1, int p1, int n);
+void orc_process_int8 (gint8 * d1, int p1, int n);
+void orc_process_int8_clamp (gint8 * d1, int p1, int n);
+
+
+/* begin Orc C target preamble */
+#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x)))
+#define ORC_ABS(a) ((a)<0 ? -(a) : (a))
+#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b))
+#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b))
+#define ORC_SB_MAX 127
+#define ORC_SB_MIN (-1-ORC_SB_MAX)
+#define ORC_UB_MAX 255
+#define ORC_UB_MIN 0
+#define ORC_SW_MAX 32767
+#define ORC_SW_MIN (-1-ORC_SW_MAX)
+#define ORC_UW_MAX 65535
+#define ORC_UW_MIN 0
+#define ORC_SL_MAX 2147483647
+#define ORC_SL_MIN (-1-ORC_SL_MAX)
+#define ORC_UL_MAX 4294967295U
+#define ORC_UL_MIN 0
+#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
+#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
+#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
+#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
+#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
+#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
+#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))
+#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24))
+#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
+#define ORC_AS_FLOAT(x) (((union { int i; float f; } *)(&x))->f)
+typedef union
+{
+  int32_t i;
+  float f;
+} orc_union32;
+typedef union
+{
+  int64_t i;
+  double f;
+} orc_union64;
+/* end Orc C target preamble */
+
+
+
+/* orc_process_int16 */
+#ifdef DISABLE_ORC
+void
+orc_process_int16 (gint16 * d1, int p1, int n)
+{
+  int i;
+  int16_t var0;
+  int16_t *ptr0;
+  const int16_t var16 = 13;
+  const int16_t var24 = p1;
+  orc_union32 var32;
+  orc_union32 var33;
+
+  ptr0 = (int16_t *) d1;
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulswl */
+    var32.i = var0 * var24;
+    /* 1: shrsl */
+    var33.i = var32.i >> var16;
+    /* 2: convlw */
+    var0 = var33.i;
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+#else
+static void
+_backup_orc_process_int16 (OrcExecutor * ex)
+{
+  int i;
+  int n = ex->n;
+  int16_t var0;
+  int16_t *ptr0;
+  const int16_t var16 = 13;
+  const int16_t var24 = ex->params[24];
+  orc_union32 var32;
+  orc_union32 var33;
+
+  ptr0 = (int16_t *) ex->arrays[0];
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulswl */
+    var32.i = var0 * var24;
+    /* 1: shrsl */
+    var33.i = var32.i >> var16;
+    /* 2: convlw */
+    var0 = var33.i;
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+void
+orc_process_int16 (gint16 * d1, int p1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  static int p_inited = 0;
+  static OrcProgram *p = 0;
+  void (*func) (OrcExecutor *);
+
+  if (!p_inited) {
+    orc_once_mutex_lock ();
+    if (!p_inited) {
+      OrcCompileResult result;
+
+      p = orc_program_new ();
+      orc_program_set_name (p, "orc_process_int16");
+      orc_program_set_backup_function (p, _backup_orc_process_int16);
+      orc_program_add_destination (p, 2, "d1");
+      orc_program_add_constant (p, 2, 13, "c1");
+      orc_program_add_parameter (p, 2, "p1");
+      orc_program_add_temporary (p, 4, "t1");
+
+      orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+      orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+      orc_program_append (p, "convlw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+      result = orc_program_compile (p);
+    }
+    p_inited = TRUE;
+    orc_once_mutex_unlock ();
+  }
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->params[ORC_VAR_P1] = p1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* orc_process_int16_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int16_clamp (gint16 * d1, int p1, int n)
+{
+  int i;
+  int16_t var0;
+  int16_t *ptr0;
+  const int16_t var16 = 13;
+  const int16_t var24 = p1;
+  orc_union32 var32;
+  orc_union32 var33;
+
+  ptr0 = (int16_t *) d1;
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulswl */
+    var32.i = var0 * var24;
+    /* 1: shrsl */
+    var33.i = var32.i >> var16;
+    /* 2: convssslw */
+    var0 = ORC_CLAMP_SW (var33.i);
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+#else
+static void
+_backup_orc_process_int16_clamp (OrcExecutor * ex)
+{
+  int i;
+  int n = ex->n;
+  int16_t var0;
+  int16_t *ptr0;
+  const int16_t var16 = 13;
+  const int16_t var24 = ex->params[24];
+  orc_union32 var32;
+  orc_union32 var33;
+
+  ptr0 = (int16_t *) ex->arrays[0];
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulswl */
+    var32.i = var0 * var24;
+    /* 1: shrsl */
+    var33.i = var32.i >> var16;
+    /* 2: convssslw */
+    var0 = ORC_CLAMP_SW (var33.i);
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+void
+orc_process_int16_clamp (gint16 * d1, int p1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  static int p_inited = 0;
+  static OrcProgram *p = 0;
+  void (*func) (OrcExecutor *);
+
+  if (!p_inited) {
+    orc_once_mutex_lock ();
+    if (!p_inited) {
+      OrcCompileResult result;
+
+      p = orc_program_new ();
+      orc_program_set_name (p, "orc_process_int16_clamp");
+      orc_program_set_backup_function (p, _backup_orc_process_int16_clamp);
+      orc_program_add_destination (p, 2, "d1");
+      orc_program_add_constant (p, 2, 13, "c1");
+      orc_program_add_parameter (p, 2, "p1");
+      orc_program_add_temporary (p, 4, "t1");
+
+      orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+      orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+      orc_program_append (p, "convssslw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+      result = orc_program_compile (p);
+    }
+    p_inited = TRUE;
+    orc_once_mutex_unlock ();
+  }
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->params[ORC_VAR_P1] = p1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* orc_process_int8 */
+#ifdef DISABLE_ORC
+void
+orc_process_int8 (gint8 * d1, int p1, int n)
+{
+  int i;
+  int8_t var0;
+  int8_t *ptr0;
+  const int16_t var16 = 5;
+  const int8_t var24 = p1;
+  int16_t var32;
+  int16_t var33;
+
+  ptr0 = (int8_t *) d1;
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulsbw */
+    var32 = var0 * var24;
+    /* 1: shrsw */
+    var33 = var32 >> var16;
+    /* 2: convwb */
+    var0 = var33;
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+#else
+static void
+_backup_orc_process_int8 (OrcExecutor * ex)
+{
+  int i;
+  int n = ex->n;
+  int8_t var0;
+  int8_t *ptr0;
+  const int16_t var16 = 5;
+  const int8_t var24 = ex->params[24];
+  int16_t var32;
+  int16_t var33;
+
+  ptr0 = (int8_t *) ex->arrays[0];
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulsbw */
+    var32 = var0 * var24;
+    /* 1: shrsw */
+    var33 = var32 >> var16;
+    /* 2: convwb */
+    var0 = var33;
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+void
+orc_process_int8 (gint8 * d1, int p1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  static int p_inited = 0;
+  static OrcProgram *p = 0;
+  void (*func) (OrcExecutor *);
+
+  if (!p_inited) {
+    orc_once_mutex_lock ();
+    if (!p_inited) {
+      OrcCompileResult result;
+
+      p = orc_program_new ();
+      orc_program_set_name (p, "orc_process_int8");
+      orc_program_set_backup_function (p, _backup_orc_process_int8);
+      orc_program_add_destination (p, 1, "d1");
+      orc_program_add_constant (p, 2, 5, "c1");
+      orc_program_add_parameter (p, 1, "p1");
+      orc_program_add_temporary (p, 2, "t1");
+
+      orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+      orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+      orc_program_append (p, "convwb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+      result = orc_program_compile (p);
+    }
+    p_inited = TRUE;
+    orc_once_mutex_unlock ();
+  }
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->params[ORC_VAR_P1] = p1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* orc_process_int8_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int8_clamp (gint8 * d1, int p1, int n)
+{
+  int i;
+  int8_t var0;
+  int8_t *ptr0;
+  const int16_t var16 = 5;
+  const int8_t var24 = p1;
+  int16_t var32;
+  int16_t var33;
+
+  ptr0 = (int8_t *) d1;
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulsbw */
+    var32 = var0 * var24;
+    /* 1: shrsw */
+    var33 = var32 >> var16;
+    /* 2: convssswb */
+    var0 = ORC_CLAMP_SB (var33);
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+#else
+static void
+_backup_orc_process_int8_clamp (OrcExecutor * ex)
+{
+  int i;
+  int n = ex->n;
+  int8_t var0;
+  int8_t *ptr0;
+  const int16_t var16 = 5;
+  const int8_t var24 = ex->params[24];
+  int16_t var32;
+  int16_t var33;
+
+  ptr0 = (int8_t *) ex->arrays[0];
+
+  for (i = 0; i < n; i++) {
+    var0 = *ptr0;
+    /* 0: mulsbw */
+    var32 = var0 * var24;
+    /* 1: shrsw */
+    var33 = var32 >> var16;
+    /* 2: convssswb */
+    var0 = ORC_CLAMP_SB (var33);
+    *ptr0 = var0;
+    ptr0++;
+  }
+
+}
+
+void
+orc_process_int8_clamp (gint8 * d1, int p1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  static int p_inited = 0;
+  static OrcProgram *p = 0;
+  void (*func) (OrcExecutor *);
+
+  if (!p_inited) {
+    orc_once_mutex_lock ();
+    if (!p_inited) {
+      OrcCompileResult result;
+
+      p = orc_program_new ();
+      orc_program_set_name (p, "orc_process_int8_clamp");
+      orc_program_set_backup_function (p, _backup_orc_process_int8_clamp);
+      orc_program_add_destination (p, 1, "d1");
+      orc_program_add_constant (p, 2, 5, "c1");
+      orc_program_add_parameter (p, 1, "p1");
+      orc_program_add_temporary (p, 2, "t1");
+
+      orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+      orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+      orc_program_append (p, "convssswb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+      result = orc_program_compile (p);
+    }
+    p_inited = TRUE;
+    orc_once_mutex_unlock ();
+  }
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->params[ORC_VAR_P1] = p1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
diff --git a/gst/volume/gstvolumeorc-dist.h b/gst/volume/gstvolumeorc-dist.h
new file mode 100644 (file)
index 0000000..756e6de
--- /dev/null
@@ -0,0 +1,23 @@
+
+/* autogenerated from gstvolumeorc.orc */
+
+#ifndef _GSTVOLUMEORC_H_
+#define _GSTVOLUMEORC_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void orc_process_int16 (gint16 * d1, int p1, int n);
+void orc_process_int16_clamp (gint16 * d1, int p1, int n);
+void orc_process_int8 (gint8 * d1, int p1, int n);
+void orc_process_int8_clamp (gint8 * d1, int p1, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/gst/volume/gstvolumeorc.orc b/gst/volume/gstvolumeorc.orc
new file mode 100644 (file)
index 0000000..a251df5
--- /dev/null
@@ -0,0 +1,49 @@
+
+#.function orc_scalarmultiply_f32_ns
+#.dest 4 d1 float
+#.source 4 s1 float
+#.param 4 p1
+
+#mulf d1, s1, p1
+
+
+.function orc_process_int16
+.dest 2 d1 gint16
+.param 2 p1
+.temp 4 t1
+
+mulswl t1, d1, p1
+shrsl t1, t1, 13
+convlw d1, t1
+
+
+.function orc_process_int16_clamp
+.dest 2 d1 gint16
+.param 2 p1
+.temp 4 t1
+
+mulswl t1, d1, p1
+shrsl t1, t1, 13
+convssslw d1, t1
+
+
+.function orc_process_int8
+.dest 1 d1 gint8
+.param 1 p1
+.temp 2 t1
+
+mulsbw t1, d1, p1
+shrsw t1, t1, 5
+convwb d1, t1
+
+
+.function orc_process_int8_clamp
+.dest 1 d1 gint8
+.param 1 p1
+.temp 2 t1
+
+mulsbw t1, d1, p1
+shrsw t1, t1, 5
+convssswb d1, t1
+
+