Hello community,

here is the log from the commit of package orc for openSUSE:Factory checked in 
at 2020-01-10 18:40:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/orc (Old)
 and      /work/SRC/openSUSE:Factory/.orc.new.6675 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "orc"

Fri Jan 10 18:40:26 2020 rev:41 rq:761683 version:0.4.31

Changes:
--------
--- /work/SRC/openSUSE:Factory/orc/orc.changes  2019-09-19 15:47:52.371329532 
+0200
+++ /work/SRC/openSUSE:Factory/.orc.new.6675/orc.changes        2020-01-10 
18:41:40.091519769 +0100
@@ -1,0 +2,10 @@
+Tue Jan  7 14:01:44 UTC 2020 - Dominique Leuenberger <[email protected]>
+
+- Update to version 0.4.31:
+  + Fix OrcTargetPowerPCFlags enum typedef to revert API change on
+    macOS/iOS.
+  + Fixes for various PowerPC issues.
+  + Enable flush-to-zero mode for float programs on ARM/neon.
+  + Fix some opcodes to support x2/x4 processing on PowerPC.
+
+-------------------------------------------------------------------

Old:
----
  orc-0.4.30.tar.xz

New:
----
  orc-0.4.31.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ orc.spec ++++++
--- /var/tmp/diff_new_pack.fL9gjc/_old  2020-01-10 18:41:40.659519982 +0100
+++ /var/tmp/diff_new_pack.fL9gjc/_new  2020-01-10 18:41:40.659519982 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package orc
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 # Copyright (c) 2010 Dominique Leuenberger, Amsterdam, Netherlands.
 #
 # All modifications and additions to the file contributed by third parties
@@ -18,7 +18,7 @@
 
 
 Name:           orc
-Version:        0.4.30
+Version:        0.4.31
 Release:        0
 Summary:        The Oil Runtime Compiler
 License:        BSD-3-Clause

++++++ orc-0.4.30.tar.xz -> orc-0.4.31.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/RELEASE new/orc-0.4.31/RELEASE
--- old/orc-0.4.30/RELEASE      2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/RELEASE      2019-11-02 10:24:52.000000000 +0100
@@ -1,5 +1,14 @@
+0.4.31
+======
+
+  - Fix OrcTargetPowerPCFlags enum typedef to revert API change on
+    macOS/iOS (Pablo Marcos Oltra)
+  - Fixes for various PowerPC issues (Doug Nazar)
+  - Enable flush-to-zero mode for float programs on ARM/neon (Doug Nazar)
+  - Fix some opcodes to support x2/x4 processing on PowerPC (Doug Nazar)
+
 0.4.30
-===================
+======
 
   - Don't always generate static library but default to shared-only (Xavier 
Claessens)
   - Work around false positives in Microsoft UWP certification kit (Nirbheek 
Chauhan)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/meson.build new/orc-0.4.31/meson.build
--- old/orc-0.4.30/meson.build  2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/meson.build  2019-11-02 10:24:52.000000000 +0100
@@ -1,4 +1,4 @@
-project ('orc', 'c', version : '0.4.30',
+project ('orc', 'c', version : '0.4.31',
                      meson_version : '>= 0.47.0',
                      default_options : ['buildtype=debugoptimized',
                                         'warning_level=1',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orcpowerpc.c 
new/orc-0.4.31/orc/orcpowerpc.c
--- old/orc-0.4.30/orc/orcpowerpc.c     2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/orc/orcpowerpc.c     2019-11-02 10:24:52.000000000 +0100
@@ -208,7 +208,7 @@
       powerpc_get_regname(regd),
       powerpc_get_regname(rega), shift);
 
-  insn = (31<<26) | (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16);
+  insn = (31<<26) | (powerpc_regnum (rega)<<21) | (powerpc_regnum (regd)<<16);
   insn |= (shift<<11) | (824<<1) | record;
 
   powerpc_emit (compiler, insn);
@@ -233,7 +233,7 @@
   ORC_ASM_CODE(compiler,"  %s %s, %s, %d\n", name,
       powerpc_get_regname(regd),
       powerpc_get_regname(rega), imm);
-  insn |= (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16);
+  insn |= (powerpc_regnum (rega)<<21) | (powerpc_regnum (regd)<<16);
   insn |= imm&0xffff;
 
   powerpc_emit (compiler, insn);
@@ -543,7 +543,7 @@
   {
     unsigned int insn;
 
-    ORC_ASM_CODE(p,"  addi %s, %s, %db - %s\n",
+    ORC_ASM_CODE(p,"  addi %s, %s, %df - %s\n",
         powerpc_get_regname(greg),
         powerpc_get_regname(greg), p->constants[i].label, p->program->name);
     insn = (14<<26) | (powerpc_regnum (greg)<<21) | (powerpc_regnum 
(greg)<<16);
@@ -740,3 +740,42 @@
   powerpc_add_label (compiler, compiler->codeptr, label);
 }
 
+void
+powerpc_load_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int 
src_reg)
+{
+  if (IS_POWERPC_BE (compiler)) {
+    ORC_ASM_CODE(compiler,"  lvsl %s, %s, %s\n",
+        powerpc_get_regname (vector_reg),
+        offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
+        powerpc_get_regname (src_reg));
+    powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg),
+        offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
+  } else {
+    ORC_ASM_CODE(compiler,"  lvsr %s, %s, %s\n",
+        powerpc_get_regname (vector_reg),
+        offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
+        powerpc_get_regname (src_reg));
+    powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg),
+        offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
+  }
+}
+
+void
+powerpc_store_align (OrcCompiler *compiler, int vector_reg, int offset_reg, 
int src_reg)
+{
+  if (IS_POWERPC_BE (compiler)) {
+    ORC_ASM_CODE(compiler,"  lvsr %s, %s, %s\n",
+        powerpc_get_regname (vector_reg),
+        offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
+        powerpc_get_regname (src_reg));
+    powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg),
+        offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
+  } else {
+    ORC_ASM_CODE(compiler,"  lvsl %s, %s, %s\n",
+        powerpc_get_regname (vector_reg),
+        offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
+        powerpc_get_regname (src_reg));
+    powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg),
+        offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
+  }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orcpowerpc.h 
new/orc-0.4.31/orc/orcpowerpc.h
--- old/orc-0.4.30/orc/orcpowerpc.h     2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/orc/orcpowerpc.h     2019-11-02 10:24:52.000000000 +0100
@@ -138,6 +138,9 @@
 void powerpc_emit_load_address (OrcCompiler* compiler, int regd, int rega, int 
imm);
 void powerpc_load_constant (OrcCompiler* p, int i, int reg);
 
