https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111334
--- Comment #14 from Xi Ruoyao <xry111 at gcc dot gnu.org> ---
I'm trying
diff --git a/gcc/config/loongarch/loongarch.md
b/gcc/config/loongarch/loongarch.md
index 75f641b38ee..44d9b99b2f5 100644
--- a/gcc/config/loongarch/loongarch.md
+++ b/gcc/config/loongarch/loongarch.md
@@ -64,6 +64,12 @@ (define_c_enum "unspec" [
UNSPEC_CRC
UNSPEC_CRCC
+ ;; 32-bit divisions can produce unspecified value if TARGET_64BIT
+ UNSPEC_DIV_W
+ UNSPEC_UDIV_W
+ UNSPEC_MOD_W
+ UNSPEC_UMOD_W
+
UNSPEC_LOAD_FROM_GOT
UNSPEC_PCALAU12I
UNSPEC_ORI_L_LO12
@@ -461,6 +467,8 @@ (define_code_iterator neg_bitwise [and ior])
;; This code iterator allows unsigned and signed division to be generated
;; from the same template.
(define_code_iterator any_div [div udiv mod umod])
+(define_code_attr ANY_DIV [(div "DIV") (udiv "UDIV")
+ (mod "MOD") (umod "UMOD")])
;; This code iterator allows addition and subtraction to be generated
;; from the same template.
@@ -918,8 +926,9 @@ (define_insn "*<optab><mode>3"
(define_insn "<optab>di3_fake"
[(set (match_operand:DI 0 "register_operand" "=r,&r,&r")
(sign_extend:DI
- (any_div:SI (match_operand:DI 1 "register_operand" "r,r,0")
- (match_operand:DI 2 "register_operand" "r,r,r"))))]
+ (unspec:SI [(match_operand:DI 1 "register_operand" "r,r,0")
+ (match_operand:DI 2 "register_operand" "r,r,r")]
+ UNSPEC_<ANY_DIV>)))]
""
{
return loongarch_output_division ("<insn>.w<u>\t%0,%1,%2", operands);
But:
../../gcc/gcc/config/loongarch/loongarch.md:931:23: error: invalid decimal
constant "UNSPEC_<ANY_DIV>"