]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Add rounding mode operand for fixed-point patterns
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Mon, 15 May 2023 14:23:45 +0000 (22:23 +0800)
committerPan Li <pan2.li@intel.com>
Mon, 15 May 2023 14:23:45 +0000 (22:23 +0800)
Since we are going to have fixed-point intrinsics that are modeling
rounding mode
https://github.com/riscv-non-isa/rvv-intrinsic-doc/pull/222

We should have operand to specify rounding mode in fixed-point instructions.
We don't support these modeling rounding mode intrinsics yet but we will
definetely support them later.

This is the preparing patch for new coming intrinsics.

gcc/ChangeLog:

* config/riscv/riscv-protos.h (enum vxrm_field_enum): New enum.
* config/riscv/riscv-vector-builtins.cc
(function_expander::use_exact_insn): Add default rounding mode operand.
* config/riscv/riscv.cc (riscv_hard_regno_nregs): Add VXRM_REGNUM.
(riscv_hard_regno_mode_ok): Ditto.
(riscv_conditional_register_usage): Ditto.
* config/riscv/riscv.h (DWARF_FRAME_REGNUM): Ditto.
(VXRM_REG_P): Ditto.
(RISCV_DWARF_VXRM): Ditto.
* config/riscv/riscv.md: Ditto.
* config/riscv/vector.md: Ditto

Signed-off-by: Juzhe-Zhong <juzhe.zhong@rivai.ai>
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv-vector-builtins.cc
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.h
gcc/config/riscv/riscv.md
gcc/config/riscv/vector.md

index bc71f9cbbba9b3ef694c4cb4add190e753449f26..835bb802fc6e9bce630f7ac578cc32b4c1043ef0 100644 (file)
@@ -223,6 +223,14 @@ machine_mode preferred_simd_mode (scalar_mode);
 opt_machine_mode get_mask_mode (machine_mode);
 void expand_vec_series (rtx, rtx, rtx);
 void expand_vec_init (rtx, rtx);
+/* Rounding mode bitfield for fixed point VXRM.  */
+enum vxrm_field_enum
+{
+  VXRM_RNU,
+  VXRM_RNE,
+  VXRM_RDN,
+  VXRM_ROD
+};
 }
 
 /* We classify builtin types into two classes:
index 0f56f29f7aa08785373cbe24c3723944613ce1d9..1de075fb90dbf17492745ad4f3242e0752b597e6 100644 (file)
@@ -3288,6 +3288,13 @@ function_expander::use_exact_insn (insn_code icode)
 
   if (base->apply_vl_p ())
     add_input_operand (Pmode, get_avl_type_rtx (avl_type::NONVLMAX));
+
+  /* TODO: Currently, we don't support intrinsic that is modeling rounding mode.
+     We add default rounding mode for the intrinsics that didn't model rounding
+     mode yet.  */
+  if (opno != insn_data[icode].n_generator_args)
+    add_input_operand (Pmode, const0_rtx);
+
   return generate_insn (icode);
 }
 
index a770fdfaa0e1bc3b60c5ed1f18bcf095d810e1cc..b52e613c629acfff8d4349a433d80c382d79b30a 100644 (file)
@@ -6082,7 +6082,7 @@ riscv_hard_regno_nregs (unsigned int regno, machine_mode mode)
 
   /* mode for VL or VTYPE are just a marker, not holding value,
      so it always consume one register.  */
-  if (regno == VTYPE_REGNUM || regno == VL_REGNUM)
+  if (VTYPE_REG_P (regno) || VL_REG_P (regno) || VXRM_REG_P (regno))
     return 1;
 
   /* Assume every valid non-vector mode fits in one vector register.  */
@@ -6150,7 +6150,7 @@ riscv_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
       if (lmul != 1)
        return ((regno % lmul) == 0);
     }
-  else if (regno == VL_REGNUM || regno == VTYPE_REGNUM)
+  else if (VTYPE_REG_P (regno) || VL_REG_P (regno) || VXRM_REG_P (regno))
     return true;
   else
     return false;
@@ -6586,6 +6586,7 @@ riscv_conditional_register_usage (void)
 
       fixed_regs[VTYPE_REGNUM] = call_used_regs[VTYPE_REGNUM] = 1;
       fixed_regs[VL_REGNUM] = call_used_regs[VL_REGNUM] = 1;
+      fixed_regs[VXRM_REGNUM] = call_used_regs[VXRM_REGNUM] = 1;
     }
 }
 