+void powerpc_load_align (OrcCompiler *compiler, int vector_reg, int 
offset_reg, int src_reg);
+void powerpc_store_align (OrcCompiler *compiler, int vector_reg, int 
offset_reg, int src_reg);
+
 /* instructions */
 #define powerpc_emit_vand(p,a,b,c)         powerpc_emit_VX_2 (p, "vand", 
0x10000404, a, b, c)
 #define powerpc_emit_vandc(p,a,b,c)        powerpc_emit_VX_2 (p, "vandc", 
0x10000444, a, b, c)
@@ -159,8 +162,10 @@
 
 #define powerpc_emit_vmrghb(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrghb", 
0x1000000c, a, b, c)
 #define powerpc_emit_vmrghh(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrghh", 
0x1000004c, a, b, c)
+#define powerpc_emit_vmrghw(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrghw", 
0x1000008c, a, b, c)
 #define powerpc_emit_vmrglb(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrglb", 
0x1000010c, a, b, c)
 #define powerpc_emit_vmrglh(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrglh", 
0x1000014c, a, b, c)
+#define powerpc_emit_vmrglw(p,a,b,c)       powerpc_emit_VX_2 (p, "vmrglw", 
0x1000018c, a, b, c)
 
 #define powerpc_emit_vpkshss(p,a,b,c)      powerpc_emit_VX_2 (p, "vpkshss", 
0x1000018e, a, b, c)
 #define powerpc_emit_vpkshus(p,a,b,c)      powerpc_emit_VX_2 (p, "vpkshus", 
0x1000010e, a, b, c)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orcprogram-altivec.c 
new/orc-0.4.31/orc/orcprogram-altivec.c
--- old/orc-0.4.30/orc/orcprogram-altivec.c     2019-09-09 09:21:43.000000000 
+0200
+++ new/orc-0.4.31/orc/orcprogram-altivec.c     2019-11-02 10:24:52.000000000 
+0100
@@ -18,6 +18,8 @@
 static unsigned int orc_compiler_powerpc_get_default_flags (void);
 static void orc_compiler_powerpc_assemble (OrcCompiler *compiler);
 static const char* powerpc_get_flag_name (int shift);
+static int orc_powerpc_assemble_copy_check (OrcCompiler *compiler);
+static void orc_powerpc_assemble_copy (OrcCompiler *compiler);
 
 
 static void
@@ -199,8 +201,8 @@
     }
   }
 
-  orc_compiler_emit_invariants (compiler);
-
+  /* Load constants first, as they may be used by invariants */
+  ORC_ASM_CODE(compiler,"# load constants\n");
   for(i=0;i<compiler->n_constants;i++) {
     if (compiler->constants[i].is_long &&
         !compiler->constants[i].alloc_reg) {
@@ -212,6 +214,9 @@
       }
     }
   }
+
+  ORC_ASM_CODE(compiler,"# load invariants\n");
+  orc_compiler_emit_invariants (compiler);
 }
 
 static void
