Mark Wielaard de58b8
diff --git a/VEX/priv/guest_s390_defs.h b/VEX/priv/guest_s390_defs.h
Mark Wielaard 3e351e
index 9f93cff19..905429015 100644
Mark Wielaard de58b8
--- a/VEX/priv/guest_s390_defs.h
Mark Wielaard de58b8
+++ b/VEX/priv/guest_s390_defs.h
Mark Wielaard 3e351e
@@ -8,7 +8,7 @@
Mark Wielaard 3e351e
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 3e351e
    framework.
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
-   Copyright IBM Corp. 2010-2017
Mark Wielaard 3e351e
+   Copyright IBM Corp. 2010-2020
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
    This program is free software; you can redistribute it and/or
Mark Wielaard 3e351e
    modify it under the terms of the GNU General Public License as
Mark Wielaard de58b8
@@ -263,26 +263,27 @@ extern ULong last_execute_target;
Mark Wielaard de58b8
    before  S390_VEC_OP_LAST. */
Mark Wielaard de58b8
 typedef enum {
Mark Wielaard de58b8
    S390_VEC_OP_INVALID = 0,
Mark Wielaard de58b8
-   S390_VEC_OP_VPKS = 1,
Mark Wielaard de58b8
-   S390_VEC_OP_VPKLS = 2,
Mark Wielaard de58b8
-   S390_VEC_OP_VFAE = 3,
Mark Wielaard de58b8
-   S390_VEC_OP_VFEE = 4,
Mark Wielaard de58b8
-   S390_VEC_OP_VFENE = 5,
Mark Wielaard de58b8
-   S390_VEC_OP_VISTR = 6,
Mark Wielaard de58b8
-   S390_VEC_OP_VSTRC = 7,
Mark Wielaard de58b8
-   S390_VEC_OP_VCEQ = 8,
Mark Wielaard de58b8
-   S390_VEC_OP_VTM = 9,
Mark Wielaard de58b8
-   S390_VEC_OP_VGFM = 10,
Mark Wielaard de58b8
-   S390_VEC_OP_VGFMA = 11,
Mark Wielaard de58b8
-   S390_VEC_OP_VMAH = 12,
Mark Wielaard de58b8
-   S390_VEC_OP_VMALH = 13,
Mark Wielaard de58b8
-   S390_VEC_OP_VCH = 14,
Mark Wielaard de58b8
-   S390_VEC_OP_VCHL = 15,
Mark Wielaard de58b8
-   S390_VEC_OP_VFCE = 16,
Mark Wielaard de58b8
-   S390_VEC_OP_VFCH = 17,
Mark Wielaard de58b8
-   S390_VEC_OP_VFCHE = 18,
Mark Wielaard de58b8
-   S390_VEC_OP_VFTCI = 19,
Mark Wielaard de58b8
-   S390_VEC_OP_LAST = 20 // supposed to be the last element in enum
Mark Wielaard de58b8
+   S390_VEC_OP_VPKS,
Mark Wielaard de58b8
+   S390_VEC_OP_VPKLS,
Mark Wielaard de58b8
+   S390_VEC_OP_VFAE,
Mark Wielaard de58b8
+   S390_VEC_OP_VFEE,
Mark Wielaard de58b8
+   S390_VEC_OP_VFENE,
Mark Wielaard de58b8
+   S390_VEC_OP_VISTR,
Mark Wielaard de58b8
+   S390_VEC_OP_VSTRC,
Mark Wielaard de58b8
+   S390_VEC_OP_VCEQ,
Mark Wielaard de58b8
+   S390_VEC_OP_VTM,
Mark Wielaard de58b8
+   S390_VEC_OP_VGFM,
Mark Wielaard de58b8
+   S390_VEC_OP_VGFMA,
Mark Wielaard de58b8
+   S390_VEC_OP_VMAH,
Mark Wielaard de58b8
+   S390_VEC_OP_VMALH,
Mark Wielaard de58b8
+   S390_VEC_OP_VCH,
Mark Wielaard de58b8
+   S390_VEC_OP_VCHL,
Mark Wielaard de58b8
+   S390_VEC_OP_VFTCI,
Mark Wielaard de58b8
+   S390_VEC_OP_VFMIN,
Mark Wielaard de58b8
+   S390_VEC_OP_VFMAX,
Mark Wielaard de58b8
+   S390_VEC_OP_VBPERM,
Mark Wielaard de58b8
+   S390_VEC_OP_VMSL,
Mark Wielaard de58b8
+   S390_VEC_OP_LAST             // supposed to be the last element in enum
Mark Wielaard de58b8
 } s390x_vec_op_t;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /* Arguments of s390x_dirtyhelper_vec_op(...) which are packed into one
Mark Wielaard de58b8
diff --git a/VEX/priv/guest_s390_helpers.c b/VEX/priv/guest_s390_helpers.c
Mark Wielaard 3e351e
index a470d9f8d..b71b621ae 100644
Mark Wielaard de58b8
--- a/VEX/priv/guest_s390_helpers.c
Mark Wielaard de58b8
+++ b/VEX/priv/guest_s390_helpers.c
Mark Wielaard 3e351e
@@ -8,7 +8,7 @@
Mark Wielaard 3e351e
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 3e351e
    framework.
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
-   Copyright IBM Corp. 2010-2017
Mark Wielaard 3e351e
+   Copyright IBM Corp. 2010-2020
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
    This program is free software; you can redistribute it and/or
Mark Wielaard 3e351e
    modify it under the terms of the GNU General Public License as
Mark Wielaard de58b8
@@ -314,20 +314,11 @@ ULong s390x_dirtyhelper_STCKE(ULong *addr) {return 3;}
Mark Wielaard de58b8
 /*--- Dirty helper for Store Facility instruction          ---*/
Mark Wielaard de58b8
 /*------------------------------------------------------------*/
Mark Wielaard de58b8
 #if defined(VGA_s390x)
