@samitouri / QOSamiQemu / commits / df63b69b8d

target/arm: Implement PMULL, PMLAL

Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260826174213.614571-25-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Aug 26, 2026 at 10:42 UTC df63b69b8d12a97487e063128c324d25dbcdae4e
4 files changed +47
target/arm/tcg/helper-sve-defs.h
+3
@@ -3215,3 +3215,6 @@ DEF_HELPER_FLAGS_4(sve_expand_b, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
3215 DEF_HELPER_FLAGS_4(sve_expand_h, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
3216 DEF_HELPER_FLAGS_4(sve_expand_s, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
3217 DEF_HELPER_FLAGS_4(sve_expand_d, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
3218 +
3219 +DEF_HELPER_FLAGS_4(sve_pmull_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
3220 +DEF_HELPER_FLAGS_4(sve_pmlal_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
target/arm/tcg/sve.decode
+5
@@ -1994,6 +1994,11 @@ AESEMC 01000101 00 1 .. .11111010 ..... ...00 @aes2_4
1994 AESDIMC 01000101 00 1 .. .11111011 ..... ....0 @aes2_2
1995 AESDIMC 01000101 00 1 .. .11111011 ..... ...00 @aes2_4
1996
1997 +PMULL 01000101 00 1 rm:5 111110 rn:5 ....0 \
1998 + &rrr_esz esz=0 rd=%zd_ax2
1999 +PMLAL 01000101 00 1 rm:5 111111 rn:5 ....0 \
2000 + &rrr_esz esz=0 rd=%zd_ax2
2001 +
2002 # SVE2 crypto constructive binary operations
2003 SM4EKEY 01000101 00 1 ..... 11110 0 ..... ..... @rd_rn_rm_e0
2004 RAX1 01000101 00 1 ..... 11110 1 ..... ..... @rd_rn_rm_e0
target/arm/tcg/translate-sve.c
+5
@@ -8351,6 +8351,11 @@ TRANS_FEAT_STREAMING_IF(AESEMC, aa64_sve_aes2, aa64_ssve_aes,
8351 TRANS_FEAT_STREAMING_IF(AESDIMC, aa64_sve_aes2, aa64_ssve_aes,
8352 do_aes2_idx, a, gen_helper_crypto_aesdimc)
8353
8354 +TRANS_FEAT_STREAMING_IF(PMULL, aa64_sve_aes2, aa64_ssve_aes,
8355 + gen_gvec_ool_arg_zzz, gen_helper_sve_pmull_q, a, 0)
8356 +TRANS_FEAT_STREAMING_IF(PMLAL, aa64_sve_aes2, aa64_ssve_aes,
8357 + gen_gvec_ool_arg_zzz, gen_helper_sve_pmlal_q, a, 0)
8358 +
8359 TRANS_FEAT(FCVTNT_sh_m, aa64_sme_or_sve2, gen_gvec_fpst_arg_zpz,
8360 gen_helper_sve2_fcvtnt_sh, a, 0, FPST_A64)
8361 TRANS_FEAT(FCVTNT_sh_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
target/arm/tcg/vec_helper64.c
+34
@@ -89,6 +89,40 @@ void HELPER(sve2_pmull_d)(void *vd, void *vn, void *vm, uint32_t desc)
89 }
90 }
91
92 +void HELPER(sve_pmull_q)(void *vd, void *vn, void *vm, uint32_t desc)
93 +{
94 + intptr_t opr_sz = simd_oprsz(desc);
95 + uint64_t *n = vn, *m = vm;
96 + uint64_t *d0 = vd;
97 + uint64_t *d1 = vd + sizeof(ARMVectorReg);
98 +
99 + for (intptr_t i = 0; i < opr_sz / 16; ++i) {
100 + Int128 rl = clmul_64(n[2 * i + 0], m[2 * i + 0]);
101 + Int128 rh = clmul_64(n[2 * i + 1], m[2 * i + 1]);
102 + d0[2 * i + 0] = int128_getlo(rl);
103 + d0[2 * i + 1] = int128_gethi(rl);
104 + d1[2 * i + 0] = int128_getlo(rh);
105 + d1[2 * i + 1] = int128_gethi(rh);
106 + }
107 +}
108 +
109 +void HELPER(sve_pmlal_q)(void *vd, void *vn, void *vm, uint32_t desc)
110 +{
111 + intptr_t opr_sz = simd_oprsz(desc);
112 + uint64_t *n = vn, *m = vm;
113 + uint64_t *d0 = vd;
114 + uint64_t *d1 = vd + sizeof(ARMVectorReg);
115 +
116 + for (intptr_t i = 0; i < opr_sz / 16; ++i) {
117 + Int128 rl = clmul_64(n[2 * i + 0], m[2 * i + 0]);
118 + Int128 rh = clmul_64(n[2 * i + 1], m[2 * i + 1]);
119 + d0[2 * i + 0] ^= int128_getlo(rl);
120 + d0[2 * i + 1] ^= int128_gethi(rl);
121 + d1[2 * i + 0] ^= int128_getlo(rh);
122 + d1[2 * i + 1] ^= int128_gethi(rh);
123 + }
124 +}
125 +
126 DO_3OP_PAIR(gvec_ah_fmaxp_h, helper_vfp_ah_maxh, float16, H2)
127 DO_3OP_PAIR(gvec_ah_fmaxp_s, helper_vfp_ah_maxs, float32, H4)
128 DO_3OP_PAIR(gvec_ah_fmaxp_d, helper_vfp_ah_maxd, float64, /**/)