@@ -219,6 +224,7 @@
 {
   int i;
 
+  ORC_ASM_CODE(compiler,"# load inner constants\n");
   for(i=0;i<ORC_N_COMPILER_VARIABLES;i++){
     if (compiler->vars[i].name == NULL) continue;
     switch (compiler->vars[i].vartype) {
@@ -305,6 +311,11 @@
   int label_leave;
   int set_vscr = FALSE;
 
+  if (orc_powerpc_assemble_copy_check (compiler)) {
+    orc_powerpc_assemble_copy (compiler);
+    return;
+  }
+
   label_outer_loop_start = orc_compiler_label_new (compiler);
   label_loop_start = orc_compiler_label_new (compiler);
   label_leave = orc_compiler_label_new (compiler);
@@ -312,6 +323,8 @@
   {
     int i;
 
+    /* Emit invariants also to check for constants */
+    orc_compiler_emit_invariants (compiler);
     orc_powerpc_emit_loop (compiler, 0);
 
     compiler->codeptr = compiler->code;
@@ -486,3 +499,199 @@
   powerpc_do_fixups (compiler);
 }
 
+static
+int orc_powerpc_assemble_copy_check (OrcCompiler *compiler)
+{
+  if (compiler->program->n_insns == 1 &&
+      compiler->program->is_2d == FALSE &&
+      (strcmp (compiler->program->insns[0].opcode->name, "copyb") == 0 ||
+      strcmp (compiler->program->insns[0].opcode->name, "copyw") == 0 ||
+      strcmp (compiler->program->insns[0].opcode->name, "copyl") == 0 ||
+      strcmp (compiler->program->insns[0].opcode->name, "copyq") == 0) &&
+      (compiler->program->insns[0].flags &
+          (ORC_INSTRUCTION_FLAG_X2 | ORC_INSTRUCTION_FLAG_X4)) == 0 &&
+      compiler->program->n_param_vars == 0 &&
+      compiler->program->n_const_vars == 0) {
+    /* TODO: add param & const support if this turns out to be faster */
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+static
+void orc_powerpc_assemply_copy_loop (OrcCompiler *compiler, int size,
+    int shift, int next_label)
+{
+  const int src = POWERPC_R5;
+  const int dst = POWERPC_R6;
+  const int count = POWERPC_R7;
+  const int tmp = POWERPC_R0;
+  const int vtmp = POWERPC_V0;
+  const int vperm = POWERPC_V1;
+  int label_copy;
+
+  label_copy = orc_compiler_label_new (compiler);
+
+  ORC_ASM_CODE(compiler,"  cmplwi %s, %d\n",
+      powerpc_get_regname(count), size);
+  powerpc_emit(compiler, 0x28000000|(powerpc_regnum(count)<<16)|(size&0xffff));
+
+  ORC_ASM_CODE(compiler,"  blt %d%c\n", next_label,
+      (compiler->labels[next_label]!=NULL) ? 'b' : 'f');
+  powerpc_add_fixup (compiler, 0, compiler->codeptr, next_label);
+  powerpc_emit (compiler, 0x41800000);
+
+  powerpc_emit_D(compiler, "andi.", 0x70000000, tmp, src, size-1);
+  ORC_ASM_CODE(compiler,"  bgt %d%c\n", next_label,
+      (compiler->labels[next_label]!=NULL) ? 'b' : 'f');
+  powerpc_add_fixup (compiler, 0, compiler->codeptr, next_label);
+  powerpc_emit (compiler, 0x41810000);
+
+  powerpc_emit_D(compiler, "andi.", 0x70000000, tmp, dst, size-1);
+  ORC_ASM_CODE(compiler,"  bgt %d%c\n", next_label,
+      (compiler->labels[next_label]!=NULL) ? 'b' : 'f');
+  powerpc_add_fixup (compiler, 0, compiler->codeptr, next_label);
+  powerpc_emit (compiler, 0x41810000);
+
+  powerpc_emit_srawi (compiler, tmp, count, shift, 0);
+
+  ORC_ASM_CODE (compiler, "  mtctr %s\n", powerpc_get_regname(tmp));
+  powerpc_emit (compiler, 0x7c0903a6 | (powerpc_regnum (tmp)<<21));
+
+  powerpc_emit_label (compiler, label_copy);
+  if (size == 16) {
+    ORC_ASM_CODE(compiler,"  lvx %s, 0, %s\n",
+        powerpc_get_regname (vtmp),
+        powerpc_get_regname (src));
+    powerpc_emit_X (compiler, 0x7c0000ce, powerpc_regnum(vtmp),
+        0, powerpc_regnum(src));
+    ORC_ASM_CODE(compiler,"  stvx %s, 0, %s\n",
+        powerpc_get_regname (vtmp),
+        powerpc_get_regname (dst));
+    powerpc_emit_X (compiler, 0x7c0001ce,
+        powerpc_regnum(vtmp),
+        0, powerpc_regnum(dst));
+  } else {
+    switch (size) {
+      case 1:
+        ORC_ASM_CODE(compiler,"  lvebx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (src));
+        powerpc_emit_X (compiler, 0x7c00000e, powerpc_regnum(vtmp),
+            0, powerpc_regnum(src));
+        break;
+      case 2:
+        ORC_ASM_CODE(compiler,"  lvehx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (src));
+        powerpc_emit_X (compiler, 0x7c00004e, powerpc_regnum(vtmp),
+            0, powerpc_regnum(src));
+        break;
+      case 4:
+        ORC_ASM_CODE(compiler,"  lvewx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (src));
+        powerpc_emit_X (compiler, 0x7c00008e, powerpc_regnum(vtmp),
+            0, powerpc_regnum(src));
+        break;
+    }
+    powerpc_load_align (compiler, vperm, 0, src);
+    powerpc_emit_vperm (compiler, vtmp, vtmp, vtmp, vperm);
+    powerpc_store_align (compiler, vperm, 0, dst);
+    powerpc_emit_vperm (compiler, vtmp, vtmp, vtmp, vperm);
+    switch (size) {
+      case 1:
+        ORC_ASM_CODE(compiler,"  stvebx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (dst));
+        powerpc_emit_X (compiler, 0x7c00010e,
+            powerpc_regnum(vtmp),
+            0, powerpc_regnum(dst));
+        break;
+      case 2:
+        ORC_ASM_CODE(compiler,"  stvehx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (dst));
+        powerpc_emit_X (compiler, 0x7c00014e,
+            powerpc_regnum(vtmp),
+            0, powerpc_regnum(dst));
+        break;
+      case 4:
+       ORC_ASM_CODE(compiler,"  stvewx %s, 0, %s\n",
+            powerpc_get_regname (vtmp),
+            powerpc_get_regname (dst));
+        powerpc_emit_X (compiler, 0x7c00018e,
+            powerpc_regnum(vtmp),
+            0, powerpc_regnum(dst));
+        break;
+    }
+  }
+
+  powerpc_emit_addi (compiler, src, src, size);
+  powerpc_emit_addi (compiler, dst, dst, size);
+  powerpc_emit_addi (compiler, count, count, -size);
+  powerpc_emit_bne (compiler, label_copy);
+
+  powerpc_emit_label (compiler, next_label);
+}
+
+static
+void orc_powerpc_assemble_copy (OrcCompiler *compiler)
+{
+  const int src = POWERPC_R5;
+  const int dst = POWERPC_R6;
+  const int count = POWERPC_V7;
+  OrcInstruction *insn;
+  int shift = 0;
+  int label_word;
+  int label_halfword;
+  int label_byte;
+  int label_done;
+
+  insn = compiler->program->insns + 0;
+
+  if (strcmp (insn->opcode->name, "copyw") == 0) {
+    shift = 1;
+  } else if (strcmp (insn->opcode->name, "copyl") == 0) {
+    shift = 2;
+  } else if (strcmp (insn->opcode->name, "copyq") == 0) {
+    shift = 3;
+  }
+
+  label_word = orc_compiler_label_new (compiler);
+  label_halfword = orc_compiler_label_new (compiler);
+  label_byte = orc_compiler_label_new (compiler);
+  label_done = orc_compiler_label_new (compiler);
+
+  powerpc_emit_prologue (compiler);
+
+  powerpc_emit_load_address (compiler,
+      dst,
+      POWERPC_R3,
+      (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[insn->dest_args[0]]));
+  powerpc_emit_load_address (compiler,
+      src,
+      POWERPC_R3,
+      (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[insn->src_args[0]]));
+  powerpc_emit_lwz (compiler, count, POWERPC_R3,
+      (int)ORC_STRUCT_OFFSET(OrcExecutor, n));
+
+  powerpc_emit_addi (compiler, POWERPC_R0, 0, shift);
+  ORC_ASM_CODE(compiler, "  slw %s, %s, %s\n",
+      powerpc_get_regname(count),
+      powerpc_get_regname(count),
+      powerpc_get_regname(POWERPC_R0));
+  powerpc_emit (compiler, (31<<26) |
+      (powerpc_regnum (count)<<21) |
+      (powerpc_regnum (count)<<16) |
+      (powerpc_regnum (POWERPC_R0)<<11) | (24<<1));
+
+  orc_powerpc_assemply_copy_loop (compiler, 16, 4, label_word);
+  orc_powerpc_assemply_copy_loop (compiler, 4, 2, label_halfword);
+  orc_powerpc_assemply_copy_loop (compiler, 2, 1, label_byte);
+  orc_powerpc_assemply_copy_loop (compiler, 1, 0, label_done);
+
+  powerpc_emit_epilogue (compiler);
+  powerpc_do_fixups (compiler);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orcprogram-neon.c 
new/orc-0.4.31/orc/orcprogram-neon.c
--- old/orc-0.4.30/orc/orcprogram-neon.c        2019-09-09 09:21:43.000000000 
+0200
+++ new/orc-0.4.31/orc/orcprogram-neon.c        2019-11-02 10:24:52.000000000 
+0100
@@ -476,6 +476,7 @@
   int align_shift;
   int var_size_shift;
   int i;
+  int set_fpscr = FALSE;
   
   align_var = get_align_var (compiler);
   if (compiler->error) return;
@@ -487,6 +488,18 @@
 
   orc_neon_emit_prologue (compiler);
 
+  if (orc_program_has_float (compiler)) {
+    set_fpscr = TRUE;
+    ORC_ASM_CODE (compiler,"  vmrs %s, fpscr\n", orc_arm_reg_name 
(compiler->gp_tmpreg));
+    orc_arm_emit (compiler, 0xeef10a10 | ((compiler->gp_tmpreg&0xf)<<12));
+    ORC_ASM_CODE (compiler,"  push %s\n", orc_arm_reg_name 
(compiler->gp_tmpreg));
+    orc_arm_emit (compiler, 0xe52d0004 | ((compiler->gp_tmpreg&0xf)<<12));
+
+    orc_arm_emit_load_imm (compiler, compiler->gp_tmpreg, 1<<24);
+    ORC_ASM_CODE (compiler,"  vmsr fpscr, %s\n", orc_arm_reg_name 
(compiler->gp_tmpreg));
+    orc_arm_emit (compiler, 0xeee10a10 | ((compiler->gp_tmpreg&0xf)<<12));
+  }
+
   orc_neon_load_constants_outer (compiler);
 
   if (compiler->program->is_2d) {
@@ -697,6 +710,14 @@
 
   orc_neon_save_accumulators (compiler);
 
+  if (set_fpscr) {
+    ORC_ASM_CODE (compiler,"  pop %s\n", orc_arm_reg_name 
(compiler->gp_tmpreg));
+    orc_arm_emit (compiler, 0xe49d0004 | ((compiler->gp_tmpreg&0xf)<<12));
+
+    ORC_ASM_CODE (compiler,"  vmsr fpscr, %s\n", orc_arm_reg_name 
(compiler->gp_tmpreg));
+    orc_arm_emit (compiler, 0xeee10a10 | ((compiler->gp_tmpreg&0xf)<<12));
+  }
+
   orc_neon_emit_epilogue (compiler);
 
   orc_arm_emit_align (compiler, 4);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orcrules-altivec.c 
new/orc-0.4.31/orc/orcrules-altivec.c
--- old/orc-0.4.30/orc/orcrules-altivec.c       2019-09-09 09:21:43.000000000 
+0200
+++ new/orc-0.4.31/orc/orcrules-altivec.c       2019-11-02 10:24:52.000000000 
+0100
@@ -15,26 +15,6 @@
 
 /* rules */
 
-static void
-powerpc_load_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int 
src_reg)
-{
-  if (IS_POWERPC_BE (compiler)) {
-    ORC_ASM_CODE(compiler,"  lvsl %s, %s, %s\n",
-      powerpc_get_regname (vector_reg),
-      offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
-      powerpc_get_regname (src_reg));
-    powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg),
-      offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
-  } else {
-    ORC_ASM_CODE(compiler,"  lvsr %s, %s, %s\n",
-      powerpc_get_regname (vector_reg),
-      offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg),
-      powerpc_get_regname (src_reg));
-    powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg),
-      offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), 
powerpc_regnum(src_reg));
-  }
-}
-
 static inline int
 powerpc_select_value (OrcCompiler *compiler, int be_value, int le_value)
 {
@@ -322,19 +302,7 @@
   int perm = orc_compiler_get_temp_reg (compiler);
   int tmp = orc_compiler_get_temp_reg (compiler);
 
-  if (IS_POWERPC_BE (compiler)) {
-    ORC_ASM_CODE(compiler,"  lvsr %s, 0, %s\n",
-        powerpc_get_regname (perm),
-        powerpc_get_regname (dest->ptr_register));
-    powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(perm),
-        0, powerpc_regnum(dest->ptr_register));
-  } else {
-    ORC_ASM_CODE(compiler,"  lvsl %s, 0, %s\n",
-        powerpc_get_regname (perm),
-        powerpc_get_regname (dest->ptr_register));
-    powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(perm),
-        0, powerpc_regnum(dest->ptr_register));
-  }
+  powerpc_store_align (compiler, perm, 0, dest->ptr_register);
   powerpc_emit_vperm (compiler, tmp, src->alloc, src->alloc, perm);
 
   switch (size) {
@@ -370,8 +338,7 @@
           powerpc_regnum(tmp),
           0, powerpc_regnum(dest->ptr_register));
 
-      powerpc_emit_D (compiler, "addi", 0x38000000, compiler->gp_tmpreg,
-          0, 4);
+      powerpc_emit_addi (compiler, compiler->gp_tmpreg, 0, 4);
 
       ORC_ASM_CODE(compiler,"  stvewx %s, %s, %s\n",
           powerpc_get_regname (tmp),
@@ -397,6 +364,48 @@
   }
 }
 
+static void
+powerpc_denormalize_sp_full(OrcCompiler *p, int reg, int zero, int mask)
+{
+  int tmp = p->tmpreg;
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, reg, mask);
+  powerpc_emit_VX_2(p, "vcmpequw", 0x10000086, tmp, tmp, zero);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, tmp, reg, zero, tmp);
+  powerpc_emit_VX_2(p, "xvcpsgnsp", 0xf0000687, reg, reg, tmp);
+}
+
+static void
+powerpc_denormalize_sp_zero(OrcCompiler *p, int reg, int zero)
+{
+  int mask = powerpc_get_constant_full (p, 0x7f800000, 0x7f800000,
+      0x7f800000, 0x7f800000);
+  powerpc_denormalize_sp_full(p, reg, zero, mask);
+}
+
+static void
+powerpc_denormalize_sp(OrcCompiler *p, int reg)
+{
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_sp_zero(p, reg, zero);
+}
+
+static void
+powerpc_denormalize_dp_full(OrcCompiler *p, int reg, int zero, int mask)
+{
+  int tmp = p->tmpreg;
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, reg, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, zero);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, tmp, reg, zero, tmp);
+  powerpc_emit_VX_2(p, "xvcpsgndp", 0xf0000787, reg, reg, tmp);
+}
+
+static void
+powerpc_denormalize_dp_zero(OrcCompiler *p, int reg, int zero)
+{
+  int mask = powerpc_get_constant_full (p, 0x7ff00000, 0x00000000,
+      0x7ff00000, 0x00000000);
+  powerpc_denormalize_dp_full(p, reg, zero, mask);
+}
 
 
 #define RULE(name, opcode, code) \