index 4473115d3a9690fcc178d183e1b66d80e5d1d280..f74b70de562924116515e00e6ca111c54772353c 100644 (file)
@@ -121,7 +121,8 @@ ASM_MISA_SPEC
 
 /* The mapping from gcc register number to DWARF 2 CFA column number.  */
 #define DWARF_FRAME_REGNUM(REGNO)                                              \
-  (VL_REG_P (REGNO) ? RISCV_DWARF_VL                                           \
+  (VXRM_REG_P (REGNO) ? RISCV_DWARF_VXRM                                       \
+   : VL_REG_P (REGNO) ? RISCV_DWARF_VL                                         \
    : VTYPE_REG_P (REGNO)                                                       \
      ? RISCV_DWARF_VTYPE                                                       \
      : (GP_REG_P (REGNO) || FP_REG_P (REGNO) || V_REG_P (REGNO)                \
@@ -372,6 +373,7 @@ ASM_MISA_SPEC
   ((unsigned int) ((int) (REGNO) - V_REG_FIRST) < V_REG_NUM)
 #define VL_REG_P(REGNO) ((REGNO) == VL_REGNUM)
 #define VTYPE_REG_P(REGNO) ((REGNO) == VTYPE_REGNUM)
+#define VXRM_REG_P(REGNO) ((REGNO) == VXRM_REGNUM)
 
 /* True when REGNO is in SIBCALL_REGS set.  */
 #define SIBCALL_REG_P(REGNO)   \
@@ -390,6 +392,7 @@ ASM_MISA_SPEC
 #define FRAME_POINTER_REGNUM 65
 
 /* Define Dwarf for RVV.  */
+#define RISCV_DWARF_VXRM (4096 + 0x00a)
 #define RISCV_DWARF_VL (4096 + 0xc20)
 #define RISCV_DWARF_VTYPE (4096 + 0xc21)
 #define RISCV_DWARF_VLENB (4096 + 0xc22)
index 7065e68c0b72012f113f603578587a80ea32e483..c5cf3af98682615fd3bb112771c0d562a445e450 100644 (file)
    (EXCEPTION_RETURN           2)
    (VL_REGNUM                  66)
    (VTYPE_REGNUM               67)
+   (VXRM_REGNUM                        68)
 ])
 
 (include "predicates.md")
index 328fce8d632d706819f83b3504357644ca143c3a..e0aeeea57a4dc011ebc912ede93c3fabc0b06af2 100644 (file)
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i,  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i,  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i,  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i,  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (any_sat_int_binop:VI
            (match_operand:VI 3 "<binop_rhs1_predicate>" " vr, vr, vr, vr, vr, vr, vr, vr")
            (match_operand:VI 4 "<binop_rhs2_predicate>" "<binop_rhs2_constraint>"))
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_plus_binop:VI_QHS
            (vec_duplicate:VI_QHS
              (match_operand:<VEL> 4 "register_operand"  "  r,  r,  r,  r"))
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_minus_binop:VI_QHS
            (match_operand:VI_QHS 3 "register_operand"   " vr, vr, vr, vr")
            (vec_duplicate:VI_QHS
             (match_operand 6 "const_int_operand")
             (match_operand 7 "const_int_operand")
             (match_operand 8 "const_int_operand")
+            (match_operand 9 "const_int_operand")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_plus_binop:VI_D
            (vec_duplicate:VI_D
              (match_operand:<VEL> 4 "reg_or_int_operand"))
        [] (rtx *operands, rtx boardcast_scalar) {
          emit_insn (gen_pred_<optab><mode> (operands[0], operands[1],
               operands[2], operands[3], boardcast_scalar, operands[5],
-              operands[6], operands[7], operands[8]));
+              operands[6], operands[7], operands[8], operands[9]));
         }))
     DONE;
 })
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_plus_binop:VI_D
            (vec_duplicate:VI_D
              (match_operand:<VEL> 4 "register_operand"  "  r,  r,  r,  r"))
             (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"            "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_plus_binop:VI_D
            (vec_duplicate:VI_D
              (sign_extend:<VEL>
             (match_operand 6 "const_int_operand")
             (match_operand 7 "const_int_operand")
             (match_operand 8 "const_int_operand")
+            (match_operand 9 "const_int_operand")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_minus_binop:VI_D
            (match_operand:VI_D 3 "register_operand")
            (vec_duplicate:VI_D
        [] (rtx *operands, rtx boardcast_scalar) {
          emit_insn (gen_pred_<optab><mode> (operands[0], operands[1],
               operands[2], operands[3], boardcast_scalar, operands[5],
-              operands[6], operands[7], operands[8]));
+              operands[6], operands[7], operands[8], operands[9]));
         }))
     DONE;
 })
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_minus_binop:VI_D
            (match_operand:VI_D 3 "register_operand"     " vr, vr, vr, vr")
            (vec_duplicate:VI_D
             (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"            "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (sat_int_minus_binop:VI_D
            (match_operand:VI_D 3 "register_operand"         " vr, vr, vr, vr")
            (vec_duplicate:VI_D
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI
            [(match_operand:VI 3 "register_operand"      " vr, vr, vr, vr")
             (match_operand:VI 4 "register_operand"      " vr, vr, vr, vr")] VSAT_OP)
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI_QHS
            [(match_operand:VI_QHS 3 "register_operand"  " vr, vr, vr, vr")
             (match_operand:<VEL> 4 "reg_or_0_operand"   " rJ, rJ, rJ, rJ")] VSAT_ARITH_OP)
             (match_operand 6 "const_int_operand"          "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"          "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"          "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"          "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI
            [(match_operand:VI 3 "register_operand"        " vr, vr, vr, vr")
             (match_operand 4 "pmode_reg_or_uimm5_operand" " rK, rK, rK, rK")] VSAT_SHIFT_OP)
             (match_operand 6 "const_int_operand")
             (match_operand 7 "const_int_operand")
             (match_operand 8 "const_int_operand")
+            (match_operand 9 "const_int_operand")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI_D
            [(match_operand:VI_D 3 "register_operand")
             (match_operand:<VEL> 4 "reg_or_int_operand")] VSAT_ARITH_OP)
        [] (rtx *operands, rtx boardcast_scalar) {
          emit_insn (gen_pred_<sat_op><mode> (operands[0], operands[1],
               operands[2], operands[3], boardcast_scalar, operands[5],
-              operands[6], operands[7], operands[8]));
+              operands[6], operands[7], operands[8], operands[9]));
         }))
     DONE;
 })
             (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI_D
            [(match_operand:VI_D 3 "register_operand"    " vr, vr, vr, vr")
             (match_operand:<VEL> 4 "reg_or_0_operand"   " rJ, rJ, rJ, rJ")] VSAT_ARITH_OP)
             (match_operand 6 "const_int_operand"           "  i,  i,  i,  i")
             (match_operand 7 "const_int_operand"           "  i,  i,  i,  i")
             (match_operand 8 "const_int_operand"           "  i,  i,  i,  i")
