]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Re: [PATCH] RISC-V: fix scalar crypto patterns
authorJeff Law <jlaw@ventanamicro.com>
Fri, 15 Dec 2023 21:19:25 +0000 (14:19 -0700)
committerJeff Law <jlaw@ventanamicro.com>
Fri, 15 Dec 2023 21:29:30 +0000 (14:29 -0700)
A handful of the scalar crypto instructions are supposed to take a
constant integer argument 0..3 inclusive and one should accept 0..10.
A suitable constraint was created and used for this purpose (D03 and DsA),
but the operand's predicate is "register_operand".  That's just wrong.

This patch adds a new predicates "const_0_3_operand" and "const_0_10_operand"
and fixes the relevant insns to use the appropriate predicate.   It drops the
now unnecessary constraints.

The testsuite was broken in a way that made it consistent with the
compiler, so the tests passed, when they really should have been issuing
errors all along.

This patch adjusts the existing tests so that they all expect a
diagnostic on the invalid operand usage (including out of range
constants).  It adds new tests with proper constants, testing the
extremes of valid values.

PR target/110201

gcc/

* config/riscv/constraints.md (D03, DsA): Remove unused constraints.
* config/riscv/predicates.md (const_0_3_operand): New predicate.
(const_0_10_operand): Likewise.
* config/riscv/crypto.md (riscv_aes32dsi): Use new predicate.  Drop
unnecessary constraint.
(riscv_aes32dsmi, riscv_aes64im, riscv_aes32esi): Likewise.
(riscv_aes32esmi, *riscv_<sm4_op>_si): Likewise.
(riscv_<sm4_op>_di_extend, riscv_<sm4_op>_si): Likewise.

gcc/testsuite
* gcc.target/riscv/zknd32.c: Verify diagnostics are issued for
invalid builtin arguments.
* gcc.target/riscv/zknd64.c: Likewise.
* gcc.target/riscv/zkne32.c: Likewise.
* gcc.target/riscv/zkne64.c: Likewise.
* gcc.target/riscv/zksed32.c: Likewise.
* gcc.target/riscv/zksed64.c: Likewise.
* gcc.target/riscv/zknd32-2.c: New test
* gcc.target/riscv/zknd64-2.c: Likewise.
* gcc.target/riscv/zkne32-2.c: Likewise.
* gcc.target/riscv/zkne64-2.c: Likewise.
* gcc.target/riscv/zksed32-2.c: Likewise.
* gcc.target/riscv/zksed64-2.c: Likewise.

Co-authored-by: Liao Shihua <shihua@iscas.ac.cn>
15 files changed:
gcc/config/riscv/constraints.md
gcc/config/riscv/crypto.md
gcc/config/riscv/predicates.md
gcc/testsuite/gcc.target/riscv/zknd32-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zknd32.c
gcc/testsuite/gcc.target/riscv/zknd64-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zknd64.c
gcc/testsuite/gcc.target/riscv/zkne32-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zkne32.c
gcc/testsuite/gcc.target/riscv/zkne64-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zkne64.c
gcc/testsuite/gcc.target/riscv/zksed32-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zksed32.c
gcc/testsuite/gcc.target/riscv/zksed64-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zksed64.c

index 9836fd34460873a3f57f7765c2e0bc5f03d3404b..d0f95b2b594779d75449571b3e53420960e81cbe 100644 (file)
   (and (match_code "const_int")
        (match_test "SINGLE_BIT_MASK_OPERAND (~ival)")))
 