@@ -409,6 +418,33 @@
   powerpc_emit_VX_2 (p, opcode, code , dest, src1, src2);\
 }
 
+#define RULE_DP(name, opcode, code) \
+static void \
+powerpc_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \
+{ \
+  int src1 = ORC_SRC_ARG (p, insn, 0); \
+  int src2 = ORC_SRC_ARG (p, insn, 1); \
+  int dest = ORC_DEST_ARG (p, insn, 0); \
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0); \
+  powerpc_denormalize_dp_zero (p, src1, zero); \
+  powerpc_denormalize_dp_zero (p, src2, zero); \
+  powerpc_emit_VX_2 (p, opcode, code , dest, src1, src2); \
+  powerpc_denormalize_dp_zero (p, dest, zero); \
+}
+
+#define RULE_DP_SRC(name, opcode, code) \
+static void \
+powerpc_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \
+{ \
+  int src1 = ORC_SRC_ARG (p, insn, 0); \
+  int src2 = ORC_SRC_ARG (p, insn, 1); \
+  int dest = ORC_DEST_ARG (p, insn, 0); \
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0); \
+  powerpc_denormalize_dp_zero (p, src1, zero); \
+  powerpc_denormalize_dp_zero (p, src2, zero); \
+  powerpc_emit_VX_2 (p, opcode, code , dest, src1, src2); \
+}
+
 #define RULE_SHIFT(name, opcode, code) \
 static void \
 powerpc_rule_ ## name (OrcCompiler *p, void *user, OrcInstruction *insn) \