+            (match_operand 9 "const_int_operand"           "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VI_D
            [(match_operand:VI_D 3 "register_operand"       " vr, vr, vr, vr")
             (sign_extend:<VEL>
             (match_operand 6 "const_int_operand"                      "  i, i,  i,  i, i,  i,    i,    i,  i,  i,    i,    i")
             (match_operand 7 "const_int_operand"                      "  i, i,  i,  i, i,  i,    i,    i,  i,  i,    i,    i")
             (match_operand 8 "const_int_operand"                      "  i, i,  i,  i, i,  i,    i,    i,  i,  i,    i,    i")
+            (match_operand 9 "const_int_operand"                      "  i, i,  i,  i, i,  i,    i,    i,  i,  i,    i,    i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:<V_DOUBLE_TRUNC>
            [(match_operand:VWEXTI 3 "register_operand"                " vr,vr, vr, vr, 0,  0,   vr,   vr,  0,  0,   vr,   vr")
             (match_operand:<V_DOUBLE_TRUNC> 4 "vector_shift_operand"  "  0, 0,  0,  0,vr, vr,   vr,   vr, vk, vk,   vk,   vk")] VNCLIP)
             (match_operand 6 "const_int_operand"                      "  i,  i,  i,  i,    i,    i")
             (match_operand 7 "const_int_operand"                      "  i,  i,  i,  i,    i,    i")
             (match_operand 8 "const_int_operand"                      "  i,  i,  i,  i,    i,    i")
+            (match_operand 9 "const_int_operand"                      "  i,  i,  i,  i,    i,    i")
             (reg:SI VL_REGNUM)
-            (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+            (reg:SI VTYPE_REGNUM)
+            (reg:SI VXRM_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:<V_DOUBLE_TRUNC>
            [(match_operand:VWEXTI 3 "register_operand"                "  0,  0,  0,  0,   vr,   vr")
             (match_operand 4 "pmode_reg_or_uimm5_operand"             " rK, rK, rK, rK,   rK,   rK")] VNCLIP)