-(define_constraint "D03"
-  "0, 1, 2 or 3 immediate"
-  (match_test "IN_RANGE (ival, 0, 3)"))
-
-(define_constraint "DsA"
-  "0 - 10 immediate"
-  (match_test "IN_RANGE (ival, 0, 10)"))
-
 ;; Floating-point constant +0.0, used for FCVT-based moves when FMV is
 ;; not available in RV32.
 (define_constraint "G"
index 03a1d03397d9dc089111670fcadfbf437b8b2515..2b65fadeb15814f1d39c83abf9cf134f74125afc 100644 (file)
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    UNSPEC_AES_DSI))]
   "TARGET_ZKND && !TARGET_64BIT"
   "aes32dsi\t%0,%1,%2,%3"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    UNSPEC_AES_DSMI))]
   "TARGET_ZKND && !TARGET_64BIT"
   "aes32dsmi\t%0,%1,%2,%3"
 (define_insn "riscv_aes64ks1i"
   [(set (match_operand:DI 0 "register_operand" "=r")
         (unspec:DI [(match_operand:DI 1 "register_operand" "r")
-                   (match_operand:SI 2 "register_operand" "DsA")]
+                   (match_operand:SI 2 "const_0_10_operand" "")]
                    UNSPEC_AES_KS1I))]
   "(TARGET_ZKND || TARGET_ZKNE) && TARGET_64BIT"
   "aes64ks1i\t%0,%1,%2"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    UNSPEC_AES_ESI))]
   "TARGET_ZKNE && !TARGET_64BIT"
   "aes32esi\t%0,%1,%2,%3"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    UNSPEC_AES_ESMI))]
   "TARGET_ZKNE && !TARGET_64BIT"
   "aes32esmi\t%0,%1,%2,%3"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    SM4_OP))]
   "TARGET_ZKSED && !TARGET_64BIT"
   "<sm4_op>\t%0,%1,%2,%3"
         (sign_extend:DI
              (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                         (match_operand:SI 2 "register_operand" "r")
-                        (match_operand:SI 3 "register_operand" "D03")]
+                        (match_operand:SI 3 "const_0_3_operand" "")]
                         SM4_OP)))]
   "TARGET_ZKSED && TARGET_64BIT"
   "<sm4_op>\t%0,%1,%2,%3"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(match_operand:SI 1 "register_operand" "r")
                    (match_operand:SI 2 "register_operand" "r")
-                   (match_operand:SI 3 "register_operand" "D03")]
+                   (match_operand:SI 3 "const_0_3_operand" "")]
                    SM4_OP))]
   "TARGET_ZKSED"
   {
index 525455f6db69c4d01dd53ac5255a45ec917052fc..6bf6e186641a1f5e8a7674aca934cc7c3d103f5a 100644 (file)
   (and (match_code "const_int")
        (match_test "IN_RANGE (INTVAL (op), 0, 31)")))
 
+(define_predicate "const_0_3_operand"
+  (and (match_code "const_int")
+       (match_test "IN_RANGE (INTVAL (op), 0, 3)")))
+
+(define_predicate "const_0_10_operand"
+  (and (match_code "const_int")
+       (match_test "IN_RANGE (INTVAL (op), 0, 10)")))
+
 (define_predicate "csr_operand"
   (ior (match_operand 0 "const_csr_operand")
        (match_operand 0 "register_operand")))
diff --git a/gcc/testsuite/gcc.target/riscv/zknd32-2.c b/gcc/testsuite/gcc.target/riscv/zknd32-2.c
new file mode 100644 (file)
index 0000000..f3549e7
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv32gc_zknd -mabi=ilp32d" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint32_t foo1(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsi(rs1,rs2,0);
+}
+
+uint32_t foo2(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsmi(rs1,rs2,0);
+}
+
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsi(rs1,rs2,3);
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsmi(rs1,rs2,3);
+}
+
+/* { dg-final { scan-assembler-times "aes32dsi" 2 } } */
+/* { dg-final { scan-assembler-times "aes32dsmi" 2 } } */
index e60c027e0911cd920dcc4ff83af6c30a51d19ef5..31d475a8d83db513c4c11228c4ac66eaa0946d04 100644 (file)
@@ -6,13 +6,30 @@
 
 uint32_t foo1(uint32_t rs1, uint32_t rs2, int bs)
 {
-    return __builtin_riscv_aes32dsi(rs1,rs2,bs);
+    return __builtin_riscv_aes32dsi(rs1,rs2,bs);       /* { dg-error "invalid argument to built-in function" } */
 }
 
 uint32_t foo2(uint32_t rs1, uint32_t rs2, int bs)
 {
-    return __builtin_riscv_aes32dsmi(rs1,rs2,bs);
+    return __builtin_riscv_aes32dsmi(rs1,rs2,bs);      /* { dg-error "invalid argument to built-in function" } */
 }
 