@@ -503,13 +539,11 @@
 RULE(minf, "vminfp", 0x1000044a)
 RULE(cmpeqf, "vcmpeqfp", 0x100000c6)
 
-RULE(addd, "xvadddp", 0xf0000307)
-RULE(subd, "xvsubdp", 0xf0000347)
-RULE(muld, "xvmuldp", 0xf0000387)
-RULE(divd, "xvdivdp", 0xf00003c7)
-RULE(mind, "xvmindp", 0xf0000747)
-RULE(maxd, "xvmaxdp", 0xf0000707)
-RULE(cmpeqd, "xvcmpeqdp", 0xf000031f)
+RULE_DP(addd, "xvadddp", 0xf0000307)
+RULE_DP(subd, "xvsubdp", 0xf0000347)
+RULE_DP(muld, "xvmuldp", 0xf0000387)
+RULE_DP(divd, "xvdivdp", 0xf00003c7)
+RULE_DP_SRC(cmpeqd, "xvcmpeqdp", 0xf000031f)
 
 RULE(addq, "vaddudm", 0x100000c0)
 RULE(subq, "vsubudm", 0x100004c0)
@@ -541,13 +575,12 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int perm = powerpc_get_constant_full(p, 0x11011303, 0x15051707,
+      0x19091b0b, 0x1d0d1f0f);
 