Mark Wielaard de58b8
-static void
Mark Wielaard de58b8
-s390_set_facility_bit(ULong *addr, UInt bitno, UInt value)
Mark Wielaard de58b8
-{
Mark Wielaard de58b8
-   addr  += bitno / 64;
Mark Wielaard de58b8
-   bitno  = bitno % 64;
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   ULong mask = 1;
Mark Wielaard de58b8
-   mask <<= (63 - bitno);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (value == 1) {
Mark Wielaard de58b8
-      *addr |= mask;   // set
Mark Wielaard de58b8
-   } else {
Mark Wielaard de58b8
-      *addr &= ~mask;  // clear
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+static ULong
Mark Wielaard de58b8
+s390_stfle_range(UInt lo, UInt hi)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   return ((1UL << (hi + 1 - lo)) - 1) << (63 - (hi % 64));
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 ULong
Mark Wielaard 3e351e
@@ -336,6 +327,77 @@ s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr)
Mark Wielaard de58b8
    ULong hoststfle[S390_NUM_FACILITY_DW], cc, num_dw, i;
Mark Wielaard de58b8
    register ULong reg0 asm("0") = guest_state->guest_r0 & 0xF;  /* r0[56:63] */
Mark Wielaard de58b8
 
Mark Wielaard 3e351e
+   /* Restrict to facilities that we know about and that we assume to be
Mark Wielaard 3e351e
+      compatible with Valgrind.  Of course, in this way we may reject features
Mark Wielaard 3e351e
+      that Valgrind is not really involved in (and thus would be compatible
Mark Wielaard 3e351e
+      with), but quering for such features doesn't seem like a typical use
Mark Wielaard 3e351e
+      case. */
Mark Wielaard de58b8
+   ULong accepted_facility[S390_NUM_FACILITY_DW] = {
Mark Wielaard de58b8
+      /* ===  0 .. 63  === */
Mark Wielaard de58b8
+      (s390_stfle_range(0, 16)
Mark Wielaard de58b8
+       /* 17: message-security-assist, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(18, 19)
Mark Wielaard de58b8
+       /* 20: HFP-multiply-and-add/subtract, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(21, 22)
Mark Wielaard de58b8
+       /* 23: HFP-unnormalized-extension, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(24, 25)
Mark Wielaard de58b8
+       /* 26: parsing-enhancement, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(27, 28)
Mark Wielaard de58b8
+       /* 29: unassigned */
Mark Wielaard de58b8
+       | s390_stfle_range(30, 30)
Mark Wielaard de58b8
+       /* 31: extract-CPU-time, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(32, 41)
Mark Wielaard de58b8
+       /* 42-43: DFP, not fully supported */
Mark Wielaard de58b8
+       /* 44: PFPO, not fully supported */
Mark Wielaard de58b8
+       | s390_stfle_range(45, 47)
Mark Wielaard de58b8
+       /* 48: DFP zoned-conversion, not supported */
Mark Wielaard de58b8
+       /* 49: includes PPA, not supported */
Mark Wielaard de58b8
+       /* 50: constrained transactional-execution, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(51, 55)
Mark Wielaard de58b8
+       /* 56: unassigned */
Mark Wielaard de58b8
+       /* 57: MSA5, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(58, 60)
Mark Wielaard de58b8
+       /* 61: miscellaneous-instruction 3, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(62, 63)),
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+      /* ===  64 .. 127  === */
Mark Wielaard de58b8
+      (s390_stfle_range(64, 72)
Mark Wielaard de58b8
+       /* 73: transactional-execution, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(74, 75)
Mark Wielaard de58b8
+       /* 76: MSA3, not supported */
Mark Wielaard de58b8
+       /* 77: MSA4, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(78, 78)
Mark Wielaard de58b8
+       /* 80: DFP packed-conversion, not supported */
Mark Wielaard de58b8
+       /* 81: PPA-in-order, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(82, 82)
Mark Wielaard de58b8
+       /* 83-127: unassigned */ ),
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+      /* ===  128 .. 191  === */
Mark Wielaard de58b8
+      (s390_stfle_range(128, 131)
Mark Wielaard de58b8
+       /* 132: unassigned */
Mark Wielaard de58b8
+       /* 133: guarded-storage, not supported */
Mark Wielaard de58b8
+       /* 134: vector packed decimal, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(135, 135)
Mark Wielaard de58b8
+       /* 136: unassigned */
Mark Wielaard de58b8
+       /* 137: unassigned */
Mark Wielaard de58b8
+       | s390_stfle_range(138, 142)
Mark Wielaard de58b8
+       /* 143: unassigned */
Mark Wielaard de58b8
+       | s390_stfle_range(144, 145)
Mark Wielaard de58b8
+       /* 146: MSA8, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(147, 147)
Mark Wielaard de58b8
+       /* 148: vector-enhancements 2, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(149, 149)
Mark Wielaard de58b8
+       /* 150: unassigned */
Mark Wielaard de58b8
+       /* 151: DEFLATE-conversion, not supported */
Mark Wielaard de58b8
+       /* 153: unassigned */
Mark Wielaard de58b8
+       /* 154: unassigned */
Mark Wielaard de58b8
+       /* 155: MSA9, not supported */
Mark Wielaard de58b8
+       | s390_stfle_range(156, 156)
Mark Wielaard de58b8
+       /* 157-167: unassigned */
Mark Wielaard de58b8
+       | s390_stfle_range(168, 168)
Mark Wielaard de58b8
+       /* 168-191: unassigned */ ),
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+
Mark Wielaard de58b8
    /* We cannot store more than S390_NUM_FACILITY_DW
Mark Wielaard de58b8
       (and it makes not much sense to do so anyhow) */
Mark Wielaard de58b8
    if (reg0 > S390_NUM_FACILITY_DW - 1)
Mark Wielaard 3e351e
@@ -351,35 +413,9 @@ s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr)
Mark Wielaard de58b8
    /* Update guest register 0  with what STFLE set r0 to */
Mark Wielaard de58b8
    guest_state->guest_r0 = reg0;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   /* Set default: VM facilities = host facilities */
Mark Wielaard de58b8
+   /* VM facilities = host facilities, filtered by acceptance */
Mark Wielaard de58b8
    for (i = 0; i < num_dw; ++i)
Mark Wielaard de58b8
-      addr[i] = hoststfle[i];
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   /* Now adjust the VM facilities according to what the VM supports */
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_LDISP,  1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_EIMM,   1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_ETF2,   1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_ETF3,   1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_GIE,    1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_EXEXT,  1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_HIGHW,  1);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_LSC2,   1);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_HFPMAS, 0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_HFPUNX, 0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_XCPUT,  0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_MSA,    0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_PENH,   0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_DFP,    0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_PFPO,   0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_DFPZC,  0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_MISC,   0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_CTREXE, 0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_TREXE,  0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_MSA4,   0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_VXE,    0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_VXE2,   0);
Mark Wielaard de58b8
-   s390_set_facility_bit(addr, S390_FAC_DFLT,   0);
Mark Wielaard de58b8
+      addr[i] = hoststfle[i] & accepted_facility[i];
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return cc;
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -2500,25 +2536,26 @@ s390x_dirtyhelper_vec_op(VexGuestS390XState *guest_state,
Mark Wielaard de58b8
    vassert(d->op > S390_VEC_OP_INVALID && d->op < S390_VEC_OP_LAST);
Mark Wielaard de58b8
    static const UChar opcodes[][2] = {
Mark Wielaard de58b8
       {0x00, 0x00}, /* invalid */
Mark Wielaard de58b8
-      {0xe7, 0x97}, /* VPKS */
Mark Wielaard de58b8
-      {0xe7, 0x95}, /* VPKLS */
Mark Wielaard de58b8
-      {0xe7, 0x82}, /* VFAE */
Mark Wielaard de58b8
-      {0xe7, 0x80}, /* VFEE */
Mark Wielaard de58b8
-      {0xe7, 0x81}, /* VFENE */
Mark Wielaard de58b8
-      {0xe7, 0x5c}, /* VISTR */
Mark Wielaard de58b8
-      {0xe7, 0x8a}, /* VSTRC */
Mark Wielaard de58b8
-      {0xe7, 0xf8}, /* VCEQ */
Mark Wielaard de58b8
-      {0xe7, 0xd8}, /* VTM */
Mark Wielaard de58b8
-      {0xe7, 0xb4}, /* VGFM */
Mark Wielaard de58b8
-      {0xe7, 0xbc}, /* VGFMA */
Mark Wielaard de58b8
-      {0xe7, 0xab}, /* VMAH */
Mark Wielaard de58b8
-      {0xe7, 0xa9}, /* VMALH */
Mark Wielaard de58b8
-      {0xe7, 0xfb}, /* VCH */
Mark Wielaard de58b8
-      {0xe7, 0xf9}, /* VCHL */
Mark Wielaard de58b8
-      {0xe7, 0xe8}, /* VFCE */
Mark Wielaard de58b8
-      {0xe7, 0xeb}, /* VFCH */
Mark Wielaard de58b8
-      {0xe7, 0xea}, /* VFCHE */
Mark Wielaard de58b8
-      {0xe7, 0x4a}  /* VFTCI */
Mark Wielaard de58b8
+      [S390_VEC_OP_VPKS]  = {0xe7, 0x97},
Mark Wielaard de58b8
+      [S390_VEC_OP_VPKLS] = {0xe7, 0x95},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFAE]  = {0xe7, 0x82},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFEE]  = {0xe7, 0x80},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFENE] = {0xe7, 0x81},
Mark Wielaard de58b8
+      [S390_VEC_OP_VISTR] = {0xe7, 0x5c},
Mark Wielaard de58b8
+      [S390_VEC_OP_VSTRC] = {0xe7, 0x8a},
Mark Wielaard de58b8
+      [S390_VEC_OP_VCEQ]  = {0xe7, 0xf8},
Mark Wielaard de58b8
+      [S390_VEC_OP_VTM]   = {0xe7, 0xd8},
Mark Wielaard de58b8
+      [S390_VEC_OP_VGFM]  = {0xe7, 0xb4},
Mark Wielaard de58b8
+      [S390_VEC_OP_VGFMA] = {0xe7, 0xbc},
Mark Wielaard de58b8
+      [S390_VEC_OP_VMAH]  = {0xe7, 0xab},
Mark Wielaard de58b8
+      [S390_VEC_OP_VMALH] = {0xe7, 0xa9},
Mark Wielaard de58b8
+      [S390_VEC_OP_VCH]   = {0xe7, 0xfb},
Mark Wielaard de58b8
+      [S390_VEC_OP_VCHL]  = {0xe7, 0xf9},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFTCI] = {0xe7, 0x4a},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFMIN] = {0xe7, 0xee},
Mark Wielaard de58b8
+      [S390_VEC_OP_VFMAX] = {0xe7, 0xef},
Mark Wielaard de58b8
+      [S390_VEC_OP_VBPERM]= {0xe7, 0x85},
Mark Wielaard de58b8
+      [S390_VEC_OP_VMSL]  = {0xe7, 0xb8},
Mark Wielaard de58b8
    };
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    union {
Mark Wielaard 3e351e
@@ -2612,6 +2649,7 @@ s390x_dirtyhelper_vec_op(VexGuestS390XState *guest_state,
Mark Wielaard de58b8
    case S390_VEC_OP_VGFMA:
Mark Wielaard de58b8
    case S390_VEC_OP_VMAH:
Mark Wielaard de58b8
    case S390_VEC_OP_VMALH:
Mark Wielaard de58b8
+   case S390_VEC_OP_VMSL:
Mark Wielaard de58b8
       the_insn.VRRd.v1 = 1;
Mark Wielaard de58b8
       the_insn.VRRd.v2 = 2;
Mark Wielaard de58b8
       the_insn.VRRd.v3 = 3;
Mark Wielaard 3e351e
@@ -2621,9 +2659,9 @@ s390x_dirtyhelper_vec_op(VexGuestS390XState *guest_state,
Mark Wielaard de58b8
       the_insn.VRRd.m6 = d->m5;
Mark Wielaard de58b8
       break;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   case S390_VEC_OP_VFCE:
Mark Wielaard de58b8
-   case S390_VEC_OP_VFCH:
Mark Wielaard de58b8
-   case S390_VEC_OP_VFCHE:
Mark Wielaard de58b8
+   case S390_VEC_OP_VFMIN:
Mark Wielaard de58b8
+   case S390_VEC_OP_VFMAX:
Mark Wielaard de58b8
+   case S390_VEC_OP_VBPERM:
Mark Wielaard de58b8
       the_insn.VRRc.v1 = 1;
Mark Wielaard de58b8
       the_insn.VRRc.v2 = 2;
Mark Wielaard de58b8
       the_insn.VRRc.v3 = 3;
Mark Wielaard de58b8
diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c
Mark Wielaard 3e351e
index c27a8d3fe..5f2c5ce98 100644
Mark Wielaard de58b8
--- a/VEX/priv/guest_s390_toIR.c
Mark Wielaard de58b8
+++ b/VEX/priv/guest_s390_toIR.c
Mark Wielaard de58b8
@@ -8,7 +8,7 @@
Mark Wielaard de58b8
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard de58b8
    framework.
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   Copyright IBM Corp. 2010-2017
Mark Wielaard de58b8
+   Copyright IBM Corp. 2010-2020
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    This program is free software; you can redistribute it and/or
Mark Wielaard de58b8
    modify it under the terms of the GNU General Public License as
Mark Wielaard de58b8
@@ -248,6 +248,13 @@ typedef enum {
Mark Wielaard de58b8
 #define VRS_d2(insn) (((insn) >> 32) & 0xfff)
Mark Wielaard de58b8
 #define VRS_m4(insn) (((insn) >> 28) & 0xf)
Mark Wielaard de58b8
 #define VRS_rxb(insn) (((insn) >> 24) & 0xf)
Mark Wielaard de58b8
+#define VRSd_v1(insn) (((insn) >> 28) & 0xf)
Mark Wielaard de58b8
+#define VRSd_r3(insn) (((insn) >> 48) & 0xf)
Mark Wielaard de58b8
+#define VSI_i3(insn) (((insn) >> 48) & 0xff)
Mark Wielaard de58b8
+#define VSI_b2(insn) (((insn) >> 44) & 0xf)
Mark Wielaard de58b8
+#define VSI_d2(insn) (((insn) >> 32) & 0xfff)
Mark Wielaard de58b8
+#define VSI_v1(insn) (((insn) >> 28) & 0xf)
Mark Wielaard de58b8
+#define VSI_rxb(insn) (((insn) >> 24) & 0xf)
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /*------------------------------------------------------------*/
Mark Wielaard de58b8
@@ -1934,6 +1941,26 @@ s390_vr_get_type(const UChar m)
Mark Wielaard de58b8
    return results[m];
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+/* Determine IRType from instruction's floating-point format field */
Mark Wielaard de58b8
+static IRType
Mark Wielaard de58b8
+s390_vr_get_ftype(const UChar m)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   static const IRType results[] = {Ity_F32, Ity_F64, Ity_F128};
Mark Wielaard de58b8
+   if (m >= 2 && m <= 4)
Mark Wielaard de58b8
+      return results[m - 2];
Mark Wielaard de58b8
+   return Ity_INVALID;
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+/* Determine number of elements from instruction's floating-point format
Mark Wielaard de58b8
+   field */
Mark Wielaard de58b8
+static UChar
Mark Wielaard de58b8
+s390_vr_get_n_elem(const UChar m)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   if (m >= 2 && m <= 4)
Mark Wielaard de58b8
+      return 1 << (4 - m);
Mark Wielaard de58b8
+   return 0;
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 /* Determine if Condition Code Set (CS) flag is set in m field */
Mark Wielaard de58b8
 #define s390_vr_is_cs_set(m) (((m) & 0x1) != 0)
Mark Wielaard de58b8
 
Mark Wielaard de58b8
@@ -2188,12 +2215,15 @@ s390_vr_offset_by_index(UInt archreg,IRType type, UChar index)
Mark Wielaard de58b8
          goto invalidIndex;
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
       return vr_offset(archreg) + sizeof(ULong) * index;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
    case Ity_V128:
Mark Wielaard de58b8
+   case Ity_F128:
Mark Wielaard de58b8
       if(index == 0) {
Mark Wielaard de58b8
          return vr_qw_offset(archreg);
Mark Wielaard de58b8
       } else {
Mark Wielaard de58b8
          goto invalidIndex;
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
+
Mark Wielaard de58b8
    default:
Mark Wielaard de58b8
       vpanic("s390_vr_offset_by_index: unknown type");
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
@@ -2211,7 +2241,14 @@ put_vr(UInt archreg, IRType type, UChar index, IRExpr *expr)
Mark Wielaard de58b8
    UInt offset = s390_vr_offset_by_index(archreg, type, index);
Mark Wielaard de58b8
    vassert(typeOfIRExpr(irsb->tyenv, expr) == type);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   stmt(IRStmt_Put(offset, expr));
Mark Wielaard de58b8
+   if (type == Ity_F128) {
Mark Wielaard de58b8
+      IRTemp val = newTemp(Ity_F128);
Mark Wielaard de58b8
+      assign(val, expr);
Mark Wielaard de58b8
+      stmt(IRStmt_Put(offset, unop(Iop_F128HItoF64, mkexpr(val))));
Mark Wielaard de58b8
+      stmt(IRStmt_Put(offset + 8, unop(Iop_F128LOtoF64, mkexpr(val))));
Mark Wielaard de58b8
+   } else {
Mark Wielaard de58b8
+      stmt(IRStmt_Put(offset, expr));
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /* Read type sized part specified by index of a vr register. */
Mark Wielaard de58b8
@@ -2219,6 +2256,11 @@ static IRExpr *
Mark Wielaard de58b8
 get_vr(UInt archreg, IRType type, UChar index)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    UInt offset = s390_vr_offset_by_index(archreg, type, index);
Mark Wielaard de58b8
+   if (type == Ity_F128) {
Mark Wielaard de58b8
+      return binop(Iop_F64HLtoF128,
Mark Wielaard de58b8
+                   IRExpr_Get(offset, Ity_F64),
Mark Wielaard de58b8
+                   IRExpr_Get(offset + 8, Ity_F64));
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
    return IRExpr_Get(offset, type);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
@@ -2294,11 +2336,11 @@ s390_getCountToBlockBoundary(IRTemp op2addr, UChar m)
Mark Wielaard de58b8
    return mkexpr(output);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-/* Load bytes into v1.
Mark Wielaard de58b8
-   maxIndex specifies max index to load and must be Ity_I32.
Mark Wielaard de58b8
-   If maxIndex >= 15, all 16 bytes are loaded.
Mark Wielaard de58b8
-   All bytes after maxIndex are zeroed. */
Mark Wielaard de58b8
-static void s390_vr_loadWithLength(UChar v1, IRTemp addr, IRExpr *maxIndex)
Mark Wielaard de58b8
+/* Starting from addr, load at most maxIndex + 1 bytes into v1.  Fill the
Mark Wielaard de58b8
+   leftmost or rightmost bytes of v1, depending on whether `rightmost' is set.
Mark Wielaard de58b8
+   If maxIndex >= 15, load all 16 bytes; otherwise clear the remaining bytes. */
Mark Wielaard de58b8
+static void
Mark Wielaard de58b8
+s390_vr_loadWithLength(UChar v1, IRTemp addr, IRExpr *maxIndex, Bool rightmost)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    IRTemp maxIdx = newTemp(Ity_I32);
Mark Wielaard de58b8
    IRTemp cappedMax = newTemp(Ity_I64);
Mark Wielaard de58b8
@@ -2311,8 +2353,8 @@ static void s390_vr_loadWithLength(UChar v1, IRTemp addr, IRExpr *maxIndex)
Mark Wielaard de58b8
       crossed if and only if the real insn would have crossed it as well.
Mark Wielaard de58b8
       Thus, if the bytes to load are fully contained in an aligned 16-byte
Mark Wielaard de58b8
       chunk, load the whole 16-byte aligned chunk, and otherwise load 16 bytes
Mark Wielaard de58b8
-      from the unaligned address.  Then shift the loaded data left-aligned
Mark Wielaard de58b8
-      into the target vector register. */
Mark Wielaard de58b8
+      from the unaligned address.  Then shift the loaded data left- or
Mark Wielaard de58b8
+      right-aligned into the target vector register. */
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    assign(maxIdx, maxIndex);
Mark Wielaard de58b8
    assign(cappedMax, mkite(binop(Iop_CmpLT32U, mkexpr(maxIdx), mkU32(15)),
Mark Wielaard de58b8
@@ -2325,20 +2367,60 @@ static void s390_vr_loadWithLength(UChar v1, IRTemp addr, IRExpr *maxIndex)
Mark Wielaard de58b8
    assign(back, mkite(binop(Iop_CmpLE64U, mkexpr(offset), mkexpr(zeroed)),
Mark Wielaard de58b8
                       mkexpr(offset), mkU64(0)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   /* How much to shift the loaded 16-byte vector to the right, and then to
Mark Wielaard de58b8
-      the left.  Since both 'zeroed' and 'back' range from 0 to 15, the shift
Mark Wielaard de58b8
-      amounts range from 0 to 120. */
Mark Wielaard de58b8
-   IRExpr *shrAmount = binop(Iop_Shl64,
Mark Wielaard de58b8
-                             binop(Iop_Sub64, mkexpr(zeroed), mkexpr(back)),
Mark Wielaard de58b8
-                             mkU8(3));
Mark Wielaard de58b8
-   IRExpr *shlAmount = binop(Iop_Shl64, mkexpr(zeroed), mkU8(3));
Mark Wielaard de58b8
+   IRExpr* chunk = load(Ity_V128, binop(Iop_Sub64, mkexpr(addr), mkexpr(back)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   /* Shift the loaded 16-byte vector to the right, then to the left, or vice
Mark Wielaard de58b8
+      versa, where each shift amount ranges from 0 to 120. */
Mark Wielaard de58b8
+   IRExpr* shift1;
Mark Wielaard de58b8
+   IRExpr* shift2 = unop(Iop_64to8, binop(Iop_Shl64, mkexpr(zeroed), mkU8(3)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (rightmost) {
Mark Wielaard de58b8
+      shift1 = unop(Iop_64to8, binop(Iop_Shl64, mkexpr(back), mkU8(3)));
Mark Wielaard de58b8
+      put_vr_qw(v1, binop(Iop_ShrV128,
Mark Wielaard de58b8
+                          binop(Iop_ShlV128, chunk, shift1),
Mark Wielaard de58b8
+                          shift2));
Mark Wielaard de58b8
+   } else {
Mark Wielaard de58b8
+      shift1 = unop(Iop_64to8,
Mark Wielaard de58b8
+                    binop(Iop_Shl64,
Mark Wielaard de58b8
+                          binop(Iop_Sub64, mkexpr(zeroed), mkexpr(back)),
Mark Wielaard de58b8
+                          mkU8(3)));
Mark Wielaard de58b8
+      put_vr_qw(v1, binop(Iop_ShlV128,
Mark Wielaard de58b8
+                          binop(Iop_ShrV128, chunk, shift1),
Mark Wielaard de58b8
+                          shift2));
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+/* Store at most maxIndex + 1 bytes from v1 to addr.  Store the leftmost or
Mark Wielaard de58b8
+   rightmost bytes of v1, depending on whether `rightmost' is set.  If maxIndex
Mark Wielaard de58b8
+   >= 15, store all 16 bytes. */
Mark Wielaard de58b8
+static void
Mark Wielaard de58b8
+s390_vr_storeWithLength(UChar v1, IRTemp addr, IRExpr *maxIndex, Bool rightmost)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   IRTemp maxIdx = newTemp(Ity_I32);
Mark Wielaard de58b8
+   IRTemp cappedMax = newTemp(Ity_I64);
Mark Wielaard de58b8
+   IRTemp counter = newTemp(Ity_I64);
Mark Wielaard de58b8
+   IRExpr* offset;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   assign(maxIdx, maxIndex);
Mark Wielaard de58b8
+   assign(cappedMax, mkite(binop(Iop_CmpLT32U, mkexpr(maxIdx), mkU32(15)),
Mark Wielaard de58b8
+                           unop(Iop_32Uto64, mkexpr(maxIdx)), mkU64(15)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   assign(counter, get_counter_dw0());
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (rightmost)
Mark Wielaard de58b8
+      offset = binop(Iop_Add64,
Mark Wielaard de58b8
+                     binop(Iop_Sub64, mkU64(15), mkexpr(cappedMax)),
Mark Wielaard de58b8
+                     mkexpr(counter));
Mark Wielaard de58b8
+   else
Mark Wielaard de58b8
+      offset = mkexpr(counter);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   store(binop(Iop_Add64, mkexpr(addr), mkexpr(counter)),
Mark Wielaard de58b8
+         binop(Iop_GetElem8x16, get_vr_qw(v1), unop(Iop_64to8, offset)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, binop(Iop_ShlV128,
Mark Wielaard de58b8
-                       binop(Iop_ShrV128,
Mark Wielaard de58b8
-                             load(Ity_V128,
Mark Wielaard de58b8
-                                  binop(Iop_Sub64, mkexpr(addr), mkexpr(back))),
Mark Wielaard de58b8
-                             unop(Iop_64to8, shrAmount)),
Mark Wielaard de58b8
-                       unop(Iop_64to8, shlAmount)));
Mark Wielaard de58b8
+   /* Check for end of field */
Mark Wielaard de58b8
+   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
Mark Wielaard de58b8
+   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(cappedMax)));
Mark Wielaard de58b8
+   put_counter_dw0(mkU64(0));
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /* Bitwise vCond ? v1 : v2
Mark Wielaard de58b8
@@ -3749,6 +3831,28 @@ s390_format_VRS_RRDVM(const HChar *(*irgen)(UChar r1, IRTemp op2addr, UChar v3,
Mark Wielaard de58b8
       s390_disasm(ENC5(MNM, GPR, UDXB, VR, UINT), mnm, r1, d2, 0, b2, v3, m4);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static void
Mark Wielaard de58b8
+s390_format_VRS_RRDV(const HChar *(*irgen)(UChar v1, UChar r3, IRTemp op2addr),
Mark Wielaard de58b8
+                     UChar v1, UChar r3, UChar b2, UShort d2, UChar rxb)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   const HChar *mnm;
Mark Wielaard de58b8
+   IRTemp op2addr = newTemp(Ity_I64);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (! s390_host_has_vx) {
Mark Wielaard de58b8
+      emulation_failure(EmFail_S390X_vx);
Mark Wielaard de58b8
+      return;
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
Mark Wielaard de58b8
+          mkU64(0)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   v1  = s390_vr_getVRindex(v1, 4, rxb);
Mark Wielaard de58b8
+   mnm = irgen(v1, r3, op2addr);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
Mark Wielaard de58b8
+      s390_disasm(ENC4(MNM, VR, GPR, UDXB), mnm, v1, r3, d2, 0, b2);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static void
Mark Wielaard de58b8
 s390_format_VRS_VRDVM(const HChar *(*irgen)(UChar v1, IRTemp op2addr, UChar v3,
Mark Wielaard de58b8
@@ -4081,6 +4185,29 @@ s390_format_VRRa_VVVMMM(const HChar *(*irgen)(UChar v1, UChar v2, UChar v3,
Mark Wielaard de58b8
                   mnm, v1, v2, v3, m4, m5, m6);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static void
Mark Wielaard de58b8
+s390_format_VSI_URDV(const HChar *(*irgen)(UChar v1, IRTemp op2addr, UChar i3),
Mark Wielaard de58b8
+                     UChar v1, UChar b2, UChar d2, UChar i3, UChar rxb)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   const HChar *mnm;
Mark Wielaard de58b8
+   IRTemp op2addr = newTemp(Ity_I64);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (!s390_host_has_vx) {
Mark Wielaard de58b8
+      emulation_failure(EmFail_S390X_vx);
Mark Wielaard de58b8
+      return;
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   v1 = s390_vr_getVRindex(v1, 4, rxb);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
Mark Wielaard de58b8
+          mkU64(0)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   mnm = irgen(v1, op2addr, i3);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (vex_traceflags & VEX_TRACE_FE)
Mark Wielaard de58b8
+      s390_disasm(ENC4(MNM, VR, UDXB, UINT), mnm, v1, d2, 0, b2, i3);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 /*------------------------------------------------------------*/
Mark Wielaard de58b8
 /*--- Build IR for opcodes                                 ---*/
Mark Wielaard de58b8
 /*------------------------------------------------------------*/
Mark Wielaard de58b8
@@ -16186,7 +16313,9 @@ s390_irgen_VGM(UChar v1, UShort i2, UChar m3)
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VLLEZ(UChar v1, IRTemp op2addr, UChar m3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   IRType type = s390_vr_get_type(m3);
Mark Wielaard de58b8
+   s390_insn_assert("vllez", m3 <= 3 || m3 == 6);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   IRType type = s390_vr_get_type(m3 & 3);
Mark Wielaard de58b8
    IRExpr* op2 = load(type, mkexpr(op2addr));
Mark Wielaard de58b8
    IRExpr* op2as64bit;
Mark Wielaard de58b8
    switch (type) {
Mark Wielaard de58b8
@@ -16206,7 +16335,13 @@ s390_irgen_VLLEZ(UChar v1, IRTemp op2addr, UChar m3)
Mark Wielaard de58b8
       vpanic("s390_irgen_VLLEZ: unknown type");
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_dw0(v1, op2as64bit);
Mark Wielaard de58b8
+   if (m3 == 6) {
Mark Wielaard de58b8
+      /* left-aligned */
Mark Wielaard de58b8
+      put_vr_dw0(v1, binop(Iop_Shl64, op2as64bit, mkU8(32)));
Mark Wielaard de58b8
+   } else {
Mark Wielaard de58b8
+      /* right-aligned */
Mark Wielaard de58b8
+      put_vr_dw0(v1, op2as64bit);
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
    put_vr_dw1(v1, mkU64(0));
Mark Wielaard de58b8
    return "vllez";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
@@ -16615,7 +16750,7 @@ s390_irgen_VLBB(UChar v1, IRTemp addr, UChar m3)
Mark Wielaard de58b8
                             s390_getCountToBlockBoundary(addr, m3),
Mark Wielaard de58b8
                             mkU32(1));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   s390_vr_loadWithLength(v1, addr, maxIndex);
Mark Wielaard de58b8
+   s390_vr_loadWithLength(v1, addr, maxIndex, False);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vlbb";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
@@ -16623,41 +16758,50 @@ s390_irgen_VLBB(UChar v1, IRTemp addr, UChar m3)
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VLL(UChar v1, IRTemp addr, UChar r3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_vr_loadWithLength(v1, addr, get_gpr_w1(r3));
Mark Wielaard de58b8
+   s390_vr_loadWithLength(v1, addr, get_gpr_w1(r3), False);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vll";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VSTL(UChar v1, IRTemp addr, UChar r3)
Mark Wielaard de58b8
+s390_irgen_VLRL(UChar v1, IRTemp addr, UChar i3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   IRTemp counter = newTemp(Ity_I64);
Mark Wielaard de58b8
-   IRTemp maxIndexToStore = newTemp(Ity_I64);
Mark Wielaard de58b8
-   IRTemp gpr3 = newTemp(Ity_I64);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   assign(gpr3, unop(Iop_32Uto64, get_gpr_w1(r3)));
Mark Wielaard de58b8
-   assign(maxIndexToStore, mkite(binop(Iop_CmpLE64U,
Mark Wielaard de58b8
-                                       mkexpr(gpr3),
Mark Wielaard de58b8
-                                       mkU64(16)
Mark Wielaard de58b8
-                                       ),
Mark Wielaard de58b8
-                                 mkexpr(gpr3),
Mark Wielaard de58b8
-                                 mkU64(16)
Mark Wielaard de58b8
-                                 )
Mark Wielaard de58b8
-         );
Mark Wielaard de58b8
+   s390_insn_assert("vlrl", (i3 & 0xf0) == 0);
Mark Wielaard de58b8
+   s390_vr_loadWithLength(v1, addr, mkU32((UInt) i3), True);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   assign(counter, get_counter_dw0());
Mark Wielaard de58b8
+   return "vlrl";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   store(binop(Iop_Add64, mkexpr(addr), mkexpr(counter)),
Mark Wielaard de58b8
-         binop(Iop_GetElem8x16, get_vr_qw(v1), unop(Iop_64to8, mkexpr(counter))));
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VLRLR(UChar v1, UChar r3, IRTemp addr)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   s390_vr_loadWithLength(v1, addr, get_gpr_w1(r3), True);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   /* Check for end of field */
Mark Wielaard de58b8
-   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
Mark Wielaard de58b8
-   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(maxIndexToStore)));
Mark Wielaard de58b8
-   put_counter_dw0(mkU64(0));
Mark Wielaard de58b8
+   return "vlrlr";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VSTL(UChar v1, IRTemp addr, UChar r3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   s390_vr_storeWithLength(v1, addr, get_gpr_w1(r3), False);
Mark Wielaard de58b8
    return "vstl";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VSTRL(UChar v1, IRTemp addr, UChar i3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   s390_insn_assert("vstrl", (i3 & 0xf0) == 0);
Mark Wielaard de58b8
+   s390_vr_storeWithLength(v1, addr, mkU32((UInt) i3), True);
Mark Wielaard de58b8
+   return "vstrl";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VSTRLR(UChar v1, UChar r3, IRTemp addr)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   s390_vr_storeWithLength(v1, addr, get_gpr_w1(r3), True);
Mark Wielaard de58b8
+   return "vstrlr";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VX(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
@@ -16682,6 +16826,24 @@ s390_irgen_VO(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
    return "vo";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VOC(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   put_vr_qw(v1, binop(Iop_OrV128, get_vr_qw(v2),
Mark Wielaard de58b8
+                       unop(Iop_NotV128, get_vr_qw(v3))));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   return "voc";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VNN(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   put_vr_qw(v1, unop(Iop_NotV128,
Mark Wielaard de58b8
+                      binop(Iop_AndV128, get_vr_qw(v2), get_vr_qw(v3))));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   return "vnn";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VNO(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
@@ -16691,6 +16853,15 @@ s390_irgen_VNO(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
    return "vno";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VNX(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   put_vr_qw(v1, unop(Iop_NotV128,
Mark Wielaard de58b8
+                      binop(Iop_XorV128, get_vr_qw(v2), get_vr_qw(v3))));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   return "vnx";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_LZRF(UChar r1, IRTemp op2addr)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
@@ -17499,9 +17670,19 @@ s390_irgen_VCTZ(UChar v1, UChar v2, UChar m3)
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VPOPCT(UChar v1, UChar v2, UChar m3)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   vassert(m3 == 0);
Mark Wielaard de58b8
+   s390_insn_assert("vpopct", m3 <= 3);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   IRExpr* cnt = unop(Iop_Cnt8x16, get_vr_qw(v2));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, unop(Iop_Cnt8x16, get_vr_qw(v2)));
Mark Wielaard de58b8
+   if (m3 >= 1) {
Mark Wielaard de58b8
+      cnt = unop(Iop_PwAddL8Ux16, cnt);
Mark Wielaard de58b8
+      if (m3 >= 2) {
Mark Wielaard de58b8
+         cnt = unop(Iop_PwAddL16Ux8, cnt);
Mark Wielaard de58b8
+         if (m3 == 3)
Mark Wielaard de58b8
+            cnt = unop(Iop_PwAddL32Ux4, cnt);
Mark Wielaard de58b8
+      }
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
+   put_vr_qw(v1, cnt);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vpopct";
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -18335,12 +18516,53 @@ s390_irgen_VMALH(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5)
Mark Wielaard de58b8
    return "vmalh";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VMSL(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   s390_insn_assert("vmsl", m5 == 3 && (m6 & 3) == 0);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   IRDirty* d;
Mark Wielaard de58b8
+   IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard 3e351e
+   details.op = S390_VEC_OP_VMSL;
Mark Wielaard de58b8
+   details.v1 = v1;
Mark Wielaard de58b8
+   details.v2 = v2;
Mark Wielaard de58b8
+   details.v3 = v3;
Mark Wielaard de58b8
+   details.v4 = v4;
Mark Wielaard de58b8
+   details.m4 = m5;
Mark Wielaard 3e351e
+   details.m5 = m6;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
+                         &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
+                         mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
+                                       mkU64(details.serialized)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   d->nFxState = 4;
Mark Wielaard de58b8
+   vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
+   d->fxState[0].fx     = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[0].size   = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].fx     = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].size   = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].fx     = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v4 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].size   = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[3].fx     = Ifx_Write;
Mark Wielaard de58b8
+   d->fxState[3].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[3].size   = sizeof(V128);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   return "vmsl";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static void
Mark Wielaard de58b8
-s390_vector_fp_convert(IROp op, IRType fromType, IRType toType,
Mark Wielaard de58b8
+s390_vector_fp_convert(IROp op, IRType fromType, IRType toType, Bool rounding,
Mark Wielaard de58b8
                        UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    Bool isSingleElementOp = s390_vr_is_single_element_control_set(m4);
Mark Wielaard de58b8
-   UChar maxIndex = isSingleElementOp ? 0 : 1;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    /* For Iop_F32toF64 we do this:
Mark Wielaard de58b8
       f32[0] -> f64[0]
Mark Wielaard 3e351e
@@ -18353,14 +18575,21 @@ s390_vector_fp_convert(IROp op, IRType fromType, IRType toType,
Mark Wielaard de58b8
       The magic below with scaling factors is used to achieve the logic
Mark Wielaard de58b8
       described above.
Mark Wielaard de58b8
    */
Mark Wielaard de58b8
-   const UChar sourceIndexScaleFactor = (op == Iop_F32toF64) ? 2 : 1;
Mark Wielaard de58b8
-   const UChar destinationIndexScaleFactor = (op == Iop_F64toF32) ? 2 : 1;
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   const Bool isUnary = (op == Iop_F32toF64);
Mark Wielaard de58b8
-   for (UChar i = 0; i <= maxIndex; i++) {
Mark Wielaard de58b8
+   Int size_diff = sizeofIRType(toType) - sizeofIRType(fromType);
Mark Wielaard de58b8
+   const UChar sourceIndexScaleFactor = size_diff > 0 ? 2 : 1;
Mark Wielaard de58b8
+   const UChar destinationIndexScaleFactor = size_diff < 0 ? 2 : 1;
Mark Wielaard de58b8
+   UChar n_elem = (isSingleElementOp ? 1 :
Mark Wielaard de58b8
+                   16 / (size_diff > 0 ?
Mark Wielaard de58b8
+                         sizeofIRType(toType) : sizeofIRType(fromType)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   for (UChar i = 0; i < n_elem; i++) {
Mark Wielaard de58b8
       IRExpr* argument = get_vr(v2, fromType, i * sourceIndexScaleFactor);
Mark Wielaard de58b8
       IRExpr* result;
Mark Wielaard de58b8
-      if (!isUnary) {
Mark Wielaard de58b8
+      if (rounding) {
Mark Wielaard de58b8
+         if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
+            emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
+            m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
+         }
Mark Wielaard de58b8
          result = binop(op,
Mark Wielaard de58b8
                         mkexpr(encode_bfp_rounding_mode(m5)),
Mark Wielaard de58b8
                         argument);
Mark Wielaard 3e351e
@@ -18369,10 +18598,6 @@ s390_vector_fp_convert(IROp op, IRType fromType, IRType toType,
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
       put_vr(v1, toType, i * destinationIndexScaleFactor, result);
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   if (isSingleElementOp) {
Mark Wielaard de58b8
-      put_vr_dw1(v1, mkU64(0));
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard 3e351e
@@ -18380,12 +18605,8 @@ s390_irgen_VCDG(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    s390_insn_assert("vcdg", m3 == 3);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_I64StoF64, Ity_I64, Ity_F64, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   s390_vector_fp_convert(Iop_I64StoF64, Ity_I64, Ity_F64, True,
Mark Wielaard de58b8
+                          v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vcdg";
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -18395,12 +18616,8 @@ s390_irgen_VCDLG(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    s390_insn_assert("vcdlg", m3 == 3);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_I64UtoF64, Ity_I64, Ity_F64, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   s390_vector_fp_convert(Iop_I64UtoF64, Ity_I64, Ity_F64, True,
Mark Wielaard de58b8
+                          v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vcdlg";
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -18410,12 +18627,8 @@ s390_irgen_VCGD(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    s390_insn_assert("vcgd", m3 == 3);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_F64toI64S, Ity_F64, Ity_I64, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   s390_vector_fp_convert(Iop_F64toI64S, Ity_F64, Ity_I64, True,
Mark Wielaard de58b8
+                          v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vcgd";
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -18425,12 +18638,8 @@ s390_irgen_VCLGD(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
    s390_insn_assert("vclgd", m3 == 3);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_F64toI64U, Ity_F64, Ity_I64, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   s390_vector_fp_convert(Iop_F64toI64U, Ity_F64, Ity_I64, True,
Mark Wielaard de58b8
+                          v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vclgd";
Mark Wielaard de58b8
 }
Mark Wielaard 3e351e
@@ -18438,246 +18647,262 @@ s390_irgen_VCLGD(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFI(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfi", m3 == 3);
Mark Wielaard de58b8
+   s390_insn_assert("vfi",
Mark Wielaard de58b8
+                    (m3 == 3 || (s390_host_has_vxe && m3 >= 2 && m3 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      emulation_warning(EmWarn_S390X_fpext_rounding);
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
+   switch (m3) {
Mark Wielaard de58b8
+   case 2: s390_vector_fp_convert(Iop_RoundF32toInt, Ity_F32, Ity_F32, True,
Mark Wielaard de58b8
+                                  v1, v2, m3, m4, m5); break;
Mark Wielaard de58b8
+   case 3: s390_vector_fp_convert(Iop_RoundF64toInt, Ity_F64, Ity_F64, True,
Mark Wielaard de58b8
+                                  v1, v2, m3, m4, m5); break;
Mark Wielaard de58b8
+   case 4: s390_vector_fp_convert(Iop_RoundF128toInt, Ity_F128, Ity_F128, True,
Mark Wielaard de58b8
+                                  v1, v2, m3, m4, m5); break;
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_RoundF64toInt, Ity_F64, Ity_F64,
Mark Wielaard de58b8
-                          v1, v2, m3, m4, m5);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   return "vcgld";
Mark Wielaard de58b8
+   return "vfi";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VLDE(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
+s390_irgen_VFLL(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vlde", m3 == 2);
Mark Wielaard de58b8
+   s390_insn_assert("vfll", m3 == 2 || (s390_host_has_vxe && m3 == 3));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_F32toF64, Ity_F32, Ity_F64, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   if (m3 == 2)
Mark Wielaard de58b8
+      s390_vector_fp_convert(Iop_F32toF64, Ity_F32, Ity_F64, False,
Mark Wielaard de58b8
+                             v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   else
Mark Wielaard de58b8
+      s390_vector_fp_convert(Iop_F64toF128, Ity_F64, Ity_F128, False,
Mark Wielaard de58b8
+                             v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vlde";
Mark Wielaard de58b8
+   return "vfll";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VLED(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
+s390_irgen_VFLR(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vled", m3 == 3);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   if (!s390_host_has_fpext && m5 != S390_BFP_ROUND_PER_FPC) {
Mark Wielaard de58b8
-      m5 = S390_BFP_ROUND_PER_FPC;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+   s390_insn_assert("vflr", m3 == 3 || (s390_host_has_vxe && m3 == 2));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   s390_vector_fp_convert(Iop_F64toF32, Ity_F64, Ity_F32, v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   if (m3 == 3)
Mark Wielaard de58b8
+      s390_vector_fp_convert(Iop_F64toF32, Ity_F64, Ity_F32, True,
Mark Wielaard de58b8
+                             v1, v2, m3, m4, m5);
Mark Wielaard de58b8
+   else
Mark Wielaard de58b8
+      s390_vector_fp_convert(Iop_F128toF64, Ity_F128, Ity_F64, True,
Mark Wielaard de58b8
+                             v1, v2, m3, m4, m5);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vled";
Mark Wielaard de58b8
+   return "vflr";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFPSO(UChar v1, UChar v2, UChar m3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfpso", m3 == 3);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   IRExpr* result;
Mark Wielaard de58b8
-   switch (m5) {
Mark Wielaard de58b8
-   case 0: {
Mark Wielaard de58b8
-      /* Invert sign */
Mark Wielaard de58b8
-      if (!s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
-         result = unop(Iop_Neg64Fx2, get_vr_qw(v2));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-      else {
Mark Wielaard de58b8
-         result = binop(Iop_64HLtoV128,
Mark Wielaard de58b8
-                        unop(Iop_ReinterpF64asI64,
Mark Wielaard de58b8
-                             unop(Iop_NegF64, get_vr(v2, Ity_F64, 0))),
Mark Wielaard de58b8
-                        mkU64(0));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-      break;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+   s390_insn_assert("vfpso", m5 <= 2 &&
Mark Wielaard de58b8
+                    (m3 == 3 || (s390_host_has_vxe && m3 >= 2 && m3 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   case 1: {
Mark Wielaard de58b8
-      /* Set sign to negative */
Mark Wielaard de58b8
-      IRExpr* highHalf = mkU64(0x8000000000000000ULL);
Mark Wielaard de58b8
-      if (!s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
-         IRExpr* lowHalf = highHalf;
Mark Wielaard de58b8
-         IRExpr* mask = binop(Iop_64HLtoV128, highHalf, lowHalf);
Mark Wielaard de58b8
-         result = binop(Iop_OrV128, get_vr_qw(v2), mask);
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-      else {
Mark Wielaard de58b8
-         result = binop(Iop_64HLtoV128,
Mark Wielaard de58b8
-                        binop(Iop_Or64, get_vr_dw0(v2), highHalf),
Mark Wielaard de58b8
-                        mkU64(0ULL));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
+   Bool single = s390_vr_is_single_element_control_set(m4) || m3 == 4;
Mark Wielaard de58b8
+   IRType type = single ? s390_vr_get_ftype(m3) : Ity_V128;
Mark Wielaard de58b8
+   int idx = 2 * (m3 - 2) + (single ? 0 : 1);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      break;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   case 2: {
Mark Wielaard de58b8
-      /* Set sign to positive */
Mark Wielaard de58b8
-      if (!s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
-         result = unop(Iop_Abs64Fx2, get_vr_qw(v2));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-      else {
Mark Wielaard de58b8
-         result = binop(Iop_64HLtoV128,
Mark Wielaard de58b8
-                        unop(Iop_ReinterpF64asI64,
Mark Wielaard de58b8
-                             unop(Iop_AbsF64, get_vr(v2, Ity_F64, 0))),
Mark Wielaard de58b8
-                        mkU64(0));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-      break;
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   default:
Mark Wielaard de58b8
-      vpanic("s390_irgen_VFPSO: Invalid m5 value");
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+   static const IROp negate_ops[] = {
Mark Wielaard de58b8
+      Iop_NegF32, Iop_Neg32Fx4,
Mark Wielaard de58b8
+      Iop_NegF64, Iop_Neg64Fx2,
Mark Wielaard de58b8
+      Iop_NegF128
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   static const IROp abs_ops[] = {
Mark Wielaard de58b8
+      Iop_AbsF32, Iop_Abs32Fx4,
Mark Wielaard de58b8
+      Iop_AbsF64, Iop_Abs64Fx2,
Mark Wielaard de58b8
+      Iop_AbsF128
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, result);
Mark Wielaard de58b8
-   if (s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
-      put_vr_dw1(v1, mkU64(0ULL));
Mark Wielaard de58b8
+   if (m5 == 1) {
Mark Wielaard de58b8
+      /* Set sign to negative */
Mark Wielaard de58b8
+      put_vr(v1, type, 0,
Mark Wielaard de58b8
+             unop(negate_ops[idx],
Mark Wielaard de58b8
+                  unop(abs_ops[idx], get_vr(v2, type, 0))));
Mark Wielaard de58b8
+   } else {
Mark Wielaard de58b8
+      /* m5 == 0: invert sign; m5 == 2: set sign to positive */
Mark Wielaard de58b8
+      const IROp *ops = m5 == 2 ? abs_ops : negate_ops;
Mark Wielaard de58b8
+      put_vr(v1, type, 0, unop(ops[idx], get_vr(v2, type, 0)));
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    return "vfpso";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-static void s390x_vec_fp_binary_op(IROp generalOp, IROp singleElementOp,
Mark Wielaard de58b8
-                                   UChar v1, UChar v2, UChar v3, UChar m4,
Mark Wielaard de58b8
-                                   UChar m5)
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390x_vec_fp_binary_op(const HChar* mnm, const IROp ops[],
Mark Wielaard de58b8
+                       UChar v1, UChar v2, UChar v3,
Mark Wielaard de58b8
+                       UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   IRExpr* result;
Mark Wielaard de58b8
-   if (!s390_vr_is_single_element_control_set(m5)) {
Mark Wielaard de58b8
-      result = triop(generalOp, get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
-                     get_vr_qw(v2), get_vr_qw(v3));
Mark Wielaard de58b8
+   s390_insn_assert(mnm, (m5 & 7) == 0 &&
Mark Wielaard de58b8
+                    (m4 == 3 || (s390_host_has_vxe && m4 >= 2 && m4 <= 4)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   int idx = 2 * (m4 - 2);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (m4 == 4 || s390_vr_is_single_element_control_set(m5)) {
Mark Wielaard de58b8
+      IRType type = s390_vr_get_ftype(m4);
Mark Wielaard de58b8
+      put_vr(v1, type, 0,
Mark Wielaard de58b8
+             triop(ops[idx], get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
+                   get_vr(v2, type, 0), get_vr(v3, type, 0)));
Mark Wielaard de58b8
    } else {
Mark Wielaard de58b8
-      IRExpr* highHalf = triop(singleElementOp,
Mark Wielaard de58b8
-                               get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
-                               get_vr(v2, Ity_F64, 0),
Mark Wielaard de58b8
-                               get_vr(v3, Ity_F64, 0));
Mark Wielaard de58b8
-      result = binop(Iop_64HLtoV128, unop(Iop_ReinterpF64asI64, highHalf),
Mark Wielaard de58b8
-                     mkU64(0ULL));
Mark Wielaard de58b8
+      put_vr_qw(v1, triop(ops[idx + 1], get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
+                          get_vr_qw(v2), get_vr_qw(v3)));
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, result);
Mark Wielaard de58b8
+   return mnm;
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-static void s390x_vec_fp_unary_op(IROp generalOp, IROp singleElementOp,
Mark Wielaard de58b8
-                                  UChar v1, UChar v2, UChar m3, UChar m4)
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390x_vec_fp_unary_op(const HChar* mnm, const IROp ops[],
Mark Wielaard de58b8
+                      UChar v1, UChar v2, UChar m3, UChar m4)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   IRExpr* result;
Mark Wielaard de58b8
-   if (!s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
-      result = binop(generalOp, get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
-                     get_vr_qw(v2));
Mark Wielaard de58b8
+   s390_insn_assert(mnm, (m4 & 7) == 0 &&
Mark Wielaard de58b8
+                    (m3 == 3 || (s390_host_has_vxe && m3 >= 2 && m3 <= 4)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   int idx = 2 * (m3 - 2);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (m3 == 4 || s390_vr_is_single_element_control_set(m4)) {
Mark Wielaard de58b8
+      IRType type = s390_vr_get_ftype(m3);
Mark Wielaard de58b8
+      put_vr(v1, type, 0,
Mark Wielaard de58b8
+             binop(ops[idx], get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
+                   get_vr(v2, type, 0)));
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
    else {
Mark Wielaard de58b8
-      IRExpr* highHalf = binop(singleElementOp,
Mark Wielaard de58b8
-                               get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
-                               get_vr(v2, Ity_F64, 0));
Mark Wielaard de58b8
-      result = binop(Iop_64HLtoV128, unop(Iop_ReinterpF64asI64, highHalf),
Mark Wielaard de58b8
-                     mkU64(0ULL));
Mark Wielaard de58b8
+      put_vr_qw(v1, binop(ops[idx + 1], get_bfp_rounding_mode_from_fpc(),
Mark Wielaard de58b8
+                          get_vr_qw(v2)));
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, result);
Mark Wielaard de58b8
+   return mnm;
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-static void
Mark Wielaard de58b8
-s390_vector_fp_mulAddOrSub(IROp singleElementOp,
Mark Wielaard de58b8
-                           UChar v1, UChar v2, UChar v3, UChar v4,
Mark Wielaard de58b8
-                           UChar m5, UChar m6)
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_vector_fp_mulAddOrSub(UChar v1, UChar v2, UChar v3, UChar v4,
Mark Wielaard de58b8
+                           UChar m5, UChar m6,
Mark Wielaard de58b8
+                           const HChar* mnm, const IROp single_ops[],
Mark Wielaard de58b8
+                           Bool negate)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   Bool isSingleElementOp = s390_vr_is_single_element_control_set(m5);
Mark Wielaard de58b8
+   s390_insn_assert(mnm, m6 == 3 || (s390_host_has_vxe && m6 >= 2 && m6 <= 4));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   static const IROp negate_ops[] = { Iop_NegF32, Iop_NegF64, Iop_NegF128 };
Mark Wielaard de58b8
+   IRType type = s390_vr_get_ftype(m6);
Mark Wielaard de58b8
+   Bool single = s390_vr_is_single_element_control_set(m5) || m6 == 4;
Mark Wielaard de58b8
+   UChar n_elem = single ? 1 : s390_vr_get_n_elem(m6);
Mark Wielaard de58b8
    IRTemp irrm_temp = newTemp(Ity_I32);
Mark Wielaard de58b8
    assign(irrm_temp, get_bfp_rounding_mode_from_fpc());
Mark Wielaard de58b8
    IRExpr* irrm = mkexpr(irrm_temp);
Mark Wielaard de58b8
-   IRExpr* result;
Mark Wielaard de58b8
-   IRExpr* highHalf = qop(singleElementOp,
Mark Wielaard de58b8
-                          irrm,
Mark Wielaard de58b8
-                          get_vr(v2, Ity_F64, 0),
Mark Wielaard de58b8
-                          get_vr(v3, Ity_F64, 0),
Mark Wielaard de58b8
-                          get_vr(v4, Ity_F64, 0));
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   if (isSingleElementOp) {
Mark Wielaard de58b8
-      result = binop(Iop_64HLtoV128, unop(Iop_ReinterpF64asI64, highHalf),
Mark Wielaard de58b8
-                     mkU64(0ULL));
Mark Wielaard de58b8
-   } else {
Mark Wielaard de58b8
-      IRExpr* lowHalf = qop(singleElementOp,
Mark Wielaard de58b8
-                            irrm,
Mark Wielaard de58b8
-                            get_vr(v2, Ity_F64, 1),
Mark Wielaard de58b8
-                            get_vr(v3, Ity_F64, 1),
Mark Wielaard de58b8
-                            get_vr(v4, Ity_F64, 1));
Mark Wielaard de58b8
-      result = binop(Iop_64HLtoV128, unop(Iop_ReinterpF64asI64, highHalf),
Mark Wielaard de58b8
-                     unop(Iop_ReinterpF64asI64, lowHalf));
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   put_vr_qw(v1, result);
Mark Wielaard de58b8
+   for (UChar idx = 0; idx < n_elem; idx++) {
Mark Wielaard de58b8
+      IRExpr* result = qop(single_ops[m6 - 2],
Mark Wielaard de58b8
+                           irrm,
Mark Wielaard de58b8
+                           get_vr(v2, type, idx),
Mark Wielaard de58b8
+                           get_vr(v3, type, idx),
Mark Wielaard de58b8
+                           get_vr(v4, type, idx));
Mark Wielaard de58b8
+      put_vr(v1, type, idx, negate ? unop(negate_ops[m6 - 2], result) : result);
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
+   return mnm;
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFA(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfa", m4 == 3);
Mark Wielaard de58b8
-   s390x_vec_fp_binary_op(Iop_Add64Fx2, Iop_AddF64, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
-   return "vfa";
Mark Wielaard de58b8
+   static const IROp vfa_ops[] = {
Mark Wielaard de58b8
+      Iop_AddF32, Iop_Add32Fx4,
Mark Wielaard de58b8
+      Iop_AddF64, Iop_Add64Fx2,
Mark Wielaard de58b8
+      Iop_AddF128,
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   return s390x_vec_fp_binary_op("vfa", vfa_ops, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFS(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfs", m4 == 3);
Mark Wielaard de58b8
-   s390x_vec_fp_binary_op(Iop_Sub64Fx2, Iop_SubF64, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
-   return "vfs";
Mark Wielaard de58b8
+   static const IROp vfs_ops[] = {
Mark Wielaard de58b8
+      Iop_SubF32, Iop_Sub32Fx4,
Mark Wielaard de58b8
+      Iop_SubF64, Iop_Sub64Fx2,
Mark Wielaard de58b8
+      Iop_SubF128,
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   return s390x_vec_fp_binary_op("vfs", vfs_ops, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFM(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfm", m4 == 3);
Mark Wielaard de58b8
-   s390x_vec_fp_binary_op(Iop_Mul64Fx2, Iop_MulF64, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
-   return "vfm";
Mark Wielaard de58b8
+   static const IROp vfm_ops[] = {
Mark Wielaard de58b8
+      Iop_MulF32, Iop_Mul32Fx4,
Mark Wielaard de58b8
+      Iop_MulF64, Iop_Mul64Fx2,
Mark Wielaard de58b8
+      Iop_MulF128,
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   return s390x_vec_fp_binary_op("vfm", vfm_ops, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFD(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfd", m4 == 3);
Mark Wielaard de58b8
-   s390x_vec_fp_binary_op(Iop_Div64Fx2, Iop_DivF64, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
-   return "vfd";
Mark Wielaard de58b8
+   static const IROp vfd_ops[] = {
Mark Wielaard de58b8
+      Iop_DivF32, Iop_Div32Fx4,
Mark Wielaard de58b8
+      Iop_DivF64, Iop_Div64Fx2,
Mark Wielaard de58b8
+      Iop_DivF128,
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   return s390x_vec_fp_binary_op("vfd", vfd_ops, v1, v2, v3, m4, m5);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFSQ(UChar v1, UChar v2, UChar m3, UChar m4)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfsq", m3 == 3);
Mark Wielaard de58b8
-   s390x_vec_fp_unary_op(Iop_Sqrt64Fx2, Iop_SqrtF64, v1, v2, m3, m4);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-   return "vfsq";
Mark Wielaard de58b8
+   static const IROp vfsq_ops[] = {
Mark Wielaard de58b8
+      Iop_SqrtF32, Iop_Sqrt32Fx4,
Mark Wielaard de58b8
+      Iop_SqrtF64, Iop_Sqrt64Fx2,
Mark Wielaard de58b8
+      Iop_SqrtF128
Mark Wielaard de58b8
+   };
Mark Wielaard de58b8
+   return s390x_vec_fp_unary_op("vfsq", vfsq_ops, v1, v2, m3, m4);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const IROp FMA_single_ops[] = {
Mark Wielaard de58b8
+   Iop_MAddF32, Iop_MAddF64, Iop_MAddF128
Mark Wielaard de58b8
+};
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFMA(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5, UChar m6)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfma", m6 == 3);
Mark Wielaard de58b8
-   s390_vector_fp_mulAddOrSub(Iop_MAddF64, v1, v2, v3, v4, m5, m6);
Mark Wielaard de58b8
-   return "vfma";
Mark Wielaard de58b8
+   return s390_vector_fp_mulAddOrSub(v1, v2, v3, v4, m5, m6,
Mark Wielaard de58b8
+                                     "vfma", FMA_single_ops, False);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VFNMA(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   return s390_vector_fp_mulAddOrSub(v1, v2, v3, v4, m5, m6,
Mark Wielaard de58b8
+                                     "vfnma", FMA_single_ops, True);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+static const IROp FMS_single_ops[] = {
Mark Wielaard de58b8
+   Iop_MSubF32, Iop_MSubF64, Iop_MSubF128
Mark Wielaard de58b8
+};
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_VFMS(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5, UChar m6)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfms", m6 == 3);
Mark Wielaard de58b8
-   s390_vector_fp_mulAddOrSub(Iop_MSubF64, v1, v2, v3, v4, m5, m6);
Mark Wielaard de58b8
-   return "vfms";
Mark Wielaard de58b8
+   return s390_vector_fp_mulAddOrSub(v1, v2, v3, v4, m5, m6,
Mark Wielaard de58b8
+                                     "vfms", FMS_single_ops, False);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VFNMS(UChar v1, UChar v2, UChar v3, UChar v4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   return s390_vector_fp_mulAddOrSub(v1, v2, v3, v4, m5, m6,
Mark Wielaard de58b8
+                                     "vfnms", FMS_single_ops, True);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
 s390_irgen_WFC(UChar v1, UChar v2, UChar m3, UChar m4)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("wfc", m3 == 3);
Mark Wielaard de58b8
-   s390_insn_assert("wfc", m4 == 0);
Mark Wielaard de58b8
+   s390_insn_assert("wfc", m4 == 0 &&
Mark Wielaard de58b8
+                    (m3 == 3 || (s390_host_has_vxe && m3 >= 2 && m3 <= 4)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   static const IROp ops[] = { Iop_CmpF32, Iop_CmpF64, Iop_CmpF128 };
Mark Wielaard de58b8
+   IRType type = s390_vr_get_ftype(m3);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    IRTemp cc_vex = newTemp(Ity_I32);
Mark Wielaard de58b8
-   assign(cc_vex, binop(Iop_CmpF64,
Mark Wielaard de58b8
-                        get_vr(v1, Ity_F64, 0), get_vr(v2, Ity_F64, 0)));
Mark Wielaard de58b8
+   assign(cc_vex, binop(ops[m3 - 2], get_vr(v1, type, 0), get_vr(v2, type, 0)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    IRTemp cc_s390 = newTemp(Ity_I32);
Mark Wielaard de58b8
    assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
Mark Wielaard 3e351e
@@ -18695,213 +18920,253 @@ s390_irgen_WFK(UChar v1, UChar v2, UChar m3, UChar m4)
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VFCE(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+s390_irgen_VFCx(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6,
Mark Wielaard de58b8
+                const HChar *mnem, IRCmpFResult cmp, Bool equal_ok,
Mark Wielaard de58b8
+                IROp cmp32, IROp cmp64)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfce", m4 == 3);
Mark Wielaard de58b8
+   s390_insn_assert(mnem, (m5 & 3) == 0 && (m6 & 14) == 0 &&
Mark Wielaard de58b8
+                    (m4 == 3 || (s390_host_has_vxe && m4 >= 2 && m4 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   Bool isSingleElementOp = s390_vr_is_single_element_control_set(m5);
Mark Wielaard de58b8
-   if (!s390_vr_is_cs_set(m6)) {
Mark Wielaard de58b8
-      if (!isSingleElementOp) {
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_CmpEQ64Fx2, get_vr_qw(v2), get_vr_qw(v3)));
Mark Wielaard de58b8
+   Bool single = s390_vr_is_single_element_control_set(m5) || m4 == 4;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   if (single) {
Mark Wielaard de58b8
+      static const IROp ops[] = { Iop_CmpF32, Iop_CmpF64, Iop_CmpF128 };
Mark Wielaard de58b8
+      IRType type = s390_vr_get_ftype(m4);
Mark Wielaard de58b8
+      IRTemp result = newTemp(Ity_I32);
Mark Wielaard de58b8
+      IRTemp cond = newTemp(Ity_I1);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+      assign(result, binop(ops[m4 - 2],
Mark Wielaard de58b8
+                           get_vr(v2, type, 0), get_vr(v3, type, 0)));
Mark Wielaard de58b8
+      if (equal_ok) {
Mark Wielaard de58b8
+         assign(cond,
Mark Wielaard de58b8
+                binop(Iop_Or1,
Mark Wielaard de58b8
+                      binop(Iop_CmpEQ32, mkexpr(result), mkU32(cmp)),
Mark Wielaard de58b8
+                      binop(Iop_CmpEQ32, mkexpr(result), mkU32(Ircr_EQ))));
Mark Wielaard de58b8
       } else {
Mark Wielaard de58b8
-         IRExpr* comparisonResult = binop(Iop_CmpF64, get_vr(v2, Ity_F64, 0),
Mark Wielaard de58b8
-                                          get_vr(v3, Ity_F64, 0));
Mark Wielaard de58b8
-         IRExpr* result = mkite(binop(Iop_CmpEQ32, comparisonResult,
Mark Wielaard de58b8
-                                      mkU32(Ircr_EQ)),
Mark Wielaard de58b8
-                                mkU64(0xffffffffffffffffULL),
Mark Wielaard de58b8
-                                mkU64(0ULL));
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_64HLtoV128, result, mkU64(0ULL)));
Mark Wielaard de58b8
+         assign(cond, binop(Iop_CmpEQ32, mkexpr(result), mkU32(cmp)));
Mark Wielaard de58b8
+      }
Mark Wielaard de58b8
+      put_vr_qw(v1, mkite(mkexpr(cond),
Mark Wielaard de58b8
+                          IRExpr_Const(IRConst_V128(0xffff)),
Mark Wielaard de58b8
+                          IRExpr_Const(IRConst_V128(0))));
Mark Wielaard de58b8
+      if (s390_vr_is_cs_set(m6)) {
Mark Wielaard de58b8
+         IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
+         assign(cc, mkite(mkexpr(cond), mkU64(0), mkU64(3)));
Mark Wielaard de58b8
+         s390_cc_set(cc);
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
    } else {
Mark Wielaard de58b8
-      IRDirty* d;
Mark Wielaard de58b8
-      IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-      s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
-      details.op = S390_VEC_OP_VFCE;
Mark Wielaard de58b8
-      details.v1 = v1;
Mark Wielaard de58b8
-      details.v2 = v2;
Mark Wielaard de58b8
-      details.v3 = v3;
Mark Wielaard de58b8
-      details.m4 = m4;
Mark Wielaard de58b8
-      details.m5 = m5;
Mark Wielaard de58b8
-      details.m6 = m6;
Mark Wielaard de58b8
+      IRTemp result = newTemp(Ity_V128);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+      assign(result, binop(m4 == 2 ? cmp32 : cmp64,
Mark Wielaard de58b8
+                           get_vr_qw(v2), get_vr_qw(v3)));
Mark Wielaard de58b8
+      put_vr_qw(v1, mkexpr(result));
Mark Wielaard de58b8
+      if (s390_vr_is_cs_set(m6)) {
Mark Wielaard de58b8
+         IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
+         assign(cc,
Mark Wielaard de58b8
+                mkite(binop(Iop_CmpEQ64,
Mark Wielaard de58b8
+                            binop(Iop_And64,
Mark Wielaard de58b8
+                                  unop(Iop_V128to64, mkexpr(result)),
Mark Wielaard de58b8
+                                  unop(Iop_V128HIto64, mkexpr(result))),
Mark Wielaard de58b8
+                            mkU64(-1ULL)),
Mark Wielaard de58b8
+                      mkU64(0), /* all comparison results are true */
Mark Wielaard de58b8
+                      mkite(binop(Iop_CmpEQ64,
Mark Wielaard de58b8
+                                  binop(Iop_Or64,
Mark Wielaard de58b8
+                                        unop(Iop_V128to64, mkexpr(result)),
Mark Wielaard de58b8
+                                        unop(Iop_V128HIto64, mkexpr(result))),
Mark Wielaard de58b8
+                                  mkU64(0)),
Mark Wielaard de58b8
+                            mkU64(3), /* all false */
Mark Wielaard de58b8
+                            mkU64(1)))); /* mixed true/false */
Mark Wielaard de58b8
+         s390_cc_set(cc);
Mark Wielaard de58b8
+      }
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
-                            &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
-                            mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
-                                          mkU64(details.serialized)));
Mark Wielaard de58b8
+   return mnem;
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      const UChar elementSize = isSingleElementOp ? sizeof(ULong) : sizeof(V128);
Mark Wielaard de58b8
-      d->nFxState = 3;
Mark Wielaard de58b8
-      vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
-      d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[0].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[1].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
-      d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VFCE(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   return s390_irgen_VFCx(v1, v2, v3, m4, m5, m6, "vfce", Ircr_EQ,
Mark Wielaard de58b8
+                          False, Iop_CmpEQ32Fx4, Iop_CmpEQ64Fx2);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
-      s390_cc_set(cc);
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VFCH(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   /* Swap arguments and compare "low" instead. */
Mark Wielaard de58b8
+   return s390_irgen_VFCx(v1, v3, v2, m4, m5, m6, "vfch", Ircr_LT,
Mark Wielaard de58b8
+                          False, Iop_CmpLT32Fx4, Iop_CmpLT64Fx2);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vfce";
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VFCHE(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   /* Swap arguments and compare "low or equal" instead. */
Mark Wielaard de58b8
+   return s390_irgen_VFCx(v1, v3, v2, m4, m5, m6, "vfche", Ircr_LT,
Mark Wielaard de58b8
+                          True, Iop_CmpLE32Fx4, Iop_CmpLE64Fx2);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VFCH(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+s390_irgen_VFTCI(UChar v1, UChar v2, UShort i3, UChar m4, UChar m5)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   vassert(m4 == 3);
Mark Wielaard de58b8
+   s390_insn_assert("vftci",
Mark Wielaard de58b8
+                    (m4 == 3 || (s390_host_has_vxe && m4 >= 2 && m4 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    Bool isSingleElementOp = s390_vr_is_single_element_control_set(m5);
Mark Wielaard de58b8
-   if (!s390_vr_is_cs_set(m6)) {
Mark Wielaard de58b8
-      if (!isSingleElementOp) {
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_CmpLE64Fx2, get_vr_qw(v3), get_vr_qw(v2)));
Mark Wielaard de58b8
-      } else {
Mark Wielaard de58b8
-         IRExpr* comparisonResult = binop(Iop_CmpF64, get_vr(v2, Ity_F64, 0),
Mark Wielaard de58b8
-                                          get_vr(v3, Ity_F64, 0));
Mark Wielaard de58b8
-         IRExpr* result = mkite(binop(Iop_CmpEQ32, comparisonResult,
Mark Wielaard de58b8
-                                      mkU32(Ircr_GT)),
Mark Wielaard de58b8
-                                mkU64(0xffffffffffffffffULL),
Mark Wielaard de58b8
-                                mkU64(0ULL));
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_64HLtoV128, result, mkU64(0ULL)));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-   else {
Mark Wielaard de58b8
-      IRDirty* d;
Mark Wielaard de58b8
-      IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
-      details.op = S390_VEC_OP_VFCH;
Mark Wielaard de58b8
-      details.v1 = v1;
Mark Wielaard de58b8
-      details.v2 = v2;
Mark Wielaard de58b8
-      details.v3 = v3;
Mark Wielaard de58b8
-      details.m4 = m4;
Mark Wielaard de58b8
-      details.m5 = m5;
Mark Wielaard de58b8
-      details.m6 = m6;
Mark Wielaard de58b8
+   IRDirty* d;
Mark Wielaard de58b8
+   IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
-                            &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
-                            mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
-                                          mkU64(details.serialized)));
Mark Wielaard de58b8
+   s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
+   details.op = S390_VEC_OP_VFTCI;
Mark Wielaard de58b8
+   details.v1 = v1;
Mark Wielaard de58b8
+   details.v2 = v2;
Mark Wielaard de58b8
+   details.i3 = i3;
Mark Wielaard de58b8
+   details.m4 = m4;
Mark Wielaard de58b8
+   details.m5 = m5;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      const UChar elementSize = isSingleElementOp ? sizeof(ULong) : sizeof(V128);
Mark Wielaard de58b8
-      d->nFxState = 3;
Mark Wielaard de58b8
-      vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
-      d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[0].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[1].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
-      d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
+   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
+                         &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
+                         mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
+                                       mkU64(details.serialized)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
-      s390_cc_set(cc);
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+   const UChar elementSize = isSingleElementOp ?
Mark Wielaard de58b8
+      sizeofIRType(s390_vr_get_ftype(m4)) : sizeof(V128);
Mark Wielaard de58b8
+   d->nFxState = 2;
Mark Wielaard de58b8
+   vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
+   d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[0].size = elementSize;
Mark Wielaard de58b8
+   d->fxState[1].fx = Ifx_Write;
Mark Wielaard de58b8
+   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].size = sizeof(V128);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
+   s390_cc_set(cc);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vfch";
Mark Wielaard de58b8
+   return "vftci";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VFCHE(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
+s390_irgen_VFMIN(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vfche", m4 == 3);
Mark Wielaard de58b8
+   s390_insn_assert("vfmin",
Mark Wielaard de58b8
+                    (m4 == 3 || (s390_host_has_vxe && m4 >= 2 && m4 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    Bool isSingleElementOp = s390_vr_is_single_element_control_set(m5);
Mark Wielaard de58b8
-   if (!s390_vr_is_cs_set(m6)) {
Mark Wielaard de58b8
-      if (!isSingleElementOp) {
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_CmpLT64Fx2, get_vr_qw(v3), get_vr_qw(v2)));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-      else {
Mark Wielaard de58b8
-         IRExpr* comparisonResult = binop(Iop_CmpF64, get_vr(v3, Ity_F64, 0),
Mark Wielaard de58b8
-                                          get_vr(v2, Ity_F64, 0));
Mark Wielaard de58b8
-         IRExpr* result = mkite(binop(Iop_CmpEQ32, comparisonResult,
Mark Wielaard de58b8
-                                      mkU32(Ircr_LT)),
Mark Wielaard de58b8
-                                mkU64(0xffffffffffffffffULL),
Mark Wielaard de58b8
-                                mkU64(0ULL));
Mark Wielaard de58b8
-         put_vr_qw(v1, binop(Iop_64HLtoV128, result, mkU64(0ULL)));
Mark Wielaard de58b8
-      }
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
-   else {
Mark Wielaard de58b8
-      IRDirty* d;
Mark Wielaard de58b8
-      IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
-      s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
-      details.op = S390_VEC_OP_VFCHE;
Mark Wielaard de58b8
-      details.v1 = v1;
Mark Wielaard de58b8
-      details.v2 = v2;
Mark Wielaard de58b8
-      details.v3 = v3;
Mark Wielaard de58b8
-      details.m4 = m4;
Mark Wielaard de58b8
-      details.m5 = m5;
Mark Wielaard de58b8
-      details.m6 = m6;
Mark Wielaard de58b8
+   IRDirty* d;
Mark Wielaard de58b8
+   IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
-                            &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
-                            mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
-                                          mkU64(details.serialized)));
Mark Wielaard de58b8
+   s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
+   details.op = S390_VEC_OP_VFMIN;
Mark Wielaard de58b8
+   details.v1 = v1;
Mark Wielaard de58b8
+   details.v2 = v2;
Mark Wielaard de58b8
+   details.v3 = v3;
Mark Wielaard de58b8
+   details.m4 = m4;
Mark Wielaard de58b8
+   details.m5 = m5;
Mark Wielaard de58b8
+   details.m6 = m6;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      const UChar elementSize = isSingleElementOp ? sizeof(ULong) : sizeof(V128);
Mark Wielaard de58b8
-      d->nFxState = 3;
Mark Wielaard de58b8
-      vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
-      d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[0].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
-      d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[1].size = elementSize;
Mark Wielaard de58b8
-      d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
-      d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
-      d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
+   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
+                         &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
+                         mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
+                                       mkU64(details.serialized)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-      stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
-      s390_cc_set(cc);
Mark Wielaard de58b8
-   }
Mark Wielaard de58b8
+   const UChar elementSize = isSingleElementOp ?
Mark Wielaard de58b8
+      sizeofIRType(s390_vr_get_ftype(m4)) : sizeof(V128);
Mark Wielaard de58b8
+   d->nFxState = 3;
Mark Wielaard de58b8
+   vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
+   d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[0].size = elementSize;
Mark Wielaard de58b8
+   d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].size = elementSize;
Mark Wielaard de58b8
+   d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
+   d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vfche";
Mark Wielaard de58b8
+   stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
+   s390_cc_set(cc);
Mark Wielaard de58b8
+   return "vfmin";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 static const HChar *
Mark Wielaard de58b8
-s390_irgen_VFTCI(UChar v1, UChar v2, UShort i3, UChar m4, UChar m5)
Mark Wielaard de58b8
+s390_irgen_VFMAX(UChar v1, UChar v2, UChar v3, UChar m4, UChar m5, UChar m6)
Mark Wielaard de58b8
 {
Mark Wielaard de58b8
-   s390_insn_assert("vftci", m4 == 3);
Mark Wielaard de58b8
+   s390_insn_assert("vfmax",
Mark Wielaard de58b8
+                    (m4 == 3 || (s390_host_has_vxe && m4 >= 2 && m4 <= 4)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    Bool isSingleElementOp = s390_vr_is_single_element_control_set(m5);
Mark Wielaard de58b8
-
Mark Wielaard de58b8
    IRDirty* d;
Mark Wielaard de58b8
    IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
-   details.op = S390_VEC_OP_VFTCI;
Mark Wielaard de58b8
+   details.op = S390_VEC_OP_VFMAX;
Mark Wielaard de58b8
    details.v1 = v1;
Mark Wielaard de58b8
    details.v2 = v2;
Mark Wielaard de58b8
-   details.i3 = i3;
Mark Wielaard de58b8
+   details.v3 = v3;
Mark Wielaard de58b8
    details.m4 = m4;
Mark Wielaard de58b8
    details.m5 = m5;
Mark Wielaard de58b8
+   details.m6 = m6;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
                          &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
                          mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
                                        mkU64(details.serialized)));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   const UChar elementSize = isSingleElementOp ? sizeof(ULong) : sizeof(V128);
Mark Wielaard de58b8
-   d->nFxState = 2;
Mark Wielaard de58b8
+   const UChar elementSize = isSingleElementOp ?
Mark Wielaard de58b8
+      sizeofIRType(s390_vr_get_ftype(m4)) : sizeof(V128);
Mark Wielaard de58b8
+   d->nFxState = 3;
Mark Wielaard de58b8
    vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
    d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
    d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
    d->fxState[0].size = elementSize;
Mark Wielaard de58b8
-   d->fxState[1].fx = Ifx_Write;
Mark Wielaard de58b8
-   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
-   d->fxState[1].size = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].size = elementSize;
Mark Wielaard de58b8
+   d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
+   d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
    s390_cc_set(cc);
Mark Wielaard de58b8
+   return "vfmax";
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
 
Mark Wielaard de58b8
-   return "vftci";
Mark Wielaard de58b8
+static const HChar *
Mark Wielaard de58b8
+s390_irgen_VBPERM(UChar v1, UChar v2, UChar v3)
Mark Wielaard de58b8
+{
Mark Wielaard de58b8
+   IRDirty* d;
Mark Wielaard de58b8
+   IRTemp cc = newTemp(Ity_I64);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   s390x_vec_op_details_t details = { .serialized = 0ULL };
Mark Wielaard de58b8
+   details.op = S390_VEC_OP_VBPERM;
Mark Wielaard de58b8
+   details.v1 = v1;
Mark Wielaard de58b8
+   details.v2 = v2;
Mark Wielaard de58b8
+   details.v3 = v3;
Mark Wielaard de58b8
+   details.m4 = 0;
Mark Wielaard de58b8
+   details.m5 = 0;
Mark Wielaard de58b8
+   details.m6 = 0;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_vec_op",
Mark Wielaard de58b8
+                         &s390x_dirtyhelper_vec_op,
Mark Wielaard de58b8
+                         mkIRExprVec_2(IRExpr_GSPTR(),
Mark Wielaard de58b8
+                                       mkU64(details.serialized)));
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   d->nFxState = 3;
Mark Wielaard de58b8
+   vex_bzero(&d->fxState, sizeof(d->fxState));
Mark Wielaard de58b8
+   d->fxState[0].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_v0) + v2 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[0].size = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].fx = Ifx_Read;
Mark Wielaard de58b8
+   d->fxState[1].offset = S390X_GUEST_OFFSET(guest_v0) + v3 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[1].size = sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].fx = Ifx_Write;
Mark Wielaard de58b8
+   d->fxState[2].offset = S390X_GUEST_OFFSET(guest_v0) + v1 * sizeof(V128);
Mark Wielaard de58b8
+   d->fxState[2].size = sizeof(V128);
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+   stmt(IRStmt_Dirty(d));
Mark Wielaard de58b8
+   s390_cc_set(cc);
Mark Wielaard de58b8
+   return "vbperm";
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /* New insns are added here.
Mark Wielaard 3e351e
@@ -20489,11 +20754,23 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
                                                 RXY_dl2(ovl),
Mark Wielaard de58b8
                                                 RXY_dh2(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe60000000034ULL: /* VPKZ */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe60000000035ULL: /* VLRL */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe60000000037ULL: /* VLRLR */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe60000000035ULL: s390_format_VSI_URDV(s390_irgen_VLRL, VSI_v1(ovl),
Mark Wielaard de58b8
+                                                VSI_b2(ovl), VSI_d2(ovl),
Mark Wielaard de58b8
+                                                VSI_i3(ovl),
Mark Wielaard de58b8
+                                                VSI_rxb(ovl)); goto ok;
Mark Wielaard de58b8
+   case 0xe60000000037ULL: s390_format_VRS_RRDV(s390_irgen_VLRLR, VRSd_v1(ovl),
Mark Wielaard de58b8
+                                                VRSd_r3(ovl), VRS_b2(ovl),
Mark Wielaard de58b8
+                                                VRS_d2(ovl),
Mark Wielaard de58b8
+                                                VRS_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe6000000003cULL: /* VUPKZ */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe6000000003dULL: /* VSTRL */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe6000000003fULL: /* VSTRLR */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe6000000003dULL:  s390_format_VSI_URDV(s390_irgen_VSTRL, VSI_v1(ovl),
Mark Wielaard de58b8
+                                                 VSI_b2(ovl), VSI_d2(ovl),
Mark Wielaard de58b8
+                                                 VSI_i3(ovl),
Mark Wielaard de58b8
+                                                 VSI_rxb(ovl)); goto ok;
Mark Wielaard de58b8
+   case 0xe6000000003fULL: s390_format_VRS_RRDV(s390_irgen_VSTRLR, VRSd_v1(ovl),
Mark Wielaard de58b8
+                                                VRSd_r3(ovl), VRS_b2(ovl),
Mark Wielaard de58b8
+                                                VRS_d2(ovl),
Mark Wielaard de58b8
+                                                VRS_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe60000000049ULL: /* VLIP */ goto unimplemented;
Mark Wielaard de58b8
    case 0xe60000000050ULL: /* VCVB */ goto unimplemented;
Mark Wielaard de58b8
    case 0xe60000000052ULL: /* VCVBG */ goto unimplemented;
Mark Wielaard 3e351e
@@ -20691,12 +20968,18 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
    case 0xe7000000006bULL: s390_format_VRR_VVV(s390_irgen_VNO, VRR_v1(ovl),
Mark Wielaard de58b8
                                                VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
-   case 0xe7000000006cULL: /* VNX */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe7000000006cULL: s390_format_VRR_VVV(s390_irgen_VNX, VRR_v1(ovl),
Mark Wielaard de58b8
+                                               VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
+                                               VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe7000000006dULL: s390_format_VRR_VVV(s390_irgen_VX, VRR_v1(ovl),
Mark Wielaard de58b8
                                                VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
-   case 0xe7000000006eULL: /* VNN */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe7000000006fULL: /* VOC */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe7000000006eULL: s390_format_VRR_VVV(s390_irgen_VNN, VRR_v1(ovl),
Mark Wielaard de58b8
+                                               VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
+                                               VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
+   case 0xe7000000006fULL: s390_format_VRR_VVV(s390_irgen_VOC, VRR_v1(ovl),
Mark Wielaard de58b8
+                                               VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
+                                               VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe70000000070ULL: s390_format_VRR_VVVM(s390_irgen_VESLV, VRR_v1(ovl),
Mark Wielaard de58b8
                                                 VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                 VRR_m4(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard 3e351e
@@ -20749,7 +21032,9 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
    case 0xe70000000084ULL: s390_format_VRR_VVVM(s390_irgen_VPDI, VRR_v1(ovl),
Mark Wielaard de58b8
                                                VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                VRR_m4(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
-   case 0xe70000000085ULL: /* VBPERM */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe70000000085ULL: s390_format_VRR_VVV(s390_irgen_VBPERM, VRR_v1(ovl),
Mark Wielaard de58b8
+                                               VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
+                                               VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe7000000008aULL: s390_format_VRR_VVVVMM(s390_irgen_VSTRC, VRRd_v1(ovl),
Mark Wielaard de58b8
                                                   VRRd_v2(ovl), VRRd_v3(ovl),
Mark Wielaard de58b8
                                                   VRRd_v4(ovl), VRRd_m5(ovl),
Mark Wielaard 3e351e
@@ -20780,8 +21065,16 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
    case 0xe70000000097ULL: s390_format_VRR_VVVMM(s390_irgen_VPKS, VRR_v1(ovl),
Mark Wielaard de58b8
                                                VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                VRR_m4(ovl), VRR_m5(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
-   case 0xe7000000009eULL: /* VFNMS */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe7000000009fULL: /* VFNMA */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe7000000009eULL: s390_format_VRR_VVVVMM(s390_irgen_VFNMS, VRRe_v1(ovl),
Mark Wielaard de58b8
+                                                  VRRe_v2(ovl), VRRe_v3(ovl),
Mark Wielaard de58b8
+                                                  VRRe_v4(ovl), VRRe_m5(ovl),
Mark Wielaard de58b8
+                                                  VRRe_m6(ovl),
Mark Wielaard de58b8
+                                                  VRRe_rxb(ovl));  goto ok;
Mark Wielaard de58b8
+   case 0xe7000000009fULL: s390_format_VRR_VVVVMM(s390_irgen_VFNMA, VRRe_v1(ovl),
Mark Wielaard de58b8
+                                                  VRRe_v2(ovl), VRRe_v3(ovl),
Mark Wielaard de58b8
+                                                  VRRe_v4(ovl), VRRe_m5(ovl),
Mark Wielaard de58b8
+                                                  VRRe_m6(ovl),
Mark Wielaard de58b8
+                                                  VRRe_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe700000000a1ULL: s390_format_VRR_VVVM(s390_irgen_VMLH, VRR_v1(ovl),
Mark Wielaard de58b8
                                                 VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                 VRR_m4(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard 3e351e
@@ -20834,7 +21127,11 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
    case 0xe700000000b4ULL: s390_format_VRR_VVVM(s390_irgen_VGFM, VRR_v1(ovl),
Mark Wielaard de58b8
                                                 VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                 VRR_m4(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
-   case 0xe700000000b8ULL: /* VMSL */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe700000000b8ULL: s390_format_VRR_VVVVMM(s390_irgen_VMSL, VRRd_v1(ovl),
Mark Wielaard de58b8
+                                                  VRRd_v2(ovl), VRRd_v3(ovl),
Mark Wielaard de58b8
+                                                  VRRd_v4(ovl), VRRd_m5(ovl),
Mark Wielaard de58b8
+                                                  VRRd_m6(ovl),
Mark Wielaard de58b8
+                                                  VRRd_rxb(ovl));  goto ok;
Mark Wielaard de58b8
    case 0xe700000000b9ULL: s390_format_VRRd_VVVVM(s390_irgen_VACCC, VRRd_v1(ovl),
Mark Wielaard de58b8
                                                   VRRd_v2(ovl), VRRd_v3(ovl),
Mark Wielaard de58b8
                                                   VRRd_v4(ovl), VRRd_m5(ovl),
Mark Wielaard 3e351e
@@ -20871,11 +21168,11 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
                                                   VRRa_v2(ovl), VRRa_m3(ovl),
Mark Wielaard de58b8
                                                   VRRa_m4(ovl), VRRa_m5(ovl),
Mark Wielaard de58b8
                                                   VRRa_rxb(ovl)); goto ok;
Mark Wielaard de58b8
-   case 0xe700000000c4ULL: s390_format_VRRa_VVMMM(s390_irgen_VLDE, VRRa_v1(ovl),
Mark Wielaard de58b8
+   case 0xe700000000c4ULL: s390_format_VRRa_VVMMM(s390_irgen_VFLL, VRRa_v1(ovl),
Mark Wielaard de58b8
                                                   VRRa_v2(ovl), VRRa_m3(ovl),
Mark Wielaard de58b8
                                                   VRRa_m4(ovl), VRRa_m5(ovl),
Mark Wielaard de58b8
                                                   VRRa_rxb(ovl)); goto ok;
Mark Wielaard de58b8
-   case 0xe700000000c5ULL: s390_format_VRRa_VVMMM(s390_irgen_VLED, VRRa_v1(ovl),
Mark Wielaard de58b8
+   case 0xe700000000c5ULL: s390_format_VRRa_VVMMM(s390_irgen_VFLR, VRRa_v1(ovl),
Mark Wielaard de58b8
                                                   VRRa_v2(ovl), VRRa_m3(ovl),
Mark Wielaard de58b8
                                                   VRRa_m4(ovl), VRRa_m5(ovl),
Mark Wielaard de58b8
                                                   VRRa_rxb(ovl)); goto ok;
Mark Wielaard 3e351e
@@ -20956,8 +21253,16 @@ s390_decode_6byte_and_irgen(const UChar *bytes)
Mark Wielaard de58b8
                                                    VRRa_m3(ovl), VRRa_m4(ovl),
Mark Wielaard de58b8
                                                    VRRa_m5(ovl),
Mark Wielaard de58b8
                                                    VRRa_rxb(ovl)); goto ok;
Mark Wielaard de58b8
-   case 0xe700000000eeULL: /* VFMIN */ goto unimplemented;
Mark Wielaard de58b8
-   case 0xe700000000efULL: /* VFMAX */ goto unimplemented;
Mark Wielaard de58b8
+   case 0xe700000000eeULL: s390_format_VRRa_VVVMMM(s390_irgen_VFMIN, VRRa_v1(ovl),
Mark Wielaard de58b8
+                                                   VRRa_v2(ovl), VRRa_v3(ovl),
Mark Wielaard de58b8
+                                                   VRRa_m3(ovl), VRRa_m4(ovl),
Mark Wielaard de58b8
+                                                   VRRa_m5(ovl),
Mark Wielaard de58b8
+                                                   VRRa_rxb(ovl)); goto ok;
Mark Wielaard de58b8
+   case 0xe700000000efULL: s390_format_VRRa_VVVMMM(s390_irgen_VFMAX, VRRa_v1(ovl),
Mark Wielaard de58b8
+                                                   VRRa_v2(ovl), VRRa_v3(ovl),
Mark Wielaard de58b8
+                                                   VRRa_m3(ovl), VRRa_m4(ovl),
Mark Wielaard de58b8
+                                                   VRRa_m5(ovl),
Mark Wielaard de58b8
+                                                   VRRa_rxb(ovl)); goto ok;
Mark Wielaard de58b8
    case 0xe700000000f0ULL: s390_format_VRR_VVVM(s390_irgen_VAVGL, VRR_v1(ovl),
Mark Wielaard de58b8
                                                 VRR_v2(ovl), VRR_r3(ovl),
Mark Wielaard de58b8
                                                 VRR_m4(ovl), VRR_rxb(ovl));  goto ok;
Mark Wielaard de58b8
diff --git a/VEX/priv/host_s390_defs.c b/VEX/priv/host_s390_defs.c
Mark Wielaard 3e351e
index 3b6121fec..8762975b2 100644
Mark Wielaard de58b8
--- a/VEX/priv/host_s390_defs.c
Mark Wielaard de58b8
+++ b/VEX/priv/host_s390_defs.c
Mark Wielaard 3e351e
@@ -8,7 +8,7 @@
Mark Wielaard 3e351e
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 3e351e
    framework.
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
-   Copyright IBM Corp. 2010-2017
Mark Wielaard 3e351e
+   Copyright IBM Corp. 2010-2020
Mark Wielaard 3e351e
    Copyright (C) 2012-2017  Florian Krohm   (britzel@acm.org)
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
    This program is free software; you can redistribute it and/or
Mark Wielaard de58b8
@@ -684,6 +684,8 @@ s390_insn* genMove_S390(HReg from, HReg to, Bool mode64)
Mark Wielaard de58b8
    switch (hregClass(from)) {
Mark Wielaard de58b8
    case HRcInt64:
Mark Wielaard de58b8
       return s390_insn_move(sizeofIRType(Ity_I64), to, from);
Mark Wielaard de58b8
+   case HRcFlt64:
Mark Wielaard de58b8
+      return s390_insn_move(sizeofIRType(Ity_F64), to, from);
Mark Wielaard de58b8
    case HRcVec128:
Mark Wielaard de58b8
       return s390_insn_move(sizeofIRType(Ity_V128), to, from);
Mark Wielaard de58b8
    default:
Mark Wielaard de58b8
@@ -7870,6 +7872,10 @@ s390_insn_as_string(const s390_insn *insn)
Mark Wielaard de58b8
          op = "v-vfloatabs";
Mark Wielaard de58b8
          break;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case S390_VEC_FLOAT_NABS:
Mark Wielaard de58b8
+         op = "v-vfloatnabs";
Mark Wielaard de58b8
+         break;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       default:
Mark Wielaard de58b8
          goto fail;
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
@@ -9439,21 +9445,28 @@ s390_insn_unop_emit(UChar *buf, const s390_insn *insn)
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    case S390_VEC_FLOAT_NEG: {
Mark Wielaard de58b8
       vassert(insn->variant.unop.src.tag == S390_OPND_REG);
Mark Wielaard de58b8
-      vassert(insn->size == 8);
Mark Wielaard de58b8
+      vassert(insn->size >= 4);
Mark Wielaard de58b8
       UChar v1 = hregNumber(insn->variant.unop.dst);
Mark Wielaard de58b8
       UChar v2 = hregNumber(insn->variant.unop.src.variant.reg);
Mark Wielaard de58b8
       return s390_emit_VFPSO(buf, v1, v2, s390_getM_from_size(insn->size), 0, 0);
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
    case S390_VEC_FLOAT_ABS: {
Mark Wielaard de58b8
       vassert(insn->variant.unop.src.tag == S390_OPND_REG);
Mark Wielaard de58b8
-      vassert(insn->size == 8);
Mark Wielaard de58b8
+      vassert(insn->size >= 4);
Mark Wielaard de58b8
       UChar v1 = hregNumber(insn->variant.unop.dst);
Mark Wielaard de58b8
       UChar v2 = hregNumber(insn->variant.unop.src.variant.reg);
Mark Wielaard de58b8
       return s390_emit_VFPSO(buf, v1, v2, s390_getM_from_size(insn->size), 0, 2);
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
+   case S390_VEC_FLOAT_NABS: {
Mark Wielaard de58b8
+      vassert(insn->variant.unop.src.tag == S390_OPND_REG);
Mark Wielaard de58b8
+      vassert(insn->size >= 4);
Mark Wielaard de58b8
+      UChar v1 = hregNumber(insn->variant.unop.dst);
Mark Wielaard de58b8
+      UChar v2 = hregNumber(insn->variant.unop.src.variant.reg);
Mark Wielaard de58b8
+      return s390_emit_VFPSO(buf, v1, v2, s390_getM_from_size(insn->size), 0, 1);
Mark Wielaard de58b8
+   }
Mark Wielaard de58b8
    case S390_VEC_FLOAT_SQRT: {
Mark Wielaard de58b8
       vassert(insn->variant.unop.src.tag == S390_OPND_REG);
Mark Wielaard de58b8
-      vassert(insn->size == 8);
Mark Wielaard de58b8
+      vassert(insn->size >= 4);
Mark Wielaard de58b8
       UChar v1 = hregNumber(insn->variant.unop.dst);
Mark Wielaard de58b8
       UChar v2 = hregNumber(insn->variant.unop.src.variant.reg);
Mark Wielaard de58b8
       return s390_emit_VFSQ(buf, v1, v2, s390_getM_from_size(insn->size), 0);
Mark Wielaard de58b8
diff --git a/VEX/priv/host_s390_defs.h b/VEX/priv/host_s390_defs.h
Mark Wielaard 3e351e
index 3f6473e10..9b69f4d38 100644
Mark Wielaard de58b8
--- a/VEX/priv/host_s390_defs.h
Mark Wielaard de58b8
+++ b/VEX/priv/host_s390_defs.h
Mark Wielaard 3e351e
@@ -8,7 +8,7 @@
Mark Wielaard 3e351e
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 3e351e
    framework.
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
-   Copyright IBM Corp. 2010-2017
Mark Wielaard 3e351e
+   Copyright IBM Corp. 2010-2020
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
    This program is free software; you can redistribute it and/or
Mark Wielaard 3e351e
    modify it under the terms of the GNU General Public License as
Mark Wielaard de58b8
@@ -205,6 +205,7 @@ typedef enum {
Mark Wielaard de58b8
    S390_VEC_COUNT_ONES,
Mark Wielaard de58b8
    S390_VEC_FLOAT_NEG,
Mark Wielaard de58b8
    S390_VEC_FLOAT_ABS,
Mark Wielaard de58b8
+   S390_VEC_FLOAT_NABS,
Mark Wielaard de58b8
    S390_VEC_FLOAT_SQRT,
Mark Wielaard de58b8
    S390_UNOP_T_INVALID
Mark Wielaard de58b8
 } s390_unop_t;
Mark Wielaard de58b8
@@ -931,6 +932,8 @@ extern UInt s390_host_hwcaps;
Mark Wielaard de58b8
                       (s390_host_hwcaps & (VEX_HWCAPS_S390X_MSA5))
Mark Wielaard de58b8
 #define s390_host_has_lsc2 \
Mark Wielaard de58b8
                       (s390_host_hwcaps & (VEX_HWCAPS_S390X_LSC2))
Mark Wielaard de58b8
+#define s390_host_has_vxe \
Mark Wielaard de58b8
+                      (s390_host_hwcaps & (VEX_HWCAPS_S390X_VXE))
Mark Wielaard de58b8
 #endif /* ndef __VEX_HOST_S390_DEFS_H */
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /*---------------------------------------------------------------*/
Mark Wielaard de58b8
diff --git a/VEX/priv/host_s390_isel.c b/VEX/priv/host_s390_isel.c
Mark Wielaard 3e351e
index 134f3eb6f..2f9854038 100644
Mark Wielaard de58b8
--- a/VEX/priv/host_s390_isel.c
Mark Wielaard de58b8
+++ b/VEX/priv/host_s390_isel.c
Mark Wielaard 3e351e
@@ -8,7 +8,7 @@
Mark Wielaard 3e351e
    This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 3e351e
    framework.
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
-   Copyright IBM Corp. 2010-2017
Mark Wielaard 3e351e
+   Copyright IBM Corp. 2010-2020
Mark Wielaard 3e351e
    Copyright (C) 2012-2017  Florian Krohm   (britzel@acm.org)
Mark Wielaard 3e351e
 
Mark Wielaard 3e351e
    This program is free software; you can redistribute it and/or
Mark Wielaard de58b8
@@ -2362,9 +2362,10 @@ s390_isel_float128_expr_wrk(HReg *dst_hi, HReg *dst_lo, ISelEnv *env,
Mark Wielaard de58b8
       case Iop_NegF128:
Mark Wielaard de58b8
          if (left->tag == Iex_Unop &&
Mark Wielaard de58b8
              (left->Iex.Unop.op == Iop_AbsF32 ||
Mark Wielaard de58b8
-              left->Iex.Unop.op == Iop_AbsF64))
Mark Wielaard de58b8
+              left->Iex.Unop.op == Iop_AbsF64)) {
Mark Wielaard de58b8
             bfpop = S390_BFP_NABS;
Mark Wielaard de58b8
-         else
Mark Wielaard de58b8
+            left = left->Iex.Unop.arg;
Mark Wielaard de58b8
+         } else
Mark Wielaard de58b8
             bfpop = S390_BFP_NEG;
Mark Wielaard de58b8
          goto float128_opnd;
Mark Wielaard de58b8
       case Iop_AbsF128:     bfpop = S390_BFP_ABS;         goto float128_opnd;
Mark Wielaard de58b8
@@ -2726,9 +2727,10 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
Mark Wielaard de58b8
       case Iop_NegF64:
Mark Wielaard de58b8
          if (left->tag == Iex_Unop &&
Mark Wielaard de58b8
              (left->Iex.Unop.op == Iop_AbsF32 ||
Mark Wielaard de58b8
-              left->Iex.Unop.op == Iop_AbsF64))
Mark Wielaard de58b8
+              left->Iex.Unop.op == Iop_AbsF64)) {
Mark Wielaard de58b8
             bfpop = S390_BFP_NABS;
Mark Wielaard de58b8
-         else
Mark Wielaard de58b8
+            left = left->Iex.Unop.arg;
Mark Wielaard de58b8
+         } else
Mark Wielaard de58b8
             bfpop = S390_BFP_NEG;
Mark Wielaard de58b8
          break;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
@@ -3944,11 +3946,27 @@ s390_isel_vec_expr_wrk(ISelEnv *env, IRExpr *expr)
Mark Wielaard de58b8
          vec_unop = S390_VEC_COUNT_ONES;
Mark Wielaard de58b8
          goto Iop_V_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_Neg32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_unop = S390_VEC_FLOAT_NEG;
Mark Wielaard de58b8
+         if (arg->tag == Iex_Unop && arg->Iex.Unop.op == Iop_Abs32Fx4) {
Mark Wielaard de58b8
+            vec_unop = S390_VEC_FLOAT_NABS;
Mark Wielaard de58b8
+            arg = arg->Iex.Unop.arg;
Mark Wielaard de58b8
+         }
Mark Wielaard de58b8
+         goto Iop_V_wrk;
Mark Wielaard de58b8
       case Iop_Neg64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_unop = S390_VEC_FLOAT_NEG;
Mark Wielaard de58b8
+         if (arg->tag == Iex_Unop && arg->Iex.Unop.op == Iop_Abs64Fx2) {
Mark Wielaard de58b8
+            vec_unop = S390_VEC_FLOAT_NABS;
Mark Wielaard de58b8
+            arg = arg->Iex.Unop.arg;
Mark Wielaard de58b8
+         }
Mark Wielaard de58b8
          goto Iop_V_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_Abs32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_unop = S390_VEC_FLOAT_ABS;
Mark Wielaard de58b8
+         goto Iop_V_wrk;
Mark Wielaard de58b8
       case Iop_Abs64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_unop = S390_VEC_FLOAT_ABS;
Mark Wielaard de58b8
@@ -4474,17 +4492,29 @@ s390_isel_vec_expr_wrk(ISelEnv *env, IRExpr *expr)
Mark Wielaard de58b8
          vec_binop = S390_VEC_ELEM_ROLL_V;
Mark Wielaard de58b8
          goto Iop_VV_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_CmpEQ32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_COMPARE_EQUAL;
Mark Wielaard de58b8
+         goto Iop_VV_wrk;
Mark Wielaard de58b8
       case Iop_CmpEQ64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_COMPARE_EQUAL;
Mark Wielaard de58b8
          goto Iop_VV_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_CmpLE32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_COMPARE_LESS_OR_EQUAL;
Mark Wielaard de58b8
+         goto Iop_VV_wrk;
Mark Wielaard de58b8
       case Iop_CmpLE64Fx2: {
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_COMPARE_LESS_OR_EQUAL;
Mark Wielaard de58b8
          goto Iop_VV_wrk;
Mark Wielaard de58b8
       }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_CmpLT32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_COMPARE_LESS;
Mark Wielaard de58b8
+         goto Iop_VV_wrk;
Mark Wielaard de58b8
       case Iop_CmpLT64Fx2: {
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_COMPARE_LESS;
Mark Wielaard de58b8
@@ -4671,20 +4701,41 @@ s390_isel_vec_expr_wrk(ISelEnv *env, IRExpr *expr)
Mark Wielaard de58b8
                                            dst, reg1, reg2, reg3));
Mark Wielaard de58b8
          return dst;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_Add32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_ADD;
Mark Wielaard de58b8
+         goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       case Iop_Add64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_ADD;
Mark Wielaard de58b8
          goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_Sub32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_SUB;
Mark Wielaard de58b8
+         goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       case Iop_Sub64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_SUB;
Mark Wielaard de58b8
          goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      case Iop_Mul32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_MUL;
Mark Wielaard de58b8
+         goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       case Iop_Mul64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_MUL;
Mark Wielaard de58b8
          goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
+      case Iop_Div32Fx4:
Mark Wielaard de58b8
+         size = 4;
Mark Wielaard de58b8
+         vec_binop = S390_VEC_FLOAT_DIV;
Mark Wielaard de58b8
+         goto Iop_irrm_VV_wrk;
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       case Iop_Div64Fx2:
Mark Wielaard de58b8
          size = 8;
Mark Wielaard de58b8
          vec_binop = S390_VEC_FLOAT_DIV;
Mark Wielaard de58b8
diff --git a/VEX/priv/main_main.c b/VEX/priv/main_main.c
Mark Wielaard de58b8
index 72f419988..12f521d8c 100644
Mark Wielaard de58b8
--- a/VEX/priv/main_main.c
Mark Wielaard de58b8
+++ b/VEX/priv/main_main.c
Mark Wielaard de58b8
@@ -1795,6 +1795,7 @@ static const HChar* show_hwcaps_s390x ( UInt hwcaps )
Mark Wielaard de58b8
       { VEX_HWCAPS_S390X_MSA5,  "msa5" },
Mark Wielaard de58b8
       { VEX_HWCAPS_S390X_MI2,   "mi2" },
Mark Wielaard de58b8
       { VEX_HWCAPS_S390X_LSC2,  "lsc2" },
Mark Wielaard de58b8
+      { VEX_HWCAPS_S390X_LSC2,  "vxe" },
Mark Wielaard de58b8
    };
Mark Wielaard de58b8
    /* Allocate a large enough buffer */
Mark Wielaard de58b8
    static HChar buf[sizeof prefix + 
Mark Wielaard de58b8
diff --git a/VEX/pub/libvex.h b/VEX/pub/libvex.h
Mark Wielaard de58b8
index 53e3705da..2ffed0ad0 100644
Mark Wielaard de58b8
--- a/VEX/pub/libvex.h
Mark Wielaard de58b8
+++ b/VEX/pub/libvex.h
Mark Wielaard de58b8
@@ -171,7 +171,7 @@ typedef
Mark Wielaard de58b8
 #define VEX_HWCAPS_S390X_MSA5  (1<<19)  /* message security assistance facility */
Mark Wielaard de58b8
 #define VEX_HWCAPS_S390X_MI2   (1<<20)  /* miscellaneous-instruction-extensions facility 2 */
Mark Wielaard de58b8
 #define VEX_HWCAPS_S390X_LSC2  (1<<21)  /* Conditional load/store facility2 */
Mark Wielaard de58b8
-
Mark Wielaard de58b8
+#define VEX_HWCAPS_S390X_VXE   (1<<22)  /* Vector-enhancements facility */
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 /* Special value representing all available s390x hwcaps */
Mark Wielaard de58b8
 #define VEX_HWCAPS_S390X_ALL   (VEX_HWCAPS_S390X_LDISP | \
Mark Wielaard de58b8
@@ -189,7 +189,8 @@ typedef
Mark Wielaard de58b8
                                 VEX_HWCAPS_S390X_VX    | \
Mark Wielaard de58b8
                                 VEX_HWCAPS_S390X_MSA5  | \
Mark Wielaard de58b8
                                 VEX_HWCAPS_S390X_MI2   | \
Mark Wielaard de58b8
-                                VEX_HWCAPS_S390X_LSC2)
Mark Wielaard de58b8
+                                VEX_HWCAPS_S390X_LSC2  | \
Mark Wielaard de58b8
+                                VEX_HWCAPS_S390X_VXE)
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 #define VEX_HWCAPS_S390X(x)  ((x) & ~VEX_S390X_MODEL_MASK)
Mark Wielaard de58b8
 #define VEX_S390X_MODEL(x)   ((x) &  VEX_S390X_MODEL_MASK)
Mark Wielaard de58b8
diff --git a/VEX/pub/libvex_emnote.h b/VEX/pub/libvex_emnote.h
Mark Wielaard de58b8
index be033b4da..77880a270 100644
Mark Wielaard de58b8
--- a/VEX/pub/libvex_emnote.h
Mark Wielaard de58b8
+++ b/VEX/pub/libvex_emnote.h
Mark Wielaard de58b8
@@ -124,6 +124,10 @@ typedef
Mark Wielaard de58b8
       /* ppno insn is not supported on this host */
Mark Wielaard de58b8
       EmFail_S390X_ppno,
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+      /* insn needs vector-enhancements facility which is not available on this
Mark Wielaard de58b8
+         host */
Mark Wielaard de58b8
+      EmFail_S390X_vxe,
Mark Wielaard de58b8
+
Mark Wielaard de58b8
       EmNote_NUMBER
Mark Wielaard de58b8
    }
Mark Wielaard de58b8
    VexEmNote;
Mark Wielaard de58b8
diff --git a/coregrind/m_initimg/initimg-linux.c b/coregrind/m_initimg/initimg-linux.c
Mark Wielaard de58b8
index 365942c4f..ba84fa6e9 100644
Mark Wielaard de58b8
--- a/coregrind/m_initimg/initimg-linux.c
Mark Wielaard de58b8
+++ b/coregrind/m_initimg/initimg-linux.c
Mark Wielaard de58b8
@@ -697,9 +697,13 @@ Addr setup_client_stack( void*  init_sp,
Mark Wielaard de58b8
             }
Mark Wielaard de58b8
 #           elif defined(VGP_s390x_linux)
Mark Wielaard de58b8
             {
Mark Wielaard de58b8
-               /* Advertise hardware features "below" TE and VXRS.  TE itself
Mark Wielaard de58b8
-                  and anything above VXRS is not supported by Valgrind. */
Mark Wielaard de58b8
-               auxv->u.a_val &= (VKI_HWCAP_S390_TE - 1) | VKI_HWCAP_S390_VXRS;
Mark Wielaard de58b8
+               /* Out of the hardware features available on the platform,
Mark Wielaard de58b8
+                  advertise those "below" TE, as well as the ones explicitly
Mark Wielaard de58b8
+                  ORed in the expression below.  Anything else, such as TE
Mark Wielaard de58b8
+                  itself, is not supported by Valgrind. */
Mark Wielaard de58b8
+               auxv->u.a_val &= ((VKI_HWCAP_S390_TE - 1)
Mark Wielaard de58b8
+                                 | VKI_HWCAP_S390_VXRS
Mark Wielaard de58b8
+                                 | VKI_HWCAP_S390_VXRS_EXT);
Mark Wielaard de58b8
             }
Mark Wielaard de58b8
 #           elif defined(VGP_arm64_linux)
Mark Wielaard de58b8
             {
Mark Wielaard de58b8
diff --git a/coregrind/m_machine.c b/coregrind/m_machine.c
Mark Wielaard de58b8
index e7877e636..228ae2554 100644
Mark Wielaard de58b8
--- a/coregrind/m_machine.c
Mark Wielaard de58b8
+++ b/coregrind/m_machine.c
Mark Wielaard de58b8
@@ -1555,6 +1555,7 @@ Bool VG_(machine_get_hwcaps)( void )
Mark Wielaard de58b8
         { False, S390_FAC_MSA5,  VEX_HWCAPS_S390X_MSA5,  "MSA5"  },
Mark Wielaard de58b8
         { False, S390_FAC_MI2,   VEX_HWCAPS_S390X_MI2,   "MI2"   },
Mark Wielaard de58b8
         { False, S390_FAC_LSC2,  VEX_HWCAPS_S390X_LSC2,  "LSC2"  },
Mark Wielaard de58b8
+        { False, S390_FAC_VXE,   VEX_HWCAPS_S390X_VXE,   "VXE"   },
Mark Wielaard de58b8
      };
Mark Wielaard de58b8
 
Mark Wielaard de58b8
      /* Set hwcaps according to the detected facilities */
Mark Wielaard de58b8
diff --git a/include/vki/vki-s390x-linux.h b/include/vki/vki-s390x-linux.h
Mark Wielaard de58b8
index 7b863a324..4ab2d3334 100644
Mark Wielaard de58b8
--- a/include/vki/vki-s390x-linux.h
Mark Wielaard de58b8
+++ b/include/vki/vki-s390x-linux.h
Mark Wielaard de58b8
@@ -806,6 +806,7 @@ typedef vki_s390_regs vki_elf_gregset_t;
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 #define VKI_HWCAP_S390_TE           1024
Mark Wielaard de58b8
 #define VKI_HWCAP_S390_VXRS         2048
Mark Wielaard de58b8
+#define VKI_HWCAP_S390_VXRS_EXT     8192
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 
Mark Wielaard de58b8
 //----------------------------------------------------------------------
Mark Wielaard de58b8
diff --git a/none/tests/s390x/vector.h b/none/tests/s390x/vector.h
Mark Wielaard de58b8
index de2391480..632c2cb9c 100644
Mark Wielaard de58b8
--- a/none/tests/s390x/vector.h
Mark Wielaard de58b8
+++ b/none/tests/s390x/vector.h
Mark Wielaard de58b8
@@ -86,6 +86,13 @@ void print_hex(const V128 value) {
Mark Wielaard de58b8
    printf("%016lx | %016lx\n", value.u64[0], value.u64[1]);
Mark Wielaard de58b8
 }
Mark Wielaard de58b8
 
Mark Wielaard de58b8
+void print_hex64(const V128 value, int zero_only) {
Mark Wielaard de58b8
+   if (zero_only)
Mark Wielaard de58b8
+      printf("%016lx | --\n", value.u64[0]);
Mark Wielaard de58b8
+   else
Mark Wielaard de58b8
+      printf("%016lx | %016lx\n", value.u64[0], value.u64[1]);
Mark Wielaard de58b8
+}
Mark Wielaard de58b8
+
Mark Wielaard de58b8
 void print_f32(const V128 value, int even_only, int zero_only) {
Mark Wielaard de58b8
    if (zero_only)
Mark Wielaard de58b8
       printf("%a | -- | -- | --\n", value.f32[0]);
Mark Wielaard de58b8
@@ -222,8 +229,10 @@ static void test_##insn##_selective(const s390x_test_usageInfo info) \
Mark Wielaard de58b8
       {printf("  v_arg2   = "); print_hex(v_arg2);} \
Mark Wielaard de58b8
    if (info & V128_V_ARG3_AS_INT) \
Mark Wielaard de58b8
       {printf("  v_arg3   = "); print_hex(v_arg3);} \
Mark Wielaard de58b8
-   if (info & V128_V_RES_AS_INT) \
Mark Wielaard de58b8
-      {printf("  v_result = "); print_hex(v_result);} \
Mark Wielaard de58b8
+   if (info & V128_V_RES_AS_INT) { \
Mark Wielaard de58b8
+      printf("  v_result = "); \
Mark Wielaard de58b8
+      print_hex64(v_result, info & V128_V_RES_ZERO_ONLY); \
Mark Wielaard de58b8
+   } \
Mark Wielaard de58b8
    \
Mark Wielaard de58b8
    if (info & V128_V_ARG1_AS_FLOAT64) \
Mark Wielaard de58b8
       {printf("  v_arg1   = "); print_f64(v_arg1, 0);} \
Mark Wielaard de58b8
diff --git a/none/tests/s390x/vector_float.c b/none/tests/s390x/vector_float.c
Mark Wielaard de58b8
index 52f3a296f..20853f381 100644
Mark Wielaard de58b8
--- a/none/tests/s390x/vector_float.c
Mark Wielaard de58b8
+++ b/none/tests/s390x/vector_float.c
Mark Wielaard de58b8
@@ -114,50 +114,59 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(vldeb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wldeb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
+                                        V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vflcdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wflcdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vflndb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wflndb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vflpdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wflpdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vfadb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfadb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                        V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfsdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfsdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                        V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfmdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfmdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                        V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfddb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfddb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                        V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
  
Mark Wielaard de58b8
    test_with_selective_printing(vfsqdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfsqdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG1_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vfmadb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
@@ -166,7 +175,8 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(wfmadb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG3_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG3_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfmsdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
@@ -174,21 +184,25 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(wfmsdb, (V128_V_RES_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                          V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                         V128_V_ARG3_AS_FLOAT64));
Mark Wielaard de58b8
+                                         V128_V_ARG3_AS_FLOAT64 |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(wfcdb, (V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_R_RES));
Mark Wielaard de58b8
+                                        V128_R_RES |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(wfkdb, (V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                         V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                        V128_R_RES));
Mark Wielaard de58b8
+                                        V128_R_RES |
Mark Wielaard de58b8
+                                        V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vfcedb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfcedb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                          V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                          V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                          V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfcedbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
@@ -196,14 +210,16 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(wfcedbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                          V128_R_RES));
Mark Wielaard de58b8
+                                          V128_R_RES |
Mark Wielaard de58b8
+                                          V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vfchdb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfchdb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                          V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                          V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                          V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfchdbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
@@ -211,14 +227,16 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(wfchdbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                           V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                           V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                          V128_R_RES));
Mark Wielaard de58b8
+                                          V128_R_RES |
Mark Wielaard de58b8
+                                          V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vfchedb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                            V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                            V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
    test_with_selective_printing(wfchedb,  (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                            V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
-                                           V128_V_ARG2_AS_FLOAT64));
Mark Wielaard de58b8
+                                           V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
+                                           V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
    test_with_selective_printing(vfchedbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                            V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                            V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
@@ -226,7 +244,8 @@ int main()
Mark Wielaard de58b8
    test_with_selective_printing(wfchedbs, (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                            V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
                                            V128_V_ARG2_AS_FLOAT64 |
Mark Wielaard de58b8
-                                           V128_R_RES));
Mark Wielaard de58b8
+                                           V128_R_RES |
Mark Wielaard de58b8
+                                           V128_V_RES_ZERO_ONLY));
Mark Wielaard de58b8
 
Mark Wielaard de58b8
    test_with_selective_printing(vftcidb0,    (V128_V_RES_AS_INT |
Mark Wielaard de58b8
                                               V128_V_ARG1_AS_FLOAT64 |
Mark Wielaard de58b8
diff --git a/none/tests/s390x/vector_float.stdout.exp b/none/tests/s390x/vector_float.stdout.exp
Mark Wielaard de58b8
index eac525041..a330ac832 100644
Mark Wielaard de58b8
--- a/none/tests/s390x/vector_float.stdout.exp
Mark Wielaard de58b8
+++ b/none/tests/s390x/vector_float.stdout.exp
Mark Wielaard de58b8
@@ -419,88 +419,88 @@ insn vcgdb07:
Mark Wielaard de58b8
   v_result = 7fffffffffffffff | 7fffffffffffffff
Mark Wielaard de58b8
   v_arg1   = 0x1.fed2f087c21p+341 | 0x1.180e4c1d87fc4p+682
Mark Wielaard de58b8
 insn wcgdb00:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.d7fd9222e8b86p+670 | 0x1.c272612672a3p+798
Mark Wielaard de58b8
 insn wcgdb00:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.745cd360987e5p-496 | -0x1.f3b404919f358p-321
Mark Wielaard de58b8
 insn wcgdb00:
Mark Wielaard de58b8
-  v_result = 8000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 8000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.9523565cd92d5p+643 | 0x1.253677d6d3be2p-556
Mark Wielaard de58b8
 insn wcgdb00:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.b6eb576ec3e6ap+845 | -0x1.c7e102c503d91p+266
Mark Wielaard de58b8
 insn wcgdb01:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.3d4319841f4d6p-1011 | -0x1.2feabf7dfc506p-680
Mark Wielaard de58b8
 insn wcgdb01:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.6fb8d1cd8b32cp-843 | -0x1.50f6a6922f97ep+33
Mark Wielaard de58b8
 insn wcgdb01:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.64a673daccf1ap-566 | -0x1.69ef9b1d01499p+824
Mark Wielaard de58b8
 insn wcgdb01:
Mark Wielaard de58b8
-  v_result = 8000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 8000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.3e2ddd862b4adp+1005 | -0x1.312466410271p+184
Mark Wielaard de58b8
 insn wcgdb03:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.d594c3412a11p-953 | -0x1.a07393d34d77cp-224
Mark Wielaard de58b8
 insn wcgdb03:
Mark Wielaard de58b8
-  v_result = 8000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 8000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.f7a0dbcfd6e4cp+104 | -0x1.40f7cde7f2214p-702
Mark Wielaard de58b8
 insn wcgdb03:
Mark Wielaard de58b8
-  v_result = 8000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 8000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.40739c1574808p+560 | -0x1.970328ddf1b6ep-374
Mark Wielaard de58b8
 insn wcgdb03:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.477653afd7048p-38 | 0x1.1eac2f8b2a93cp-384
Mark Wielaard de58b8
 insn wcgdb04:
Mark Wielaard de58b8
-  v_result = ffffffffe9479a7d | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffe9479a7d | --
Mark Wielaard de58b8
   v_arg1   = -0x1.6b865833eff3p+28 | 0x1.06e8cf1834d0ep-722
Mark Wielaard de58b8
 insn wcgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.eef0b2294a5cp-544 | -0x1.8e8b133ccda15p+752
Mark Wielaard de58b8
 insn wcgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.f34e77e6b6698p-894 | -0x1.9f7ce1cb53bddp-896
Mark Wielaard de58b8
 insn wcgdb04:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.95707a6d75db5p+1018 | -0x1.3b0c072d23011p-224
Mark Wielaard de58b8
 insn wcgdb05:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.a9fb71160793p-968 | 0x1.05f601fe8123ap-986
Mark Wielaard de58b8
 insn wcgdb05:
Mark Wielaard de58b8
-  v_result = 8000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 8000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.0864159b94305p+451 | -0x1.d4647f5a78b7ep-599
Mark Wielaard de58b8
 insn wcgdb05:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.37eadff8397c8p+432 | -0x1.15d896b6f6063p+464
Mark Wielaard de58b8
 insn wcgdb05:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.eb0812b0d677p-781 | 0x1.3117c5e0e288cp-202
Mark Wielaard de58b8
 insn wcgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.6b88069167c0fp-662 | -0x1.70571d27e1279p+254
Mark Wielaard de58b8
 insn wcgdb06:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.f6a6d6e883596p+260 | 0x1.0d578afaaa34ap+604
Mark Wielaard de58b8
 insn wcgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.d91c7d13c4694p-475 | -0x1.ecf1f8529767bp+830
Mark Wielaard de58b8
 insn wcgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.fac8dd3bb7af6p-101 | 0x1.fb8324a00fba8p+959
Mark Wielaard de58b8
 insn wcgdb07:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.4b0fa18fa73c7p+111 | -0x1.08e7b17633a49p+61
Mark Wielaard de58b8
 insn wcgdb07:
Mark Wielaard de58b8
-  v_result = e636b693e39a1100 | 0000000000000000
Mark Wielaard de58b8
+  v_result = e636b693e39a1100 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.9c9496c1c65efp+60 | 0x1.c4182ee728d76p-572
Mark Wielaard de58b8
 insn wcgdb07:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = -0x1.819718032dff7p-303 | 0x1.a784c77ff6aa2p-622
Mark Wielaard de58b8
 insn wcgdb07:
Mark Wielaard de58b8
-  v_result = 7fffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = 7fffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.978e8abfd83c2p+152 | 0x1.2531ebf451762p+315
Mark Wielaard de58b8
 insn vclgdb00:
Mark Wielaard de58b8
   v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
@@ -587,88 +587,88 @@ insn vclgdb07:
Mark Wielaard de58b8
   v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
   v_arg1   = -0x1.137bbb51f08bdp+306 | 0x1.18d2a1063356p-795
Mark Wielaard de58b8
 insn wclgdb00:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.e66f55dcc2639p-1013 | -0x1.733ee56929f3bp-304
Mark Wielaard de58b8
 insn wclgdb00:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.8802fd9ab740cp-986 | -0x1.64d4d2c7c145fp-1015
Mark Wielaard de58b8
 insn wclgdb00:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.a67209b8c407bp-645 | -0x1.6410ff9b1c801p+487
Mark Wielaard de58b8
 insn wclgdb00:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.cb2febaefeb2dp+49 | 0x1.dee368b2ec375p-502
Mark Wielaard de58b8
 insn wclgdb01:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.5703db3c1b0e2p-728 | 0x1.068c4d51ea4ebp+617
Mark Wielaard de58b8
 insn wclgdb01:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.ae350291e5b3ep+291 | 0x1.1b87bb09b6032p+376
Mark Wielaard de58b8
 insn wclgdb01:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.c4666a710127ep+424 | -0x1.19e969b6c0076p+491
Mark Wielaard de58b8
 insn wclgdb01:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.c892c5a4d103fp+105 | -0x1.d4f937cc76704p+749
Mark Wielaard de58b8
 insn wclgdb03:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.81090d8fc663dp-111 | 0x1.337ec5e0f0904p+1
Mark Wielaard de58b8
 insn wclgdb03:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.e787adc70b91p-593 | 0x1.db8d83196b53cp-762
Mark Wielaard de58b8
 insn wclgdb03:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.6529307e907efp+389 | -0x1.3ea0d8d5b4dd2p+589
Mark Wielaard de58b8
 insn wclgdb03:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.be701a158637p-385 | 0x1.c5a7f70cb8a09p+107
Mark Wielaard de58b8
 insn wclgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.2f328571ab445p+21 | -0x1.dcc21fc82ba01p-930
Mark Wielaard de58b8
 insn wclgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.06b69fcbb7bffp-415 | 0x1.6f9a13a0a827ap+915
Mark Wielaard de58b8
 insn wclgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.738e549b38bcdp+479 | 0x1.a522edb999c9p-45
Mark Wielaard de58b8
 insn wclgdb04:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.7f9399d2bcf3bp-215 | -0x1.7bc35f2d69a7fp+818
Mark Wielaard de58b8
 insn wclgdb05:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.fc542bdb707f6p+880 | -0x1.8521ebc93a25fp-969
Mark Wielaard de58b8
 insn wclgdb05:
Mark Wielaard de58b8
-  v_result = 1ce8d9951b8c8600 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 1ce8d9951b8c8600 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.ce8d9951b8c86p+60 | 0x1.92712589230e7p+475
Mark Wielaard de58b8
 insn wclgdb05:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.8a297f60a0811p-156 | 0x1.102b79043d82cp-204
Mark Wielaard de58b8
 insn wclgdb05:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.beb9057e1401dp-196 | -0x1.820f18f830262p+15
Mark Wielaard de58b8
 insn wclgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000001 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000001 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.c321a966ecb4dp-430 | -0x1.2f6a1a95ead99p-943
Mark Wielaard de58b8
 insn wclgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.f1a86b4aed821p-56 | -0x1.1ee6717cc2d7fp-899
Mark Wielaard de58b8
 insn wclgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.73ce49d89ecb9p-302 | 0x1.52663b975ed23p-716
Mark Wielaard de58b8
 insn wclgdb06:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.3e9c2de97a292p+879 | 0x1.d34eed36f2eafp+960
Mark Wielaard de58b8
 insn wclgdb07:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.4e6ec6ddc6a45p-632 | -0x1.6e564d0fec72bp+369
Mark Wielaard de58b8
 insn wclgdb07:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.42e2c658e4c4dp+459 | -0x1.9f9dc0252e44p+85
Mark Wielaard de58b8
 insn wclgdb07:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.fb40ac8cda3c1p-762 | 0x1.0e9ed614bc8f1p-342
Mark Wielaard de58b8
 insn wclgdb07:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.c1f8b3c68e214p+118 | -0x1.1a26a49368b61p+756
Mark Wielaard de58b8
 insn vfidb00:
Mark Wielaard de58b8
   v_arg1   = -0x1.38df4cf9d52dbp-545 | -0x1.049253d90dd92p+94
Mark Wielaard de58b8
@@ -1020,16 +1020,16 @@ insn vldeb:
Mark Wielaard de58b8
   v_result = -0x1.6f5fb2p+70 | -0x1.0d2df6p-107
Mark Wielaard de58b8
 insn wldeb:
Mark Wielaard de58b8
   v_arg1   = -0x1.d26169729db2ap-435 | 0x1.d6fd080793e8cp+767
Mark Wielaard de58b8
-  v_result = -0x1.9a4c2cp-54 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.9a4c2cp-54 | --
Mark Wielaard de58b8
 insn wldeb:
Mark Wielaard de58b8
   v_arg1   = -0x1.f4b59107fce61p-930 | 0x1.cdf2816e253f4p-168
Mark Wielaard de58b8
-  v_result = -0x1.be96b2p-116 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.be96b2p-116 | --
Mark Wielaard de58b8
 insn wldeb:
Mark Wielaard de58b8
   v_arg1   = -0x1.9603a2997928cp-441 | -0x1.aada85e355a11p-767
Mark Wielaard de58b8
-  v_result = -0x1.d2c074p-55 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.d2c074p-55 | --
Mark Wielaard de58b8
 insn wldeb:
Mark Wielaard de58b8
   v_arg1   = 0x1.25ccf5bd0e83p+620 | 0x1.e1635864ebb17p-88
Mark Wielaard de58b8
-  v_result = 0x1.64b99ep+78 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.64b99ep+78 | --
Mark Wielaard de58b8
 insn vflcdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.0ae6d82f76afp-166 | -0x1.e8fb1e03a7415p-191
Mark Wielaard de58b8
   v_result = -0x1.0ae6d82f76afp-166 | 0x1.e8fb1e03a7415p-191
Mark Wielaard de58b8
@@ -1044,16 +1044,16 @@ insn vflcdb:
Mark Wielaard de58b8
   v_result = -0x1.19520153d35b4p-301 | -0x1.ac5325cd23253p+396
Mark Wielaard de58b8
 insn wflcdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.ffd3eecfd54d7p-831 | -0x1.97854fa523a77p+146
Mark Wielaard de58b8
-  v_result = -0x1.ffd3eecfd54d7p-831 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.ffd3eecfd54d7p-831 | --
Mark Wielaard de58b8
 insn wflcdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.508ea45606447p-442 | 0x1.ae7f0e6cf9d2bp+583
Mark Wielaard de58b8
-  v_result = 0x1.508ea45606447p-442 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.508ea45606447p-442 | --
Mark Wielaard de58b8
 insn wflcdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.da8ab2188c21ap+94 | 0x1.78a9c152aa074p-808
Mark Wielaard de58b8
-  v_result = -0x1.da8ab2188c21ap+94 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.da8ab2188c21ap+94 | --
Mark Wielaard de58b8
 insn wflcdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.086882645e0c5p-1001 | -0x1.54e2de5af5a74p-262
Mark Wielaard de58b8
-  v_result = 0x1.086882645e0c5p-1001 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.086882645e0c5p-1001 | --
Mark Wielaard de58b8
 insn vflndb:
Mark Wielaard de58b8
   v_arg1   = -0x1.5bec561d407dcp+819 | -0x1.a5773dadb7a2dp+935
Mark Wielaard de58b8
   v_result = -0x1.5bec561d407dcp+819 | -0x1.a5773dadb7a2dp+935
Mark Wielaard de58b8
@@ -1068,16 +1068,16 @@ insn vflndb:
Mark Wielaard de58b8
   v_result = -0x1.c5bc39a06d4e2p-259 | -0x1.c5e61ad849e77p-833
Mark Wielaard de58b8
 insn wflndb:
Mark Wielaard de58b8
   v_arg1   = -0x1.e9f3e6d1beffap-117 | -0x1.d58cc8bf123b3p-714
Mark Wielaard de58b8
-  v_result = -0x1.e9f3e6d1beffap-117 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.e9f3e6d1beffap-117 | --
Mark Wielaard de58b8
 insn wflndb:
Mark Wielaard de58b8
   v_arg1   = -0x1.3fc4ef2e7485ep-691 | 0x1.eb328986081efp-775
Mark Wielaard de58b8
-  v_result = -0x1.3fc4ef2e7485ep-691 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.3fc4ef2e7485ep-691 | --
Mark Wielaard de58b8
 insn wflndb:
Mark Wielaard de58b8
   v_arg1   = -0x1.7146c5afdec16p+23 | -0x1.597fcfa1fab2p-708
Mark Wielaard de58b8
-  v_result = -0x1.7146c5afdec16p+23 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.7146c5afdec16p+23 | --
Mark Wielaard de58b8
 insn wflndb:
Mark Wielaard de58b8
   v_arg1   = 0x1.03f8d7e9afe84p-947 | 0x1.9a10c3feb6b57p-118
Mark Wielaard de58b8
-  v_result = -0x1.03f8d7e9afe84p-947 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.03f8d7e9afe84p-947 | --
Mark Wielaard de58b8
 insn vflpdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.64ae59b6c762ep-407 | -0x1.fa7191ab21e86p+533
Mark Wielaard de58b8
   v_result = 0x1.64ae59b6c762ep-407 | 0x1.fa7191ab21e86p+533
Mark Wielaard de58b8
@@ -1092,16 +1092,16 @@ insn vflpdb:
Mark Wielaard de58b8
   v_result = 0x1.85fa2de1d492ap+170 | 0x1.ac36828822c11p-968
Mark Wielaard de58b8
 insn wflpdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.a6cf677640a73p-871 | 0x1.b6f1792385922p-278
Mark Wielaard de58b8
-  v_result = 0x1.a6cf677640a73p-871 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.a6cf677640a73p-871 | --
Mark Wielaard de58b8
 insn wflpdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.b886774f6d888p-191 | -0x1.6a2b08d735d22p-643
Mark Wielaard de58b8
-  v_result = 0x1.b886774f6d888p-191 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.b886774f6d888p-191 | --
Mark Wielaard de58b8
 insn wflpdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.5045d37d46f5fp+943 | -0x1.333a86ef2dcf6p-1013
Mark Wielaard de58b8
-  v_result = 0x1.5045d37d46f5fp+943 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.5045d37d46f5fp+943 | --
Mark Wielaard de58b8
 insn wflpdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.1e7bec6ada14dp+252 | 0x1.a70b3f3e24dap-153
Mark Wielaard de58b8
-  v_result = 0x1.1e7bec6ada14dp+252 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.1e7bec6ada14dp+252 | --
Mark Wielaard de58b8
 insn vfadb:
Mark Wielaard de58b8
   v_arg1   = 0x1.5b1ad8e9f17c6p-294 | -0x1.ddd8300a0bf02p+122
Mark Wielaard de58b8
   v_arg2   = -0x1.9b49c31ca8ac6p+926 | 0x1.fdbc992926268p+677
Mark Wielaard de58b8
@@ -1121,19 +1121,19 @@ insn vfadb:
Mark Wielaard de58b8
 insn wfadb:
Mark Wielaard de58b8
   v_arg1   = 0x1.3c5466cb80722p+489 | -0x1.11e1770053ca2p+924
Mark Wielaard de58b8
   v_arg2   = 0x1.d876cd721a726p-946 | 0x1.5c04ceb79c9bcp+1001
Mark Wielaard de58b8
-  v_result = 0x1.3c5466cb80722p+489 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.3c5466cb80722p+489 | --
Mark Wielaard de58b8
 insn wfadb:
Mark Wielaard de58b8
   v_arg1   = 0x1.b0b142d6b76a3p+577 | 0x1.3146824e993a2p+432
Mark Wielaard de58b8
   v_arg2   = -0x1.f7f3b7582925fp-684 | -0x1.9700143c2b935p-837
Mark Wielaard de58b8
-  v_result = 0x1.b0b142d6b76a2p+577 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.b0b142d6b76a2p+577 | --
Mark Wielaard de58b8
 insn wfadb:
Mark Wielaard de58b8
   v_arg1   = -0x1.8d65e15edabd6p+244 | 0x1.3be7fd08492d6p-141
Mark Wielaard de58b8
   v_arg2   = -0x1.5eef86490fb0ap+481 | 0x1.7b26c897cb6dfp+810
Mark Wielaard de58b8
-  v_result = -0x1.5eef86490fb0ap+481 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.5eef86490fb0ap+481 | --
Mark Wielaard de58b8
 insn wfadb:
Mark Wielaard de58b8
   v_arg1   = -0x1.2dffa5b5f29p+34 | 0x1.71a026274602fp-881
Mark Wielaard de58b8
   v_arg2   = 0x1.4dad707287289p+756 | -0x1.1500d55807247p-616
Mark Wielaard de58b8
-  v_result = 0x1.4dad707287288p+756 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.4dad707287288p+756 | --
Mark Wielaard de58b8
 insn vfsdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.054fd9c4d4883p+644 | 0x1.45c90ed85bd7fp-780
Mark Wielaard de58b8
   v_arg2   = 0x1.f3bc7a611dadap+494 | -0x1.7c9e1e858ba5bp-301
Mark Wielaard de58b8
@@ -1153,19 +1153,19 @@ insn vfsdb:
Mark Wielaard de58b8
 insn wfsdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.9090dabf846e7p-648 | 0x1.1c4ab843a2d15p+329
Mark Wielaard de58b8
   v_arg2   = -0x1.a7ceb293690dep+316 | 0x1.22245954a20cp+42
Mark Wielaard de58b8
-  v_result = 0x1.a7ceb293690dep+316 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.a7ceb293690dep+316 | --
Mark Wielaard de58b8
 insn wfsdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.4e5347c27819p-933 | -0x1.56a30bda28351p-64
Mark Wielaard de58b8
   v_arg2   = -0x1.dedb9f3935b56p-155 | 0x1.8c5b6ed76816cp-522
Mark Wielaard de58b8
-  v_result = 0x1.dedb9f3935b56p-155 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.dedb9f3935b56p-155 | --
Mark Wielaard de58b8
 insn wfsdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.0ec4e562a015bp-491 | 0x1.3996381b52d9fp-686
Mark Wielaard de58b8
   v_arg2   = 0x1.1dcce4e81819p+960 | -0x1.32fa425e8fc08p-263
Mark Wielaard de58b8
-  v_result = -0x1.1dcce4e81818fp+960 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.1dcce4e81818fp+960 | --
Mark Wielaard de58b8
 insn wfsdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.587229f90f77dp-19 | 0x1.100d8eb8105e4p-784
Mark Wielaard de58b8
   v_arg2   = -0x1.afb4cce4c43ddp+530 | -0x1.6da7f05e7f512p-869
Mark Wielaard de58b8
-  v_result = 0x1.afb4cce4c43dcp+530 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.afb4cce4c43dcp+530 | --
Mark Wielaard de58b8
 insn vfmdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.892b425556c47p-124 | 0x1.38222404079dfp-656
Mark Wielaard de58b8
   v_arg2   = 0x1.af612ed2c342dp-267 | -0x1.1f735fd6ce768p-877
Mark Wielaard de58b8
@@ -1185,19 +1185,19 @@ insn vfmdb:
Mark Wielaard de58b8
 insn wfmdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.b992d950126a1p-683 | -0x1.9c1b22eb58c59p-497
Mark Wielaard de58b8
   v_arg2   = 0x1.b557a7d8e32c3p-25 | -0x1.f746b2ddafccep+227
Mark Wielaard de58b8
-  v_result = -0x1.792f6fb13894ap-707 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.792f6fb13894ap-707 | --
Mark Wielaard de58b8
 insn wfmdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.677a8c20a5a2fp+876 | 0x1.c03e7b97e8c0dp-645
Mark Wielaard de58b8
   v_arg2   = 0x1.dab44be430937p-1011 | -0x1.3f51352c67be9p-916
Mark Wielaard de58b8
-  v_result = -0x1.4d4b0a1827064p-134 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.4d4b0a1827064p-134 | --
Mark Wielaard de58b8
 insn wfmdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.da60f596ad0cep+254 | 0x1.52332e0650e33p+966
Mark Wielaard de58b8
   v_arg2   = 0x1.a042c52ed993cp+215 | 0x1.8f380c84aa133p+204
Mark Wielaard de58b8
-  v_result = -0x1.81aca4bbcbd24p+470 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.81aca4bbcbd24p+470 | --
Mark Wielaard de58b8
 insn wfmdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.83d17f11f6aa3p-469 | -0x1.98117efe89b9ep-361
Mark Wielaard de58b8
   v_arg2   = 0x1.8c445fd46d214p-701 | -0x1.f98118821821cp+596
Mark Wielaard de58b8
-  v_result = -0x0p+0 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x0p+0 | --
Mark Wielaard de58b8
 insn vfddb:
Mark Wielaard de58b8
   v_arg1   = -0x1.ecbb48899e0f1p+969 | 0x1.caf175ab352p-20
Mark Wielaard de58b8
   v_arg2   = -0x1.9455d67f9f79dp+208 | 0x1.bc4a431b04a6fp+482
Mark Wielaard de58b8
@@ -1217,19 +1217,19 @@ insn vfddb:
Mark Wielaard de58b8
 insn wfddb:
Mark Wielaard de58b8
   v_arg1   = 0x1.bd48489b60731p-114 | 0x1.a760dcf57b74fp-51
Mark Wielaard de58b8
   v_arg2   = -0x1.171f83409eeb6p-402 | -0x1.e159d1409bdc6p-972
Mark Wielaard de58b8
-  v_result = -0x1.9864f1511f8cp+288 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.9864f1511f8cp+288 | --
Mark Wielaard de58b8
 insn wfddb:
Mark Wielaard de58b8
   v_arg1   = -0x1.120505ef4606p-637 | -0x1.83f6f775c0eb7p+272
Mark Wielaard de58b8
   v_arg2   = -0x1.d18ba3872fde1p+298 | 0x1.c60f8d191068cp-454
Mark Wielaard de58b8
-  v_result = 0x1.2d5cdb15a686cp-936 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.2d5cdb15a686cp-936 | --
Mark Wielaard de58b8
 insn wfddb:
Mark Wielaard de58b8
   v_arg1   = 0x1.f637f7f8c790fp-97 | -0x1.7bdce4d74947p+189
Mark Wielaard de58b8
   v_arg2   = -0x1.1c8f2d1b3a2edp-218 | -0x1.55fdfd1840241p-350
Mark Wielaard de58b8
-  v_result = -0x1.c3d0799c1420fp+121 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.c3d0799c1420fp+121 | --
Mark Wielaard de58b8
 insn wfddb:
Mark Wielaard de58b8
   v_arg1   = -0x1.c63b7b2eee253p+250 | 0x1.dfd9dcd8b823fp-125
Mark Wielaard de58b8
   v_arg2   = 0x1.094a1f1f87e0cp+629 | 0x1.eeaa23c0d7843p-814
Mark Wielaard de58b8
-  v_result = -0x1.b653a10ebdeccp-379 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.b653a10ebdeccp-379 | --
Mark Wielaard de58b8
 insn vfsqdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.f60db25f7066p-703 | -0x1.d43509abca8c3p+631
Mark Wielaard de58b8
   v_result = 0x1.fb009ab25ec11p-352 | nan
Mark Wielaard de58b8
@@ -1244,16 +1244,16 @@ insn vfsqdb:
Mark Wielaard de58b8
   v_result = 0x1.833dba0954bccp+249 | nan
Mark Wielaard de58b8
 insn wfsqdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.71af4e7f64978p+481 | -0x1.3429dc60011d7p-879
Mark Wielaard de58b8
-  v_result = 0x1.b30fc65551133p+240 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.b30fc65551133p+240 | --
Mark Wielaard de58b8
 insn wfsqdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.5410db1c5f403p+173 | 0x1.97fa6581e692fp+108
Mark Wielaard de58b8
-  v_result = 0x1.a144f43a592c1p+86 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.a144f43a592c1p+86 | --
Mark Wielaard de58b8
 insn wfsqdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.5838027725afep+6 | 0x1.ac61529c11f38p+565
Mark Wielaard de58b8
-  v_result = nan | 0x0p+0
Mark Wielaard de58b8
+  v_result = nan | --
Mark Wielaard de58b8
 insn wfsqdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.159e341dcc06ep-439 | 0x1.ed54ce5481ba5p-574
Mark Wielaard de58b8
-  v_result = nan | 0x0p+0
Mark Wielaard de58b8
+  v_result = nan | --
Mark Wielaard de58b8
 insn vfmadb:
Mark Wielaard de58b8
   v_arg1   = -0x1.eb00a5c503d75p+538 | 0x1.89fae603ddc07p+767
Mark Wielaard de58b8
   v_arg2   = -0x1.71c72712c3957p+715 | 0x1.1bd5773442feap+762
Mark Wielaard de58b8
@@ -1278,22 +1278,22 @@ insn wfmadb:
Mark Wielaard de58b8
   v_arg1   = 0x1.1cc5b10a14d54p+668 | -0x1.686407390f7d1p+616
Mark Wielaard de58b8
   v_arg2   = -0x1.bf34549e73246p+676 | -0x1.dc5a34cc470f3p+595
Mark Wielaard de58b8
   v_arg3   = -0x1.95e0fdcf13974p-811 | -0x1.79c7cc1a8ec83p-558
Mark Wielaard de58b8
-  v_result = -0x1.fffffffffffffp+1023 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.fffffffffffffp+1023 | --
Mark Wielaard de58b8
 insn wfmadb:
Mark Wielaard de58b8
   v_arg1   = 0x1.138bc1a5d75f8p+713 | -0x1.e226ebba2fe54p+381
Mark Wielaard de58b8
   v_arg2   = -0x1.081ebb7cc3414p-772 | 0x1.369d99e174fc3p+922
Mark Wielaard de58b8
   v_arg3   = -0x1.0671c682a5d0cp-1016 | 0x1.03c9530dd0377p+378
Mark Wielaard de58b8
-  v_result = -0x1.1c4933e117d95p-59 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.1c4933e117d95p-59 | --
Mark Wielaard de58b8
 insn wfmadb:
Mark Wielaard de58b8
   v_arg1   = -0x1.166f0b1fad67bp+64 | -0x1.e9ee8d32e1069p-452
Mark Wielaard de58b8
   v_arg2   = -0x1.4a235bdd109e2p-65 | 0x1.bacaa96fc7e81p-403
Mark Wielaard de58b8
   v_arg3   = -0x1.d2e19acf7c4bdp+99 | 0x1.f901130f685adp-963
Mark Wielaard de58b8
-  v_result = -0x1.d2e19acf7c4bcp+99 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.d2e19acf7c4bcp+99 | --
Mark Wielaard de58b8
 insn wfmadb:
Mark Wielaard de58b8
   v_arg1   = -0x1.77d7bfec863d2p-988 | -0x1.b68029700c6b1p-206
Mark Wielaard de58b8
   v_arg2   = -0x1.aca05ad00aec1p+737 | 0x1.ac746bd7e216bp+51
Mark Wielaard de58b8
   v_arg3   = 0x1.17342292078b4p+188 | -0x1.49efaf9392301p+555
Mark Wielaard de58b8
-  v_result = 0x1.17342292078b4p+188 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.17342292078b4p+188 | --
Mark Wielaard de58b8
 insn vfmsdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.a1b218e84e61p+34 | 0x1.b220f0d144daep-111
Mark Wielaard de58b8
   v_arg2   = 0x1.564fcc2527961p-265 | 0x1.ea85a4154721ep+733
Mark Wielaard de58b8
@@ -1318,22 +1318,22 @@ insn wfmsdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.7499a639673a6p-100 | -0x1.2a0d737e6cb1cp-207
Mark Wielaard de58b8
   v_arg2   = -0x1.01ad4670a7aa3p-911 | 0x1.f94385e1021e8p+317
Mark Wielaard de58b8
   v_arg3   = 0x1.aa42b2bb17af9p+982 | 0x1.c550e471711p+786
Mark Wielaard de58b8
-  v_result = -0x1.aa42b2bb17af8p+982 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.aa42b2bb17af8p+982 | --
Mark Wielaard de58b8
 insn wfmsdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.76840f99b431ep+500 | -0x1.989a500c92c08p+594
Mark Wielaard de58b8
   v_arg2   = 0x1.33c657cb8385cp-84 | -0x1.2c795ad92ce17p+807
Mark Wielaard de58b8
   v_arg3   = -0x1.ee58a39f02d54p-351 | -0x1.18695ed9a280ap+48
Mark Wielaard de58b8
-  v_result = 0x1.c242894a0068p+416 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.c242894a0068p+416 | --
Mark Wielaard de58b8
 insn wfmsdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.16db07e054a65p-469 | -0x1.3a627ab99c6e4p+689
Mark Wielaard de58b8
   v_arg2   = 0x1.17872eae826e5p-538 | 0x1.44ed513fb5873p-929
Mark Wielaard de58b8
   v_arg3   = 0x1.5ca912008e077p-217 | -0x1.982a6f7359876p-23
Mark Wielaard de58b8
-  v_result = -0x1.5ca912008e077p-217 | 0x0p+0
Mark Wielaard de58b8
+  v_result = -0x1.5ca912008e077p-217 | --
Mark Wielaard de58b8
 insn wfmsdb:
Mark Wielaard de58b8
   v_arg1   = -0x1.d315f4a932c6p+122 | 0x1.616a04493e143p+513
Mark Wielaard de58b8
   v_arg2   = -0x1.cf1cd3516f23fp+552 | 0x1.7121749c3932cp-750
Mark Wielaard de58b8
   v_arg3   = 0x1.dc26d92304d7fp-192 | -0x1.1fc3cca9ec20ep+371
Mark Wielaard de58b8
-  v_result = 0x1.a67ca6ba395bcp+675 | 0x0p+0
Mark Wielaard de58b8
+  v_result = 0x1.a67ca6ba395bcp+675 | --
Mark Wielaard de58b8
 insn wfcdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.302001b736011p-633 | -0x1.72d5300225c97p-468
Mark Wielaard de58b8
   v_arg2   = -0x1.8c007c5aba108p-17 | -0x1.bb3f9ae136acdp+569
Mark Wielaard de58b8
@@ -1383,19 +1383,19 @@ insn vfcedb:
Mark Wielaard de58b8
   v_arg1   = 0x1.d8e5c9930c19dp+623 | -0x1.cf1facff4e194p-605
Mark Wielaard de58b8
   v_arg2   = -0x1.ed6ba02646d0dp+441 | -0x1.2d677e710620bp+810
Mark Wielaard de58b8
 insn wfcedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.a252009e1a12cp-442 | 0x1.4dc608268bb29p-513
Mark Wielaard de58b8
   v_arg2   = -0x1.81020aa1a36e6p-687 | -0x1.300e64ce414f1p-899
Mark Wielaard de58b8
 insn wfcedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.cec439a8d4781p-175 | -0x1.d20e3b281d599p+893
Mark Wielaard de58b8
   v_arg2   = 0x1.ca17cf16cf0aap-879 | 0x1.61506f8596092p+545
Mark Wielaard de58b8
 insn wfcedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.0659f5f24a004p+877 | 0x1.fc46867ed0338p-680
Mark Wielaard de58b8
   v_arg2   = -0x1.1d6849587155ep-1010 | -0x1.f68171edc235fp+575
Mark Wielaard de58b8
 insn wfcedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.dc88a0d46ad79p-816 | 0x1.245140dcaed79p+851
Mark Wielaard de58b8
   v_arg2   = 0x1.b33e977c7b3ep-818 | -0x1.04319d7c69367p+787
Mark Wielaard de58b8
 insn vfcedbs:
Mark Wielaard de58b8
@@ -1419,22 +1419,22 @@ insn vfcedbs:
Mark Wielaard de58b8
   v_arg2   = 0x1.ae2c06ea88ff4p+332 | -0x1.f668ce4f8ef9ap+821
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfcedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.645261bf86b1fp-996 | 0x1.abd13c95397aap+992
Mark Wielaard de58b8
   v_arg2   = -0x1.ba09e8fc66a8cp+113 | 0x1.75dbfe92c16c4p-786
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfcedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.d02831d003e7dp+415 | -0x1.611a9dfd10f36p-80
Mark Wielaard de58b8
   v_arg2   = -0x1.10bda62f4647p+723 | 0x1.cc47af6653378p-614
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfcedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = 0x1.f168f32f84178p-321 | -0x1.79a2a0b9549d1p-136
Mark Wielaard de58b8
   v_arg2   = 0x1.41e19d1cfa692p+11 | -0x1.2a0ed6e7fd517p-453
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfcedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.76a9144ee26c5p+188 | -0x1.386aaea2d9cddp-542
Mark Wielaard de58b8
   v_arg2   = 0x1.810fcf222efc4p-999 | -0x1.ce90a9a43e2a1p+80
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
@@ -1455,19 +1455,19 @@ insn vfchdb:
Mark Wielaard de58b8
   v_arg1   = 0x1.82be31fb88a2dp+946 | -0x1.7ca9e9ff31953p-931
Mark Wielaard de58b8
   v_arg2   = 0x1.fe75a1052beccp+490 | 0x1.179d18543d678p-255
Mark Wielaard de58b8
 insn wfchdb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.0af85d8d8d609p-464 | -0x1.9f639a686e0fep+203
Mark Wielaard de58b8
   v_arg2   = -0x1.3142b77b55761p-673 | 0x1.ca9c474339da1p+472
Mark Wielaard de58b8
 insn wfchdb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = -0x1.6cf16959a022bp+213 | 0x1.445606e4363e1p+942
Mark Wielaard de58b8
   v_arg2   = -0x1.8c343201bbd2p+939 | -0x1.e5095ad0c37a4p-434
Mark Wielaard de58b8
 insn wfchdb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.36b4fc9cf5bdap-52 | -0x1.f1fd95cbcd533p+540
Mark Wielaard de58b8
   v_arg2   = 0x1.5a2362891c9edp-175 | -0x1.e1f68c319e5d2p+58
Mark Wielaard de58b8
 insn wfchdb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.11c6489f544bbp+811 | 0x1.262a740ec3d47p+456
Mark Wielaard de58b8
   v_arg2   = -0x1.d9394d354e989p-154 | 0x1.cc21b3094391ap-972
Mark Wielaard de58b8
 insn vfchdbs:
Mark Wielaard de58b8
@@ -1491,22 +1491,22 @@ insn vfchdbs:
Mark Wielaard de58b8
   v_arg2   = 0x1.e426748435a76p+370 | 0x1.8702527d17783p-871
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfchdbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.6c51b9f6442c8p+639 | 0x1.1e6b37adff703p+702
Mark Wielaard de58b8
   v_arg2   = 0x1.0cba9c1c75e43p+520 | -0x1.145d44ed90967p+346
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
 insn wfchdbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.7b3dd643bf36bp+816 | -0x1.61ce7bfb9307ap-683
Mark Wielaard de58b8
   v_arg2   = -0x1.f2c998dc15c9ap-776 | 0x1.e16397f2dcdf5p+571
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
 insn wfchdbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.cc3be81884e0ap-865 | -0x1.8b353bd41064p+820
Mark Wielaard de58b8
   v_arg2   = -0x1.2c1bafaafdd4ep-34 | -0x1.24666808ab16ep-435
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
 insn wfchdbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.c3de33d3b673ap+554 | 0x1.d39ed71e53096p-798
Mark Wielaard de58b8
   v_arg2   = -0x1.c1e8f7b3c001p-828 | 0x1.22e2cf797fabp-787
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
@@ -1527,19 +1527,19 @@ insn vfchedb:
Mark Wielaard de58b8
   v_arg1   = -0x1.6c5599e7ba923p+829 | -0x1.5d1a1191ed6eap-994
Mark Wielaard de58b8
   v_arg2   = -0x1.555c8775bc4d2p-478 | -0x1.4aa6a2c82319cp+493
Mark Wielaard de58b8
 insn wfchedb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.ae6cad07b0f3ep-232 | -0x1.2ed61a43f3b99p-74
Mark Wielaard de58b8
   v_arg2   = -0x1.226f7cddbde13p-902 | -0x1.790d1d6febbf8p+336
Mark Wielaard de58b8
 insn wfchedb:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.20eb8eac3711dp-385 | 0x1.ef71d3312d7e1p+739
Mark Wielaard de58b8
   v_arg2   = 0x1.7a3ba08c5a0bdp-823 | -0x1.a7845ccaa544dp-129
Mark Wielaard de58b8
 insn wfchedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.97ebdbc057be8p+824 | 0x1.2b7798b063cd6p+237
Mark Wielaard de58b8
   v_arg2   = 0x1.cdb87a6074294p-81 | -0x1.074c902b19bccp-416
Mark Wielaard de58b8
 insn wfchedb:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.82deebf9ff023p+937 | 0x1.56c5adcf9d4abp-672
Mark Wielaard de58b8
   v_arg2   = -0x1.311ce49bc9439p+561 | 0x1.c8e1c512d8544p+103
Mark Wielaard de58b8
 insn vfchedbs:
Mark Wielaard de58b8
@@ -1563,22 +1563,22 @@ insn vfchedbs:
Mark Wielaard de58b8
   v_arg2   = -0x1.47f5dfc7a5bcp-569 | 0x1.5877ef33664a3p-758
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfchedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.a7370ccfd9e49p+505 | 0x1.c6b2385850ca2p-591
Mark Wielaard de58b8
   v_arg2   = 0x1.984f4fcd338b1p+675 | -0x1.feb996c821232p-39
Mark Wielaard de58b8
   r_result = 0000000000000003
Mark Wielaard de58b8
 insn wfchedbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.641878612dd2p+207 | 0x1.b35e3292db7f6p+567
Mark Wielaard de58b8
   v_arg2   = -0x1.18a87f209e96bp+299 | -0x1.3d598f3612d8ap+1016
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
 insn wfchedbs:
Mark Wielaard de58b8
-  v_result = ffffffffffffffff | 0000000000000000
Mark Wielaard de58b8
+  v_result = ffffffffffffffff | --
Mark Wielaard de58b8
   v_arg1   = 0x1.cfc2cda244153p+404 | 0x1.d8b2b28e9d8d7p+276
Mark Wielaard de58b8
   v_arg2   = 0x1.3517b8c7a59a1p-828 | 0x1.6096fab7003ccp-415
Mark Wielaard de58b8
   r_result = 0000000000000000
Mark Wielaard de58b8
 insn wfchedbs:
Mark Wielaard de58b8
-  v_result = 0000000000000000 | 0000000000000000
Mark Wielaard de58b8
+  v_result = 0000000000000000 | --
Mark Wielaard de58b8
   v_arg1   = -0x1.54d656f033e56p-603 | -0x1.95ad0e2088967p+254
Mark Wielaard de58b8
   v_arg2   = 0x1.4cb319db206e4p-614 | 0x1.b41cd9e3739b6p-862
Mark Wielaard de58b8
   r_result = 0000000000000003