-/* { dg-final { scan-assembler-times "aes32dsi" 1 } } */
-/* { dg-final { scan-assembler-times "aes32dsmi" 1 } } */
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsi(rs1,rs2,-1);       /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsmi(rs1,rs2,-1);      /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo5(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsi(rs1,rs2,4);                /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo6(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32dsmi(rs1,rs2,4);       /* { dg-error "invalid argument to built-in function" } */
+}
diff --git a/gcc/testsuite/gcc.target/riscv/zknd64-2.c b/gcc/testsuite/gcc.target/riscv/zknd64-2.c
new file mode 100644 (file)
index 0000000..cd0e79d
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv64gc_zknd -mabi=lp64" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint64_t foo1(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64ds(rs1,rs2);
+}
+
+uint64_t foo2(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64dsm(rs1,rs2);
+}
+
+uint64_t foo3(uint64_t rs1, unsigned rnum)
+{
+    return __builtin_riscv_aes64ks1i(rs1,0);
+}
+
+uint64_t foo3a(uint64_t rs1, unsigned rnum)
+{
+    return __builtin_riscv_aes64ks1i(rs1,10);
+}
+
+uint64_t foo4(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64ks2(rs1,rs2);
+}
+
+uint64_t foo5(uint64_t rs1)
+{
+    return __builtin_riscv_aes64im(rs1);
+}
+
+/* { dg-final { scan-assembler-times "aes64ds\t" 1 } } */
+/* { dg-final { scan-assembler-times "aes64dsm" 1 } } */
+/* { dg-final { scan-assembler-times "aes64ks1i" 2 } } */
+/* { dg-final { scan-assembler-times "aes64ks2" 1 } } */
+/* { dg-final { scan-assembler-times {\maes64im} 1 } } */
+
index 707418cd51e75e29cae1852eeecd7f33672a6eb7..e6a7b88813e332f9b1eefdfccd498065cdba6c74 100644 (file)
@@ -4,33 +4,17 @@
 
 #include <stdint-gcc.h>
 
-uint64_t foo1(uint64_t rs1, uint64_t rs2)
-{
-    return __builtin_riscv_aes64ds(rs1,rs2);
-}
-
-uint64_t foo2(uint64_t rs1, uint64_t rs2)
-{
-    return __builtin_riscv_aes64dsm(rs1,rs2);
-}
-
 uint64_t foo3(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64ks1i(rs1,rnum);
+    return __builtin_riscv_aes64ks1i(rs1,rnum);        /* { dg-error "invalid argument to built-in function" } */
 }
 
-uint64_t foo4(uint64_t rs1, uint64_t rs2)
+uint64_t foo3a(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64ks2(rs1,rs2);
+    return __builtin_riscv_aes64ks1i(rs1,-1);  /* { dg-error "invalid argument to built-in function" } */
 }
 
-uint64_t foo5(uint64_t rs1)
+uint64_t foo3b(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64im(rs1);
+    return __builtin_riscv_aes64ks1i(rs1,11);  /* { dg-error "invalid argument to built-in function" } */
 }
