aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <jlaw@ventanamicro.com>2023-12-15 14:19:25 -0700
committerJeff Law <jlaw@ventanamicro.com>2023-12-15 14:29:30 -0700
commit082835836cf763e74ed2fdf9645ac4f1f94d6d4f (patch)
treeef8070341357e41a57869b9098e37b4c81f4e5cf /gcc
parenta1f0d227481fe143f8c15b3f268e2d5964a3c90a (diff)
downloadgcc-082835836cf763e74ed2fdf9645ac4f1f94d6d4f.zip
gcc-082835836cf763e74ed2fdf9645ac4f1f94d6d4f.tar.gz
gcc-082835836cf763e74ed2fdf9645ac4f1f94d6d4f.tar.bz2
Re: [PATCH] RISC-V: fix scalar crypto patterns
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/riscv/constraints.md8
-rw-r--r--gcc/config/riscv/crypto.md16
-rw-r--r--gcc/config/riscv/predicates.md8
-rw-r--r--gcc/testsuite/gcc.target/riscv/zknd32-2.c28
-rw-r--r--gcc/testsuite/gcc.target/riscv/zknd32.c25
-rw-r--r--gcc/testsuite/gcc.target/riscv/zknd64-2.c42
-rw-r--r--gcc/testsuite/gcc.target/riscv/zknd64.c26
-rw-r--r--gcc/testsuite/gcc.target/riscv/zkne32-2.c28
-rw-r--r--gcc/testsuite/gcc.target/riscv/zkne32.c25
-rw-r--r--gcc/testsuite/gcc.target/riscv/zkne64-2.c34
-rw-r--r--gcc/testsuite/gcc.target/riscv/zkne64.c19
-rw-r--r--gcc/testsuite/gcc.target/riscv/zksed32-2.c29
-rw-r--r--gcc/testsuite/gcc.target/riscv/zksed32.c24
-rw-r--r--gcc/testsuite/gcc.target/riscv/zksed64-2.c29
-rw-r--r--gcc/testsuite/gcc.target/riscv/zksed64.c24
15 files changed, 298 insertions, 67 deletions
diff --git a/gcc/config/riscv/constraints.md b/gcc/config/riscv/constraints.md
index 9836fd3..d0f95b2 100644
--- a/gcc/config/riscv/constraints.md
+++ b/gcc/config/riscv/constraints.md
@@ -103,14 +103,6 @@
(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"
diff --git a/gcc/config/riscv/crypto.md b/gcc/config/riscv/crypto.md
index 03a1d03..2b65fad 100644
--- a/gcc/config/riscv/crypto.md
+++ b/gcc/config/riscv/crypto.md
@@ -148,7 +148,7 @@
[(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"
@@ -158,7 +158,7 @@
[(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"
@@ -193,7 +193,7 @@
(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"
@@ -214,7 +214,7 @@
[(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"
@@ -224,7 +224,7 @@
[(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"
@@ -431,7 +431,7 @@
[(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"
@@ -442,7 +442,7 @@
(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"
@@ -452,7 +452,7 @@
[(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"
{
diff --git a/gcc/config/riscv/predicates.md b/gcc/config/riscv/predicates.md
index 525455f..6bf6e18 100644
--- a/gcc/config/riscv/predicates.md
+++ b/gcc/config/riscv/predicates.md
@@ -51,6 +51,14 @@
(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
index 0000000..f3549e7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zknd32-2.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zknd32.c b/gcc/testsuite/gcc.target/riscv/zknd32.c
index e60c027..31d475a 100644
--- a/gcc/testsuite/gcc.target/riscv/zknd32.c
+++ b/gcc/testsuite/gcc.target/riscv/zknd32.c
@@ -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
index 0000000..cd0e79d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zknd64-2.c
@@ -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 } } */
+
diff --git a/gcc/testsuite/gcc.target/riscv/zknd64.c b/gcc/testsuite/gcc.target/riscv/zknd64.c
index 707418c..e6a7b88 100644
--- a/gcc/testsuite/gcc.target/riscv/zknd64.c
+++ b/gcc/testsuite/gcc.target/riscv/zknd64.c
@@ -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
index 0000000..4ad1cdc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zkne32-2.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zkne32.c b/gcc/testsuite/gcc.target/riscv/zkne32.c
index 252e9ff..68dad61 100644
--- a/gcc/testsuite/gcc.target/riscv/zkne32.c
+++ b/gcc/testsuite/gcc.target/riscv/zkne32.c
@@ -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
index 0000000..144c394
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zkne64-2.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zkne64.c b/gcc/testsuite/gcc.target/riscv/zkne64.c
index b25f6b5..88a89f8 100644
--- a/gcc/testsuite/gcc.target/riscv/zkne64.c
+++ b/gcc/testsuite/gcc.target/riscv/zkne64.c
@@ -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
index 0000000..cee8cc2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zksed32-2.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zksed32.c b/gcc/testsuite/gcc.target/riscv/zksed32.c
index 0e8f01c..cb178a2 100644
--- a/gcc/testsuite/gcc.target/riscv/zksed32.c
+++ b/gcc/testsuite/gcc.target/riscv/zksed32.c
@@ -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
index 0000000..ee20aa1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zksed64-2.c
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zksed64.c b/gcc/testsuite/gcc.target/riscv/zksed64.c
index 9e4d196..d38ed1c 100644
--- a/gcc/testsuite/gcc.target/riscv/zksed64.c
+++ b/gcc/testsuite/gcc.target/riscv/zksed64.c
@@ -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" } */
+}