-  if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmulesb (p, dest, src1, src2);
-    powerpc_emit_vsldoi (p, dest, dest, dest, 1);
-  } else {
-    powerpc_emit_vmulosb (p, dest, src1, src2);
-  }
+  powerpc_emit_vmulesb (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulosb (p, dest, src1, src2);
+  powerpc_emit_vperm(p, dest, dest, p->tmpreg, perm);
 }
 
 static void
@@ -556,15 +589,12 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int perm = powerpc_get_constant_full(p, 0x10001202, 0x14041606,
+      0x18081a0a, 0x1c0c1e0e);
 
-  if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmulesb (p, dest, src1, src2);
-  } else {
-    int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 8);
-
-    powerpc_emit_vmulosb (p, dest, src1, src2);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, src1, tmp);
-  }
+  powerpc_emit_vmulesb (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulosb (p, dest, src1, src2);
+  powerpc_emit_vperm(p, dest, dest, p->tmpreg, perm);
 }
 
 static void
@@ -573,15 +603,12 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int perm = powerpc_get_constant_full(p, 0x10001202, 0x14041606,
+      0x18081a0a, 0x1c0c1e0e);
 
-  if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmuleub (p, dest, src1, src2);
-  } else {
-    int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 8);
-
-    powerpc_emit_vmuloub (p, dest, src1, src2);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
-  }
+  powerpc_emit_vmuleub (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmuloub (p, dest, src1, src2);
+  powerpc_emit_vperm(p, dest, dest, p->tmpreg, perm);
 }
 
 static void
@@ -590,16 +617,12 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int perm = powerpc_get_constant_full(p, 0x10110001, 0x14150405,
+      0x18190809, 0x1c1d0c0d);
 
-  if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmulesh (p, dest, src1, src2);
-  } else {
-    int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 8);
-
-    powerpc_emit_vmulosh (p, dest, src1, src2);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
-  }
+  powerpc_emit_vmulesh (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulosh (p, dest, src1, src2);
+  powerpc_emit_vperm(p, dest, dest, p->tmpreg, perm);
 }
 
 static void
@@ -608,16 +631,12 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int perm = powerpc_get_constant_full(p, 0x10110001, 0x14150405,
+      0x18190809, 0x1c1d0c0d);
 
-  if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmuleuh (p, dest, src1, src2);
-  } else {
-    int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 8);
-
-    powerpc_emit_vmulouh (p, dest, src1, src2);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
-    powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
-  }
+  powerpc_emit_vmuleuh(p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulouh(p, dest, src1, src2);
+  powerpc_emit_vperm(p, dest, dest, p->tmpreg, perm);
 }
 
 static void
@@ -765,10 +784,12 @@
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
 
+  powerpc_emit_vmulesb (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulosb (p, dest, src1, src2);
   if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmulesb (p, dest, src1, src2);
+    powerpc_emit_vmrghh (p, dest, p->tmpreg, dest);
   } else {
-    powerpc_emit_vmulosb (p, dest, src1, src2);
+    powerpc_emit_vmrglh (p, dest, p->tmpreg, dest);
   }
 }
 
@@ -779,10 +800,12 @@
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
 
+  powerpc_emit_vmuleub (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmuloub (p, dest, src1, src2);
   if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmuleub (p, dest, src1, src2);
+    powerpc_emit_vmrghh (p, dest, p->tmpreg, dest);
   } else {
-    powerpc_emit_vmuloub (p, dest, src1, src2);
+    powerpc_emit_vmrglh (p, dest, p->tmpreg, dest);
   }
 }
 
@@ -793,10 +816,12 @@
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
 
+  powerpc_emit_vmulesh (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulosh (p, dest, src1, src2);
   if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmulesh (p, dest, src1, src2);
+    powerpc_emit_vmrghw (p, dest, p->tmpreg, dest);
   } else {
-    powerpc_emit_vmulosh (p, dest, src1, src2);
+    powerpc_emit_vmrglw (p, dest, p->tmpreg, dest);
   }
 }
 
@@ -807,10 +832,12 @@
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
 
+  powerpc_emit_vmuleuh (p, p->tmpreg, src1, src2);
+  powerpc_emit_vmulouh (p, dest, src1, src2);
   if (IS_POWERPC_BE (p)) {
-    powerpc_emit_vmuleuh (p, dest, src1, src2);
+    powerpc_emit_vmrghw (p, dest, p->tmpreg, dest);
   } else {
-    powerpc_emit_vmulouh (p, dest, src1, src2);
+    powerpc_emit_vmrglw (p, dest, p->tmpreg, dest);
   }
 }
 
@@ -848,17 +875,13 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
-
-  if (IS_POWERPC_BE (p)) {
-    int perm;
-
-    powerpc_emit_vmuleuw (p, dest, src1, src2);
-    perm = powerpc_get_constant_full (p, 0x04050607, 0x04050607,
-        0x0c0d0e0f, 0x0c0d0e0f);
-    powerpc_emit_vperm (p, dest, dest, dest, perm);
-  } else {
-    powerpc_emit_vmulouw (p, dest, src1, src2);
-  }
+  int tmp = orc_compiler_get_temp_reg(p);
+  int perm = powerpc_get_constant_full(p, 0x14151617, 0x04050607,
+      0x1c1d1e1f, 0x0c0d0e0f);
+
+  powerpc_emit_vmulouw (p, tmp, src1, src2);
+  powerpc_emit_vmuleuw (p, dest, src1, src2);
+  powerpc_emit_vperm (p, dest, tmp, dest, perm);
 }
 
 static void