-
-/* { dg-final { scan-assembler-times "aes64ds\t" 1 } } */
-/* { dg-final { scan-assembler-times "aes64dsm" 1 } } */
-/* { dg-final { scan-assembler-times "aes64ks1i" 1 } } */
-/* { dg-final { scan-assembler-times "aes64ks2" 1 } } */
-/* { dg-final { scan-assembler-times {\maes64im} 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zkne32-2.c b/gcc/testsuite/gcc.target/riscv/zkne32-2.c
new file mode 100644 (file)
index 0000000..4ad1cdc
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv32gc_zkne -mabi=ilp32d" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint32_t foo1(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esi(rs1, rs2, 0);
+}
+
+uint32_t foo2(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esmi(rs1, rs2, 0);
+}
+
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esi(rs1, rs2, 3);
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esmi(rs1, rs2, 3);
+}
+
+/* { dg-final { scan-assembler-times "aes32esi" 2 } } */
+/* { dg-final { scan-assembler-times "aes32esmi" 2 } } */
index 252e9ffa43b3c293cf6c230a07c72db15014c0e5..68dad613dad54c490120116440f321f19f25ccb4 100644 (file)
@@ -6,13 +6,30 @@
 
 uint32_t foo1(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_aes32esi(rs1, rs2, bs);
+    return __builtin_riscv_aes32esi(rs1, rs2, bs);     /* { dg-error "invalid argument to built-in function" } */
 }
 
 uint32_t foo2(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_aes32esmi(rs1, rs2, bs);
+    return __builtin_riscv_aes32esmi(rs1, rs2, bs);    /* { dg-error "invalid argument to built-in function" } */
 }
 
-/* { dg-final { scan-assembler-times "aes32esi" 1 } } */
-/* { dg-final { scan-assembler-times "aes32esmi" 1 } } */
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esi(rs1, rs2, -1);     /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esmi(rs1, rs2, -1);    /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo5(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esi(rs1, rs2, 4);      /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo6(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_aes32esmi(rs1, rs2, 4);     /* { dg-error "invalid argument to built-in function" } */
+}
diff --git a/gcc/testsuite/gcc.target/riscv/zkne64-2.c b/gcc/testsuite/gcc.target/riscv/zkne64-2.c
new file mode 100644 (file)
index 0000000..144c394
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv64gc_zkne -mabi=lp64" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint64_t foo1(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64es(rs1,rs2);
+}
+
+uint64_t foo2(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64esm(rs1,rs2);
+}
+
+uint64_t foo3(uint64_t rs1, unsigned rnum)
+{
+    return __builtin_riscv_aes64ks1i(rs1,0);
+}
+
+uint64_t foo3a(uint64_t rs1, unsigned rnum)
+{
+    return __builtin_riscv_aes64ks1i(rs1,10);
+}
+uint64_t foo4(uint64_t rs1, uint64_t rs2)
+{
+    return __builtin_riscv_aes64ks2(rs1,rs2);
+}
+
+/* { dg-final { scan-assembler-times "aes64es\t" 1 } } */
+/* { dg-final { scan-assembler-times "aes64esm" 1 } } */
+/* { dg-final { scan-assembler-times "aes64ks1i" 2 } } */
+/* { dg-final { scan-assembler-times "aes64ks2" 1 } } */
index b25f6b5c29ac32edba0334e63d8d974d46c72316..88a89f8762ca825f94000f04359f0dc7b339f2d5 100644 (file)
@@ -4,27 +4,18 @@
 
 #include <stdint-gcc.h>
 
-uint64_t foo1(uint64_t rs1, uint64_t rs2)
+uint64_t foo1(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64es(rs1,rs2);
+    return __builtin_riscv_aes64ks1i(rs1,-1);  /* { dg-error "invalid argument to built-in function" } */
 }
 
-uint64_t foo2(uint64_t rs1, uint64_t rs2)
+uint64_t foo2(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64esm(rs1,rs2);
+    return __builtin_riscv_aes64ks1i(rs1,11);  /* { dg-error "invalid argument to built-in function" } */
 }
 
 uint64_t foo3(uint64_t rs1, unsigned rnum)
 {
-    return __builtin_riscv_aes64ks1i(rs1,rnum);
+    return __builtin_riscv_aes64ks1i(rs1,rnum);        /* { dg-error "invalid argument to built-in function" } */
 }
 
