diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 91db6b6fc7984..12da015ae0ddb 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4064,8 +4064,10 @@ let Predicates = [HasSVE2_or_SME] in { let Predicates = [HasSVEAES, HasNonStreamingSVE2_or_SSVE_AES] in { // SVE2 crypto destructive binary operations - defm AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8>; - defm AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8>; + let isCommutable = 1 in { + def AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8>; + def AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8>; + } // SVE2 crypto unary operations defm AESMC_ZZ_B : sve2_crypto_unary_op<0b0, "aesmc", int_aarch64_sve_aesmc>; @@ -4082,7 +4084,7 @@ let Predicates = [HasSVE2SM4] in { // SVE2 crypto constructive binary operations defm SM4EKEY_ZZZ_S : sve2_crypto_cons_bin_op<0b0, "sm4ekey", ZPR32, int_aarch64_sve_sm4ekey, nxv4i32>; // SVE2 crypto destructive binary operations - defm SM4E_ZZZ_S : sve2_crypto_des_bin_op<0b10, "sm4e", ZPR32, int_aarch64_sve_sm4e, nxv4i32>; + def SM4E_ZZZ_S : sve2_crypto_des_bin_op<0b10, "sm4e", ZPR32, int_aarch64_sve_sm4e, nxv4i32>; } // End HasSVE2SM4 let Predicates = [HasSVE2SHA3] in { diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index c56713783289e..56d124d0d7581 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -9235,11 +9235,12 @@ multiclass sve2_crypto_cons_bin_op(NAME)>; } -class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty> +class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty, + SDPatternOperator op, ValueType vt> : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm), asm, "\t$Zdn, $_Zdn, $Zm", "", - []>, Sched<[]> { + [(set (vt zprty:$Zdn), (op (vt zprty:$_Zdn), (vt zprty:$Zm)))]>, Sched<[]> { bits<5> Zdn; bits<5> Zm; let Inst{31-17} = 0b010001010010001; @@ -9253,12 +9254,6 @@ class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty> let hasSideEffects = 0; } -multiclass sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty, - SDPatternOperator op, ValueType vt> { - def NAME : sve2_crypto_des_bin_op; - def : SVE_2_Op_Pat(NAME)>; -} - class sve2_crypto_unary_op : I<(outs zprty:$Zdn), (ins zprty:$_Zdn), asm, "\t$Zdn, $_Zdn", diff --git a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll index fe8271cdf054b..f477fcbe1eb5b 100644 --- a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll +++ b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll @@ -16,6 +16,17 @@ define @aesd_i8( %a, %b) ret %out } +define @aesd_i8_commuted( %a, +; CHECK-LABEL: aesd_i8_commuted: +; CHECK: // %bb.0: +; CHECK-NEXT: aesd z0.b, z0.b, z1.b +; CHECK-NEXT: ret + %b) { + %out = call @llvm.aarch64.sve.aesd( %b, + %a) + ret %out +} + ; ; AESIMC ; @@ -43,6 +54,17 @@ define @aese_i8( %a, %b) ret %out } +define @aese_i8_commuted( %a, +; CHECK-LABEL: aese_i8_commuted: +; CHECK: // %bb.0: +; CHECK-NEXT: aese z0.b, z0.b, z1.b +; CHECK-NEXT: ret + %b) { + %out = call @llvm.aarch64.sve.aese( %b, + %a) + ret %out +} + ; ; AESMC ;