From: Florian Krohm Date: Tue, 23 Sep 2025 20:29:19 +0000 (+0000) Subject: s390: Add missing BFP rounding mode conversions X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d8cf0a84b26ff1ed1b5a9560bfbe5bf476f10c3a;p=thirdparty%2Fvalgrind.git s390: Add missing BFP rounding mode conversions Function decode_bfp_rounding_mode: - Irrm_NEAREST_TIE_AWAY_0 --> S390_BFP_ROUND_NEAREST_AWAY - Irrm_PREPARE_SHORTER --> S390_BFP_ROUND_PREPARE_SHORT Macros S390_CC_FOR_BFP_CONVERT, S390_CC_FOR_BFP_UCONVERT - add S390_BFP_ROUND_NEAREST_AWAY - add S390_BFP_ROUND_PREPARE_SHORT Macros S390_CC_FOR_BFP128_CONVERT, S390_CC_FOR_BFP128_UCONVERT - add S390_BFP_ROUND_NEAREST_AWAY - add S390_BFP_ROUND_PREPARE_SHORT Fix more out-of-date comments related to rounding. --- diff --git a/VEX/priv/guest_s390_helpers.c b/VEX/priv/guest_s390_helpers.c index 5bfd5eb3f..4fd9daf41 100644 --- a/VEX/priv/guest_s390_helpers.c +++ b/VEX/priv/guest_s390_helpers.c @@ -628,7 +628,7 @@ s390_do_cu12_cu14_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4, UInt ij = (byte3 >> 4) & 0x3; UInt klmn = byte3 & 0xf; UInt opqrst = byte4 & 0x3f; - + if (is_cu12) { UInt abcd = (uvwxy - 1) & 0xf; UInt high_surrogate = (0xd8 << 8) | (abcd << 6) | (efgh << 2) | ij; @@ -782,6 +782,8 @@ decode_bfp_rounding_mode(UInt irrm) case Irrm_NegINF: return S390_BFP_ROUND_NEGINF; case Irrm_PosINF: return S390_BFP_ROUND_POSINF; case Irrm_ZERO: return S390_BFP_ROUND_ZERO; + case Irrm_NEAREST_TIE_AWAY_0: return S390_BFP_ROUND_NEAREST_AWAY; + case Irrm_PREPARE_SHORTER: return S390_BFP_ROUND_PREPARE_SHORT; } vpanic("decode_bfp_rounding_mode"); } @@ -880,6 +882,12 @@ decode_bfp_rounding_mode(UInt irrm) ({ \ UInt cc; \ switch (decode_bfp_rounding_mode(cc_dep2)) { \ + case S390_BFP_ROUND_NEAREST_AWAY: \ + cc = S390_CC_FOR_BFP_CONVERT_AUX(opcode,cc_dep1,1); \ + break; \ + case S390_BFP_ROUND_PREPARE_SHORT: \ + cc = S390_CC_FOR_BFP_CONVERT_AUX(opcode,cc_dep1,3); \ + break; \ case S390_BFP_ROUND_NEAREST_EVEN: \ cc = S390_CC_FOR_BFP_CONVERT_AUX(opcode,cc_dep1,4); \ break; \ @@ -914,6 +922,12 @@ decode_bfp_rounding_mode(UInt irrm) ({ \ UInt cc; \ switch (decode_bfp_rounding_mode(cc_dep2)) { \ + case S390_BFP_ROUND_NEAREST_AWAY: \ + cc = S390_CC_FOR_BFP_UCONVERT_AUX(opcode,cc_dep1,1); \ + break; \ + case S390_BFP_ROUND_PREPARE_SHORT: \ + cc = S390_CC_FOR_BFP_UCONVERT_AUX(opcode,cc_dep1,3); \ + break; \ case S390_BFP_ROUND_NEAREST_EVEN: \ cc = S390_CC_FOR_BFP_UCONVERT_AUX(opcode,cc_dep1,4); \ break; \ @@ -951,6 +965,12 @@ decode_bfp_rounding_mode(UInt irrm) s390_cc_thunk_put3 for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ switch (decode_bfp_rounding_mode(cc_ndep)) { \ + case S390_BFP_ROUND_NEAREST_AWAY: \ + cc = S390_CC_FOR_BFP128_CONVERT_AUX(opcode,cc_dep1,cc_dep2,1); \ + break; \ + case S390_BFP_ROUND_PREPARE_SHORT: \ + cc = S390_CC_FOR_BFP128_CONVERT_AUX(opcode,cc_dep1,cc_dep2,3); \ + break; \ case S390_BFP_ROUND_NEAREST_EVEN: \ cc = S390_CC_FOR_BFP128_CONVERT_AUX(opcode,cc_dep1,cc_dep2,4); \ break; \ @@ -988,6 +1008,13 @@ decode_bfp_rounding_mode(UInt irrm) s390_cc_thunk_put3 for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ switch (decode_bfp_rounding_mode(cc_ndep)) { \ + case S390_BFP_ROUND_NEAREST_AWAY: \ + cc = S390_CC_FOR_BFP128_UCONVERT_AUX(opcode,cc_dep1,cc_dep2,1); \ + break; \ + case S390_BFP_ROUND_PREPARE_SHORT: \ + cc = S390_CC_FOR_BFP128_UCONVERT_AUX(opcode,cc_dep1,cc_dep2,3); \ + cc = S390_CC_FOR_BFP_UCONVERT_AUX(opcode,cc_dep1,3); \ + break; \ case S390_BFP_ROUND_NEAREST_EVEN: \ cc = S390_CC_FOR_BFP128_UCONVERT_AUX(opcode,cc_dep1,cc_dep2,4); \ break; \ diff --git a/none/tests/s390x/rounding.h b/none/tests/s390x/rounding.h index 34555a8d8..63f19a723 100644 --- a/none/tests/s390x/rounding.h +++ b/none/tests/s390x/rounding.h @@ -8,14 +8,11 @@ /* instructions (e.g. CFEBR) */ /* ---------------------------------------------------------------- */ #define M3_BFP_ROUND_PER_FPC 0 - -// Cannot be mapped to IRRoundingMode #define M3_BFP_ROUND_NEAREST_AWAY 1 // 2 is not allowed // Needs floating point extension facility -// Cannot be mapped to IRRoundingMode #define M3_BFP_ROUND_PREPARE_SHORT 3 #define M3_BFP_ROUND_NEAREST_EVEN 4