-uint64_t foo4(uint64_t rs1, uint64_t rs2)
-{
-    return __builtin_riscv_aes64ks2(rs1,rs2);
-}
-
-/* { dg-final { scan-assembler-times "aes64es\t" 1 } } */
-/* { dg-final { scan-assembler-times "aes64esm" 1 } } */
-/* { dg-final { scan-assembler-times "aes64ks1i" 1 } } */
-/* { dg-final { scan-assembler-times "aes64ks2" 1 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zksed32-2.c b/gcc/testsuite/gcc.target/riscv/zksed32-2.c
new file mode 100644 (file)
index 0000000..cee8cc2
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv32gc_zksed -mabi=ilp32" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint32_t foo1(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,0);
+}
+
+uint32_t foo2(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,0);
+}
+
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,3);
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,3);
+}
+
+
+/* { dg-final { scan-assembler-times {\msm4ks} 2 } } */
+/* { dg-final { scan-assembler-times {\msm4ed} 2 } } */
index 0e8f01cd5485ff8b61b73b9b00d4c14c98ad1236..cb178a2daeb5fa09c79d8e39ee53532a62f32aeb 100644 (file)
@@ -6,14 +6,30 @@
 
 uint32_t foo1(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_sm4ks(rs1,rs2,bs);
+    return __builtin_riscv_sm4ks(rs1,rs2,bs);  /* { dg-error "invalid argument to built-in function" } */
 }
 
 uint32_t foo2(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_sm4ed(rs1,rs2,bs);
+    return __builtin_riscv_sm4ed(rs1,rs2,bs);  /* { dg-error "invalid argument to built-in function" } */
 }
 
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,-1);  /* { dg-error "invalid argument to built-in function" } */
+}
 
-/* { dg-final { scan-assembler-times {\msm4ks} 1 } } */
-/* { dg-final { scan-assembler-times {\msm4ed} 1 } } */
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,-1);  /* { dg-error "invalid argument to built-in function" } */
+}
+uint32_t foo5(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,4);   /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo6(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,4);   /* { dg-error "invalid argument to built-in function" } */
+}
diff --git a/gcc/testsuite/gcc.target/riscv/zksed64-2.c b/gcc/testsuite/gcc.target/riscv/zksed64-2.c
new file mode 100644 (file)
index 0000000..ee20aa1
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv64gc_zksed -mabi=lp64" } */
+/* { dg-skip-if "" { *-*-* } { "-g" "-flto"} } */
+
+#include <stdint-gcc.h>
+
+uint32_t foo1(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,0);
+}
+
+uint32_t foo2(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,0);
+}
+
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,3);
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,3);
+}
+
+
+/* { dg-final { scan-assembler-times {\msm4ks} 2 } } */
+/* { dg-final { scan-assembler-times {\msm4ed} 2 } } */
index 9e4d1961419c41920d1042958c1c9a1e171c42ff..d38ed1caf976327c6338bfabf78765164691f604 100644 (file)
@@ -6,14 +6,30 @@
 
 uint32_t foo1(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_sm4ks(rs1,rs2,bs);
+    return __builtin_riscv_sm4ks(rs1,rs2,bs);  /* { dg-error "invalid argument to built-in function" } */
 }
 
 uint32_t foo2(uint32_t rs1, uint32_t rs2, unsigned bs)
 {
-    return __builtin_riscv_sm4ed(rs1,rs2,bs);
+    return __builtin_riscv_sm4ed(rs1,rs2,bs);  /* { dg-error "invalid argument to built-in function" } */
 }
 
+uint32_t foo3(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo4(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */
+}
 
-/* { dg-final { scan-assembler-times {\msm4ks} 1 } } */
-/* { dg-final { scan-assembler-times {\msm4ed} 1 } } */
+uint32_t foo5(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ks(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */
+}
+
+uint32_t foo6(uint32_t rs1, uint32_t rs2)
+{
+    return __builtin_riscv_sm4ed(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */
+}