@@ -1428,20 +1451,11 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
-  int y = orc_compiler_get_temp_reg (p);
-  int t = orc_compiler_get_temp_reg (p);
-  int c1;
-  int c0;
-
-  c1 = powerpc_get_constant (p, ORC_CONST_SPLAT_L, 0x3f800000); /* 1.0 */
-
-  powerpc_emit_VX_db (p, "vrefp", 0x1000010a, y, src2);
-
-  powerpc_emit_VA_acb (p, "vnmsubfp", 0x1000002f, t, y, c1, src2);
-  powerpc_emit_VA_acb (p, "vmaddfp", 0x1000002e, y, y, y, t);
-
-  c0 = powerpc_get_constant (p, ORC_CONST_SPLAT_L, 0x00000000); /* 0.0 */
-  powerpc_emit_VA_acb (p, "vmaddfp", 0x1000002e, dest, y, c0, src1);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_sp_zero (p, src1, zero);
+  powerpc_denormalize_sp_zero (p, src2, zero);
+  powerpc_emit_VX_2(p, "xvdivsp", 0xf00002c7, dest, src1, src2);
+  powerpc_denormalize_sp_zero (p, dest, zero);
 }
 
 static void
@@ -1521,8 +1535,10 @@
 {
   int src1 = ORC_SRC_ARG(p, insn, 0);
   int dest = ORC_DEST_ARG(p, insn, 0);
-
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_sp_zero (p, src1, zero);
   powerpc_emit_VX_db(p, "xvsqrtsp", 0xf000022f, dest, src1);
+  powerpc_denormalize_sp_zero (p, dest, zero);
 }
 
 static void
@@ -1530,18 +1546,65 @@
 {
   int src1 = ORC_SRC_ARG(p, insn, 0);
   int dest = ORC_DEST_ARG(p, insn, 0);
-
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_dp_zero (p, src1, zero);
   powerpc_emit_VX_db(p, "xvsqrtdp", 0xf000032f, dest, src1);
+  powerpc_denormalize_dp_zero (p, dest, zero);
 }
 
 static void
-powerpc_rule_cmpltd (OrcCompiler *p, void *user, OrcInstruction *insn)
+powerpc_rule_mind (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  int mask = powerpc_get_constant_full (p, 0x7ff80000, 0x00000000,
+      0x7ff80000, 0x00000000);
+  int tmp2 = orc_compiler_get_temp_reg(p);
+  int tmp = p->tmpreg;
+  powerpc_denormalize_dp_zero (p, src1, zero);
+  powerpc_denormalize_dp_zero (p, src2, zero);
+  powerpc_emit_VX_2(p, "xvmindp", 0xf0000747, tmp2, src2, src1);
+  // Handle QNaN
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, src1, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, mask);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, dest, tmp2, src1, tmp);
+}
 
-//  powerpc_emit_VXR (p, "vcmpgtfp", 0x100002c6, dest, src2, src1, FALSE);
+static void
+powerpc_rule_maxd (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  int src1 = ORC_SRC_ARG (p, insn, 0);
+  int src2 = ORC_SRC_ARG (p, insn, 1);
+  int dest = ORC_DEST_ARG (p, insn, 0);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  int mask = powerpc_get_constant_full (p, 0x7ff80000, 0x00000000,
+      0x7ff80000, 0x00000000);
+  int tmp2 = orc_compiler_get_temp_reg(p);
+  int tmp3 = orc_compiler_get_temp_reg(p);
+  int tmp = p->tmpreg;
+  powerpc_denormalize_dp_zero (p, src1, zero);
+  powerpc_denormalize_dp_zero (p, src2, zero);
+  powerpc_emit_VX_2(p, "xvmaxdp", 0xf0000707, tmp2, src2, src1);
+  // Handle QNaN
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, src2, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, mask);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, tmp3, tmp2, src2, tmp);
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, src1, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, mask);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, dest, tmp3, src1, tmp);
+}
+
+static void
+powerpc_rule_cmpltd (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+  int src1 = ORC_SRC_ARG (p, insn, 0);
+  int src2 = ORC_SRC_ARG (p, insn, 1);
+  int dest = ORC_DEST_ARG (p, insn, 0);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_dp_zero (p, src1, zero);
+  powerpc_denormalize_dp_zero (p, src2, zero);
   powerpc_emit_VX_2(p, "xvcmpgtdp", 0xf000035f, dest, src2, src1);
 }
 
@@ -1551,8 +1614,9 @@
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int src2 = ORC_SRC_ARG (p, insn, 1);
   int dest = ORC_DEST_ARG (p, insn, 0);
-
-//  powerpc_emit_VXR (p, "vcmpgefp", 0x100001c6, dest, src2, src1, FALSE);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  powerpc_denormalize_dp_zero (p, src1, zero);
+  powerpc_denormalize_dp_zero (p, src2, zero);
   powerpc_emit_VX_2(p, "xvcmpgedp", 0xf000039f, dest, src2, src1);
 }
 
@@ -1561,11 +1625,13 @@
 {
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
 
   if (IS_POWERPC_LE (p)) {
     powerpc_emit_vsldoi(p, src1, src1, src1, 4);
   }
   powerpc_emit_VX_db (p, "xvcvsxddp", 0xf00003e3, dest, src1);
+  powerpc_denormalize_dp_zero (p, dest, zero);
 }
 
 static void
@@ -1573,8 +1639,19 @@
 {
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int mask = powerpc_get_constant_full (p, 0xfff00000, 0x00000000,
+      0xfff00000, 0x00000000);
+  int nan = powerpc_get_constant_full (p, 0x7ff00000, 0x00000000,
+      0x7ff00000, 0x00000000);
+  int maxint = powerpc_get_constant_full (p, 0x7fffffff, 0x7fffffff,
+      0x7fffffff, 0x7fffffff);
+  int tmp = p->tmpreg;
 
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, src1, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, nan);
   powerpc_emit_VX_db (p, "xvcvdpsxws", 0xf0000363, dest, src1);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, dest, dest, maxint, tmp);
+
   if (IS_POWERPC_LE (p)) {
     int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 32);
     powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
