mirror of https://github.com/xemu-project/xemu.git
target/arm: Convert sha512 and sm3 to gvec helpers
Do not yet convert the helpers to loop over opr_sz, but the descriptor allows the vector tail to be cleared. Which fixes an existing bug vs SVE. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200514212831.31248-4-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
1738860d7e
commit
aaffebd6d3
|
@ -31,6 +31,19 @@ union CRYPTO_STATE {
|
||||||
#define CR_ST_WORD(state, i) (state.words[i])
|
#define CR_ST_WORD(state, i) (state.words[i])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The caller has not been converted to full gvec, and so only
|
||||||
|
* modifies the low 16 bytes of the vector register.
|
||||||
|
*/
|
||||||
|
static void clear_tail_16(void *vd, uint32_t desc)
|
||||||
|
{
|
||||||
|
int opr_sz = simd_oprsz(desc);
|
||||||
|
int max_sz = simd_maxsz(desc);
|
||||||
|
|
||||||
|
assert(opr_sz == 16);
|
||||||
|
clear_tail(vd, opr_sz, max_sz);
|
||||||
|
}
|
||||||
|
|
||||||
static void do_crypto_aese(uint64_t *rd, uint64_t *rn,
|
static void do_crypto_aese(uint64_t *rd, uint64_t *rn,
|
||||||
uint64_t *rm, bool decrypt)
|
uint64_t *rm, bool decrypt)
|
||||||
{
|
{
|
||||||
|
@ -470,7 +483,7 @@ static uint64_t s1_512(uint64_t x)
|
||||||
return ror64(x, 19) ^ ror64(x, 61) ^ (x >> 6);
|
return ror64(x, 19) ^ ror64(x, 61) ^ (x >> 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sha512h)(void *vd, void *vn, void *vm)
|
void HELPER(crypto_sha512h)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -483,9 +496,11 @@ void HELPER(crypto_sha512h)(void *vd, void *vn, void *vm)
|
||||||
|
|
||||||
rd[0] = d0;
|
rd[0] = d0;
|
||||||
rd[1] = d1;
|
rd[1] = d1;
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sha512h2)(void *vd, void *vn, void *vm)
|
void HELPER(crypto_sha512h2)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -498,9 +513,11 @@ void HELPER(crypto_sha512h2)(void *vd, void *vn, void *vm)
|
||||||
|
|
||||||
rd[0] = d0;
|
rd[0] = d0;
|
||||||
rd[1] = d1;
|
rd[1] = d1;
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sha512su0)(void *vd, void *vn)
|
void HELPER(crypto_sha512su0)(void *vd, void *vn, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -512,9 +529,11 @@ void HELPER(crypto_sha512su0)(void *vd, void *vn)
|
||||||
|
|
||||||
rd[0] = d0;
|
rd[0] = d0;
|
||||||
rd[1] = d1;
|
rd[1] = d1;
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sha512su1)(void *vd, void *vn, void *vm)
|
void HELPER(crypto_sha512su1)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -522,9 +541,11 @@ void HELPER(crypto_sha512su1)(void *vd, void *vn, void *vm)
|
||||||
|
|
||||||
rd[0] += s1_512(rn[0]) + rm[0];
|
rd[0] += s1_512(rn[0]) + rm[0];
|
||||||
rd[1] += s1_512(rn[1]) + rm[1];
|
rd[1] += s1_512(rn[1]) + rm[1];
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sm3partw1)(void *vd, void *vn, void *vm)
|
void HELPER(crypto_sm3partw1)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -548,9 +569,11 @@ void HELPER(crypto_sm3partw1)(void *vd, void *vn, void *vm)
|
||||||
|
|
||||||
rd[0] = d.l[0];
|
rd[0] = d.l[0];
|
||||||
rd[1] = d.l[1];
|
rd[1] = d.l[1];
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sm3partw2)(void *vd, void *vn, void *vm)
|
void HELPER(crypto_sm3partw2)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||||
{
|
{
|
||||||
uint64_t *rd = vd;
|
uint64_t *rd = vd;
|
||||||
uint64_t *rn = vn;
|
uint64_t *rn = vn;
|
||||||
|
@ -568,6 +591,8 @@ void HELPER(crypto_sm3partw2)(void *vd, void *vn, void *vm)
|
||||||
|
|
||||||
rd[0] = d.l[0];
|
rd[0] = d.l[0];
|
||||||
rd[1] = d.l[1];
|
rd[1] = d.l[1];
|
||||||
|
|
||||||
|
clear_tail_16(vd, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HELPER(crypto_sm3tt)(void *vd, void *vn, void *vm, uint32_t imm2,
|
void HELPER(crypto_sm3tt)(void *vd, void *vn, void *vm, uint32_t imm2,
|
||||||
|
|
|
@ -522,14 +522,17 @@ DEF_HELPER_FLAGS_3(crypto_sha256h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
||||||
DEF_HELPER_FLAGS_2(crypto_sha256su0, TCG_CALL_NO_RWG, void, ptr, ptr)
|
DEF_HELPER_FLAGS_2(crypto_sha256su0, TCG_CALL_NO_RWG, void, ptr, ptr)
|
||||||
DEF_HELPER_FLAGS_3(crypto_sha256su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_3(crypto_sha256su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_3(crypto_sha512h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(crypto_sha512h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_3(crypto_sha512h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(crypto_sha512h2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_2(crypto_sha512su0, TCG_CALL_NO_RWG, void, ptr, ptr)
|
DEF_HELPER_FLAGS_3(crypto_sha512su0, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_3(crypto_sha512su1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(crypto_sha512su1, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_5(crypto_sm3tt, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32, i32)
|
DEF_HELPER_FLAGS_5(crypto_sm3tt, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32, i32)
|
||||||
DEF_HELPER_FLAGS_3(crypto_sm3partw1, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
DEF_HELPER_FLAGS_4(crypto_sm3partw1, TCG_CALL_NO_RWG,
|
||||||
DEF_HELPER_FLAGS_3(crypto_sm3partw2, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
|
void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(crypto_sm3partw2, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_4(crypto_sm4e, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(crypto_sm4e, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_4(crypto_sm4ekey, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(crypto_sm4ekey, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
|
@ -13624,7 +13624,6 @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
int rn = extract32(insn, 5, 5);
|
int rn = extract32(insn, 5, 5);
|
||||||
int rd = extract32(insn, 0, 5);
|
int rd = extract32(insn, 0, 5);
|
||||||
bool feature;
|
bool feature;
|
||||||
CryptoThreeOpFn *genfn = NULL;
|
|
||||||
gen_helper_gvec_3 *oolfn = NULL;
|
gen_helper_gvec_3 *oolfn = NULL;
|
||||||
GVecGen3Fn *gvecfn = NULL;
|
GVecGen3Fn *gvecfn = NULL;
|
||||||
|
|
||||||
|
@ -13632,15 +13631,15 @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case 0: /* SHA512H */
|
case 0: /* SHA512H */
|
||||||
feature = dc_isar_feature(aa64_sha512, s);
|
feature = dc_isar_feature(aa64_sha512, s);
|
||||||
genfn = gen_helper_crypto_sha512h;
|
oolfn = gen_helper_crypto_sha512h;
|
||||||
break;
|
break;
|
||||||
case 1: /* SHA512H2 */
|
case 1: /* SHA512H2 */
|
||||||
feature = dc_isar_feature(aa64_sha512, s);
|
feature = dc_isar_feature(aa64_sha512, s);
|
||||||
genfn = gen_helper_crypto_sha512h2;
|
oolfn = gen_helper_crypto_sha512h2;
|
||||||
break;
|
break;
|
||||||
case 2: /* SHA512SU1 */
|
case 2: /* SHA512SU1 */
|
||||||
feature = dc_isar_feature(aa64_sha512, s);
|
feature = dc_isar_feature(aa64_sha512, s);
|
||||||
genfn = gen_helper_crypto_sha512su1;
|
oolfn = gen_helper_crypto_sha512su1;
|
||||||
break;
|
break;
|
||||||
case 3: /* RAX1 */
|
case 3: /* RAX1 */
|
||||||
feature = dc_isar_feature(aa64_sha3, s);
|
feature = dc_isar_feature(aa64_sha3, s);
|
||||||
|
@ -13653,11 +13652,11 @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case 0: /* SM3PARTW1 */
|
case 0: /* SM3PARTW1 */
|
||||||
feature = dc_isar_feature(aa64_sm3, s);
|
feature = dc_isar_feature(aa64_sm3, s);
|
||||||
genfn = gen_helper_crypto_sm3partw1;
|
oolfn = gen_helper_crypto_sm3partw1;
|
||||||
break;
|
break;
|
||||||
case 1: /* SM3PARTW2 */
|
case 1: /* SM3PARTW2 */
|
||||||
feature = dc_isar_feature(aa64_sm3, s);
|
feature = dc_isar_feature(aa64_sm3, s);
|
||||||
genfn = gen_helper_crypto_sm3partw2;
|
oolfn = gen_helper_crypto_sm3partw2;
|
||||||
break;
|
break;
|
||||||
case 2: /* SM4EKEY */
|
case 2: /* SM4EKEY */
|
||||||
feature = dc_isar_feature(aa64_sm4, s);
|
feature = dc_isar_feature(aa64_sm4, s);
|
||||||
|
@ -13680,20 +13679,8 @@ static void disas_crypto_three_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
|
|
||||||
if (oolfn) {
|
if (oolfn) {
|
||||||
gen_gvec_op3_ool(s, true, rd, rn, rm, 0, oolfn);
|
gen_gvec_op3_ool(s, true, rd, rn, rm, 0, oolfn);
|
||||||
} else if (gvecfn) {
|
|
||||||
gen_gvec_fn3(s, true, rd, rn, rm, gvecfn, MO_64);
|
|
||||||
} else {
|
} else {
|
||||||
TCGv_ptr tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr;
|
gen_gvec_fn3(s, true, rd, rn, rm, gvecfn, MO_64);
|
||||||
|
|
||||||
tcg_rd_ptr = vec_full_reg_ptr(s, rd);
|
|
||||||
tcg_rn_ptr = vec_full_reg_ptr(s, rn);
|
|
||||||
tcg_rm_ptr = vec_full_reg_ptr(s, rm);
|
|
||||||
|
|
||||||
genfn(tcg_rd_ptr, tcg_rn_ptr, tcg_rm_ptr);
|
|
||||||
|
|
||||||
tcg_temp_free_ptr(tcg_rd_ptr);
|
|
||||||
tcg_temp_free_ptr(tcg_rn_ptr);
|
|
||||||
tcg_temp_free_ptr(tcg_rm_ptr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13708,19 +13695,14 @@ static void disas_crypto_two_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
int opcode = extract32(insn, 10, 2);
|
int opcode = extract32(insn, 10, 2);
|
||||||
int rn = extract32(insn, 5, 5);
|
int rn = extract32(insn, 5, 5);
|
||||||
int rd = extract32(insn, 0, 5);
|
int rd = extract32(insn, 0, 5);
|
||||||
TCGv_ptr tcg_rd_ptr, tcg_rn_ptr;
|
|
||||||
bool feature;
|
bool feature;
|
||||||
CryptoTwoOpFn *genfn;
|
|
||||||
gen_helper_gvec_3 *oolfn = NULL;
|
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case 0: /* SHA512SU0 */
|
case 0: /* SHA512SU0 */
|
||||||
feature = dc_isar_feature(aa64_sha512, s);
|
feature = dc_isar_feature(aa64_sha512, s);
|
||||||
genfn = gen_helper_crypto_sha512su0;
|
|
||||||
break;
|
break;
|
||||||
case 1: /* SM4E */
|
case 1: /* SM4E */
|
||||||
feature = dc_isar_feature(aa64_sm4, s);
|
feature = dc_isar_feature(aa64_sm4, s);
|
||||||
oolfn = gen_helper_crypto_sm4e;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unallocated_encoding(s);
|
unallocated_encoding(s);
|
||||||
|
@ -13736,18 +13718,16 @@ static void disas_crypto_two_reg_sha512(DisasContext *s, uint32_t insn)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oolfn) {
|
switch (opcode) {
|
||||||
gen_gvec_op3_ool(s, true, rd, rd, rn, 0, oolfn);
|
case 0: /* SHA512SU0 */
|
||||||
return;
|
gen_gvec_op2_ool(s, true, rd, rn, 0, gen_helper_crypto_sha512su0);
|
||||||
|
break;
|
||||||
|
case 1: /* SM4E */
|
||||||
|
gen_gvec_op3_ool(s, true, rd, rd, rn, 0, gen_helper_crypto_sm4e);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
||||||
tcg_rd_ptr = vec_full_reg_ptr(s, rd);
|
|
||||||
tcg_rn_ptr = vec_full_reg_ptr(s, rn);
|
|
||||||
|
|
||||||
genfn(tcg_rd_ptr, tcg_rn_ptr);
|
|
||||||
|
|
||||||
tcg_temp_free_ptr(tcg_rd_ptr);
|
|
||||||
tcg_temp_free_ptr(tcg_rn_ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Crypto four-register
|
/* Crypto four-register
|
||||||
|
|
Loading…
Reference in New Issue