PR target/110201 gcc/ * config/riscv/predicates.md (const_0_3_operand): New predicate. * config/riscv/crypto.md (riscv_aes32dsi): Use new predicate. (riscv_aes32dsmi, riscv_aes32esi, riscvaes32esmi): Likewise. (riscv_sm4ed_, riscv_sm4ks_" [(set (match_operand:X 0 "register_operand" "=r") (unspec:X [(match_operand:X 1 "register_operand" "r") (match_operand:X 2 "register_operand" "r") - (match_operand:SI 3 "register_operand" "D03")] + (match_operand:SI 3 "const_0_3_operand" "D03")] UNSPEC_SM4_ED))] "TARGET_ZKSED" "sm4ed\t%0,%1,%2,%3" @@ -404,7 +404,7 @@ (define_insn "riscv_sm4ks_" [(set (match_operand:X 0 "register_operand" "=r") (unspec:X [(match_operand:X 1 "register_operand" "r") (match_operand:X 2 "register_operand" "r") - (match_operand:SI 3 "register_operand" "D03")] + (match_operand:SI 3 "const_0_3_operand" "D03")] UNSPEC_SM4_KS))] "TARGET_ZKSED" "sm4ks\t%0,%1,%2,%3" diff --git a/gcc/config/riscv/predicates.md b/gcc/config/riscv/predicates.md index 04ca6ceabc7..7aed71b5123 100644 --- a/gcc/config/riscv/predicates.md +++ b/gcc/config/riscv/predicates.md @@ -45,6 +45,10 @@ (define_predicate "const_csr_operand" (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 "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 00000000000..f8e68c6e56b --- /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 + +int32_t foo1(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsi(rs1,rs2,0); +} + +int32_t foo2(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsmi(rs1,rs2,0); +} + +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsi(rs1,rs2,3); +} + +int32_t foo4(int32_t rs1, int32_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 5fcc66da901..7370a2c1812 100644 --- a/gcc/testsuite/gcc.target/riscv/zknd32.c +++ b/gcc/testsuite/gcc.target/riscv/zknd32.c @@ -6,13 +6,30 @@ int32_t foo1(int32_t rs1, int32_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" } */ } int32_t foo2(int32_t rs1, int32_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 } } */ +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsi(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo4(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsmi(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo5(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32dsi(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo6(int32_t rs1, int32_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/zkne32-2.c b/gcc/testsuite/gcc.target/riscv/zkne32-2.c new file mode 100644 index 00000000000..57a9b3f7d2e --- /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 + +int32_t foo1(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esi(rs1, rs2, 0); +} + +int32_t foo2(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esmi(rs1, rs2, 0); +} + +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esi(rs1, rs2, 3); +} + +int32_t foo4(int32_t rs1, int32_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 c131c9a6bbb..c7a0d0d02b8 100644 --- a/gcc/testsuite/gcc.target/riscv/zkne32.c +++ b/gcc/testsuite/gcc.target/riscv/zkne32.c @@ -6,13 +6,31 @@ int32_t foo1(int32_t rs1, int32_t rs2, int bs) { - return __builtin_riscv_aes32esi(rs1, rs2, bs); + return __builtin_riscv_aes32esi(rs1, rs2, bs); /* { dg-error "invalid argument to built-in function" } */ } int32_t foo2(int32_t rs1, int32_t rs2, int bs) { - return __builtin_riscv_aes32esmi(rs1, rs2, bs); + return __builtin_riscv_aes32esmi(rs1, rs2, bs); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esi(rs1, rs2, -1); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo4(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esmi(rs1, rs2, -1); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo5(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esi(rs1, rs2, 4); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo6(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_aes32esmi(rs1, rs2, 4); /* { dg-error "invalid argument to built-in function" } */ } -/* { dg-final { scan-assembler-times "aes32esi" 1 } } */ -/* { dg-final { scan-assembler-times "aes32esmi" 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 00000000000..6cb5ac35d75 --- /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 + +int32_t foo1(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,0); +} + +int32_t foo2(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,0); +} + +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,3); +} + +int32_t foo4(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,3); +} + + +/* { dg-final { scan-assembler-times "sm4ks" 2 } } */ +/* { dg-final { scan-assembler-times "sm4ed" 2 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zksed32.c b/gcc/testsuite/gcc.target/riscv/zksed32.c index 9548d007cb2..ee296dc7d8f 100644 --- a/gcc/testsuite/gcc.target/riscv/zksed32.c +++ b/gcc/testsuite/gcc.target/riscv/zksed32.c @@ -6,14 +6,31 @@ int32_t foo1(int32_t rs1, int32_t rs2, int bs) { - return __builtin_riscv_sm4ks(rs1,rs2,bs); + return __builtin_riscv_sm4ks(rs1,rs2,bs); /* { dg-error "invalid argument to built-in function" } */ } int32_t foo2(int32_t rs1, int32_t rs2, int bs) { - return __builtin_riscv_sm4ed(rs1,rs2,bs); + return __builtin_riscv_sm4ed(rs1,rs2,bs);/* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo3(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo4(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,-1);/* { dg-error "invalid argument to built-in function" } */ } -/* { dg-final { scan-assembler-times "sm4ks" 1 } } */ -/* { dg-final { scan-assembler-times "sm4ed" 1 } } */ +int32_t foo5(int32_t rs1, int32_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */ +} + +int32_t foo6(int32_t rs1, int32_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 00000000000..5fb0bfd69f8 --- /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 + +int64_t foo1(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,0); +} + +int64_t foo2(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,0); +} + +int64_t foo3(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,3); +} + +int64_t foo4(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,3); +} + + +/* { dg-final { scan-assembler-times "sm4ks" 2 } } */ +/* { dg-final { scan-assembler-times "sm4ed" 2 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/zksed64.c b/gcc/testsuite/gcc.target/riscv/zksed64.c index 190a654151d..f7bf9f0c79a 100644 --- a/gcc/testsuite/gcc.target/riscv/zksed64.c +++ b/gcc/testsuite/gcc.target/riscv/zksed64.c @@ -6,14 +6,30 @@ int64_t foo1(int64_t rs1, int64_t rs2, int bs) { - return __builtin_riscv_sm4ks(rs1,rs2,bs); + return __builtin_riscv_sm4ks(rs1,rs2,bs); /* { dg-error "invalid argument to built-in function" } */ } int64_t foo2(int64_t rs1, int64_t rs2, int bs) { - return __builtin_riscv_sm4ed(rs1,rs2,bs); + return __builtin_riscv_sm4ed(rs1,rs2,bs); /* { dg-error "invalid argument to built-in function" } */ } +int64_t foo3(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */ +} + +int64_t foo4(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,-1); /* { dg-error "invalid argument to built-in function" } */ +} -/* { dg-final { scan-assembler-times "sm4ks" 1 } } */ -/* { dg-final { scan-assembler-times "sm4ed" 1 } } */ +int64_t foo5(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ks(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */ +} + +int64_t foo6(int64_t rs1, int64_t rs2) +{ + return __builtin_riscv_sm4ed(rs1,rs2,4); /* { dg-error "invalid argument to built-in function" } */ +}