@@ -1586,11 +1663,23 @@
 {
   int src1 = ORC_SRC_ARG (p, insn, 0);
   int dest = ORC_DEST_ARG (p, insn, 0);
+  int tmp2 = orc_compiler_get_temp_reg(p);
+  int zero = powerpc_get_constant (p, ORC_CONST_ZERO, 0);
+  int mask = powerpc_get_constant_full (p, 0x7f800000, 0x00000000,
+      0x7f800000, 0x00000000);
+  int tmp = p->tmpreg;
 
   if (IS_POWERPC_LE (p)) {
-    powerpc_emit_vsldoi(p, src1, src1, src1, 4);
+    powerpc_emit_vsldoi(p, tmp2, src1, src1, 4);
+  } else {
+    powerpc_emit_vor(p, tmp2, src1, src1);
   }
-  powerpc_emit_VX_db (p, "xvcvspdp", 0xf0000727, dest, src1);
+  powerpc_emit_VX_db (p, "xvcvspdp", 0xf0000727, dest, tmp2);
+
+  powerpc_emit_VX_2(p, "xxland", 0xf0000417, tmp, tmp2, mask);
+  powerpc_emit_VX_2(p, "vcmpequd", 0x100000c7, tmp, tmp, zero);
+  powerpc_emit_VA(p, "xxsel", 0xf000003f, tmp, dest, zero, tmp);
+  powerpc_emit_VX_2(p, "xvcpsgndp", 0xf0000787, dest, dest, tmp);
 }
 
 static void
@@ -1604,6 +1693,7 @@
     int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 32);
     powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
   }
+  powerpc_denormalize_sp(p, dest);
 }
 
 
@@ -1757,7 +1847,6 @@
   REG(cmplef);
   REG(cmpltf);
   REG(mulf);
-  REG(divf);
   REG(convfl);
   REG(convlf);
 
@@ -1789,6 +1878,7 @@
 
   rule_set = orc_rule_set_new(orc_opcode_set_get("sys"), target, 
ORC_TARGET_POWERPC_VSX);
 
+  REG(divf);
   REG(sqrtf);
   REG(addd);
   REG(subd);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc/orctarget.h 
new/orc-0.4.31/orc/orctarget.h
--- old/orc-0.4.30/orc/orctarget.h      2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/orc/orctarget.h      2019-11-02 10:24:52.000000000 +0100
@@ -19,7 +19,7 @@
   ORC_TARGET_FAST_DENORMAL = (1<<31)
 };
 
-enum {
+typedef enum {
   ORC_TARGET_POWERPC_64BIT = (1<<0),
   ORC_TARGET_POWERPC_LE = (1<<1),
   ORC_TARGET_POWERPC_ALTIVEC = (1<<2),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/orc-test/orctest.c 
new/orc-0.4.31/orc-test/orctest.c
--- old/orc-0.4.30/orc-test/orctest.c   2019-09-09 09:21:43.000000000 +0200
+++ new/orc-0.4.31/orc-test/orctest.c   2019-11-02 10:24:52.000000000 +0100
@@ -523,14 +523,14 @@
       if (isnan(*(float *)ptr1) && isnan(*(float *)ptr2)) return TRUE;
       if (*(float *)ptr1 == *(float *)ptr2) return TRUE;
       if ((*(float *)ptr1 < 0.0) == (*(float *)ptr2 < 0.0) &&
-          abs((orc_int32)(*(orc_uint32 *)ptr1 - *(orc_uint32 *)ptr2) <= 2))
+          abs((orc_int32)(*(orc_uint32 *)ptr1 - *(orc_uint32 *)ptr2)) <= 2)
         return TRUE;
       return FALSE;
     case 8:
       if (isnan(*(double *)ptr1) && isnan(*(double *)ptr2)) return TRUE;
       if (*(double *)ptr1 == *(double *)ptr2) return TRUE;
       if ((*(double *)ptr1 < 0.0) == (*(double *)ptr2 < 0.0) &&
-          llabs((orc_int64)(*(orc_uint64 *)ptr1 - *(orc_uint64 *)ptr2) <= 2))
+          llabs((orc_int64)(*(orc_uint64 *)ptr1 - *(orc_uint64 *)ptr2)) <= 2)
         return TRUE;
       return FALSE;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/testsuite/exec_parse.c 
new/orc-0.4.31/testsuite/exec_parse.c
--- old/orc-0.4.30/testsuite/exec_parse.c       2019-09-09 09:21:43.000000000 
+0200
+++ new/orc-0.4.31/testsuite/exec_parse.c       2019-11-02 10:24:52.000000000 
+0100
@@ -20,6 +20,7 @@
   char *code;
   int n;
   int i;
+  int ret;
   OrcProgram **programs;
   const char *filename = NULL;
 
@@ -45,7 +46,11 @@
 
   for(i=0;i<n;i++){
     if (verbose) printf("%s\n", programs[i]->name);
-    orc_test_compare_output_full (programs[i], 0);
+    ret = orc_test_compare_output_full (programs[i], 0);
+    if (!ret) {
+      printf("failed %s\n", programs[i]->name);
+      error = TRUE;
+    }
     orc_program_free (programs[i]);
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orc-0.4.30/testsuite/memcpy_speed.c 
new/orc-0.4.31/testsuite/memcpy_speed.c
--- old/orc-0.4.30/testsuite/memcpy_speed.c     2019-09-09 09:21:43.000000000 
+0200
+++ new/orc-0.4.31/testsuite/memcpy_speed.c     2019-11-02 10:24:52.000000000 
+0100
@@ -102,7 +102,7 @@
     max = 140;
   }
 
-  for(i=0;i<max;i++){
+  for(i=0;i<max;i+=2){
     double x = i*0.1 + 6.0;
     int size = pow(2.0, x);
 


Reply via email to