IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_dw0(r2));
assign(op2, get_dpr_dw0(r3));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_pair(r2));
assign(op2, get_dpr_pair(r3));
vassert(s390_host_has_dfp);
+ /* No emulation warning here about an non-zero m3 on hosts without
+ floating point extension facility. No rounding is performed */
+
assign(op2, get_gpr_dw0(r2));
put_dpr_pair(r1, unop(Iop_I64StoD128, mkexpr(op2)));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_dw0(r2));
assign(op2, get_dpr_dw0(r3));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_pair(r2));
assign(op2, get_dpr_pair(r3));
UChar r1, UChar r2)
{
vassert(s390_host_has_dfp);
- if (! s390_host_has_fpext && m3 != S390_DFP_ROUND_PER_FPC_0) {
+
+ /* If fpext is not installed and m3 is in 1:7,
+ rounding mode performed is unpredictable */
+ if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
emulation_warning(EmWarn_S390X_fpext_rounding);
m3 = S390_DFP_ROUND_PER_FPC_0;
}
UChar r1, UChar r2)
{
vassert(s390_host_has_dfp);
- if (! s390_host_has_fpext && m3 != S390_DFP_ROUND_PER_FPC_0) {
+
+ /* If fpext is not installed and m3 is in 1:7,
+ rounding mode performed is unpredictable */
+ if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
emulation_warning(EmWarn_S390X_fpext_rounding);
m3 = S390_DFP_ROUND_PER_FPC_0;
}
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_dw0(r2));
assign(op2, get_dpr_dw0(r3));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_pair(r2));
assign(op2, get_dpr_pair(r3));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_dw0(r2));
assign(op2, get_dpr_dw0(r3));
IRTemp rounding_mode;
vassert(s390_host_has_dfp);
- vassert(m4 == 0 || s390_host_has_fpext);
- /* when m4 = 0, S390_DFP_ROUND_PER_FPC_0 should be set.
- since S390_DFP_ROUND_PER_FPC_0 is also 0, passing m4 is sufficient */
+
+ if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
+ emulation_warning(EmWarn_S390X_fpext_rounding);
+ m4 = S390_DFP_ROUND_PER_FPC_0;
+ }
+
rounding_mode = encode_dfp_rounding_mode(m4);
assign(op1, get_dpr_pair(r2));
assign(op2, get_dpr_pair(r3));