1dcb83484SJay Foad //===-- SIModeRegisterDefaults.cpp ------------------------------*- C++ -*-===//
2dcb83484SJay Foad //
3dcb83484SJay Foad // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dcb83484SJay Foad // See https://llvm.org/LICENSE.txt for license information.
5dcb83484SJay Foad // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dcb83484SJay Foad //
7dcb83484SJay Foad //===----------------------------------------------------------------------===//
8dcb83484SJay Foad
9dcb83484SJay Foad #include "SIModeRegisterDefaults.h"
10fac093ddSPiotr Sobczak #include "GCNSubtarget.h"
11dcb83484SJay Foad
12dcb83484SJay Foad using namespace llvm;
13dcb83484SJay Foad
SIModeRegisterDefaults(const Function & F,const GCNSubtarget & ST)14fac093ddSPiotr Sobczak SIModeRegisterDefaults::SIModeRegisterDefaults(const Function &F,
15fac093ddSPiotr Sobczak const GCNSubtarget &ST) {
16dcb83484SJay Foad *this = getDefaultForCallingConv(F.getCallingConv());
17dcb83484SJay Foad
18fac093ddSPiotr Sobczak if (ST.hasIEEEMode()) {
19dcb83484SJay Foad StringRef IEEEAttr = F.getFnAttribute("amdgpu-ieee").getValueAsString();
20dcb83484SJay Foad if (!IEEEAttr.empty())
21dcb83484SJay Foad IEEE = IEEEAttr == "true";
22fac093ddSPiotr Sobczak }
23dcb83484SJay Foad
24fac093ddSPiotr Sobczak if (ST.hasDX10ClampMode()) {
25dcb83484SJay Foad StringRef DX10ClampAttr =
26dcb83484SJay Foad F.getFnAttribute("amdgpu-dx10-clamp").getValueAsString();
27dcb83484SJay Foad if (!DX10ClampAttr.empty())
28dcb83484SJay Foad DX10Clamp = DX10ClampAttr == "true";
29fac093ddSPiotr Sobczak }
30dcb83484SJay Foad
31dcb83484SJay Foad StringRef DenormF32Attr =
32dcb83484SJay Foad F.getFnAttribute("denormal-fp-math-f32").getValueAsString();
33dcb83484SJay Foad if (!DenormF32Attr.empty())
34dcb83484SJay Foad FP32Denormals = parseDenormalFPAttribute(DenormF32Attr);
35dcb83484SJay Foad
36dcb83484SJay Foad StringRef DenormAttr =
37dcb83484SJay Foad F.getFnAttribute("denormal-fp-math").getValueAsString();
38dcb83484SJay Foad if (!DenormAttr.empty()) {
39dcb83484SJay Foad DenormalMode DenormMode = parseDenormalFPAttribute(DenormAttr);
40dcb83484SJay Foad if (DenormF32Attr.empty())
41dcb83484SJay Foad FP32Denormals = DenormMode;
42dcb83484SJay Foad FP64FP16Denormals = DenormMode;
43dcb83484SJay Foad }
44dcb83484SJay Foad }
455f8ee45dSMatt Arsenault
465f8ee45dSMatt Arsenault using namespace AMDGPU;
475f8ee45dSMatt Arsenault
485f8ee45dSMatt Arsenault /// Combine f32 and f64 rounding modes into a combined rounding mode value.
getModeRegisterRoundMode(uint32_t HWFP32Val,uint32_t HWFP64Val)495f8ee45dSMatt Arsenault static constexpr uint32_t getModeRegisterRoundMode(uint32_t HWFP32Val,
505f8ee45dSMatt Arsenault uint32_t HWFP64Val) {
515f8ee45dSMatt Arsenault return HWFP32Val << F32FltRoundOffset | HWFP64Val << F64FltRoundOffset;
525f8ee45dSMatt Arsenault }
535f8ee45dSMatt Arsenault
encodeFltRoundsTable(uint32_t FltRoundsVal,uint32_t HWF32Val,uint32_t HWF64Val)545f8ee45dSMatt Arsenault static constexpr uint64_t encodeFltRoundsTable(uint32_t FltRoundsVal,
555f8ee45dSMatt Arsenault uint32_t HWF32Val,
565f8ee45dSMatt Arsenault uint32_t HWF64Val) {
575f8ee45dSMatt Arsenault uint32_t ModeVal = getModeRegisterRoundMode(HWF32Val, HWF64Val);
585f8ee45dSMatt Arsenault if (FltRoundsVal > TowardNegative)
595f8ee45dSMatt Arsenault FltRoundsVal -= ExtendedFltRoundOffset;
605f8ee45dSMatt Arsenault
615f8ee45dSMatt Arsenault uint32_t BitIndex = ModeVal << 2;
625f8ee45dSMatt Arsenault return static_cast<uint64_t>(FltRoundsVal) << BitIndex;
635f8ee45dSMatt Arsenault }
645f8ee45dSMatt Arsenault
655f8ee45dSMatt Arsenault // Encode FLT_ROUNDS value where the two rounding modes are the same and use a
665f8ee45dSMatt Arsenault // standard value
675f8ee45dSMatt Arsenault static constexpr uint64_t
encodeFltRoundsTableSame(AMDGPUFltRounds FltRoundsMode,uint32_t HWVal)685f8ee45dSMatt Arsenault encodeFltRoundsTableSame(AMDGPUFltRounds FltRoundsMode, uint32_t HWVal) {
695f8ee45dSMatt Arsenault return encodeFltRoundsTable(FltRoundsMode, HWVal, HWVal);
705f8ee45dSMatt Arsenault }
715f8ee45dSMatt Arsenault
725f8ee45dSMatt Arsenault // Convert mode register encoded rounding mode to AMDGPUFltRounds
735f8ee45dSMatt Arsenault static constexpr AMDGPUFltRounds
decodeIndexFltRoundConversionTable(uint32_t HWMode)745f8ee45dSMatt Arsenault decodeIndexFltRoundConversionTable(uint32_t HWMode) {
755f8ee45dSMatt Arsenault uint32_t TableRead = (FltRoundConversionTable >> (HWMode << 2)) & 0xf;
765f8ee45dSMatt Arsenault if (TableRead > TowardNegative)
775f8ee45dSMatt Arsenault TableRead += ExtendedFltRoundOffset;
785f8ee45dSMatt Arsenault return static_cast<AMDGPUFltRounds>(TableRead);
795f8ee45dSMatt Arsenault }
805f8ee45dSMatt Arsenault
815f8ee45dSMatt Arsenault static constexpr uint32_t HWTowardZero = FP_ROUND_ROUND_TO_ZERO;
825f8ee45dSMatt Arsenault static constexpr uint32_t HWNearestTiesToEven = FP_ROUND_ROUND_TO_NEAREST;
835f8ee45dSMatt Arsenault static constexpr uint32_t HWTowardPositive = FP_ROUND_ROUND_TO_INF;
845f8ee45dSMatt Arsenault static constexpr uint32_t HWTowardNegative = FP_ROUND_ROUND_TO_NEGINF;
855f8ee45dSMatt Arsenault
86003cf293SMatt Arsenault const uint64_t AMDGPU::FltRoundConversionTable =
875f8ee45dSMatt Arsenault encodeFltRoundsTableSame(TowardZeroF32_TowardZeroF64, HWTowardZero) |
885f8ee45dSMatt Arsenault encodeFltRoundsTableSame(NearestTiesToEvenF32_NearestTiesToEvenF64,
895f8ee45dSMatt Arsenault HWNearestTiesToEven) |
905f8ee45dSMatt Arsenault encodeFltRoundsTableSame(TowardPositiveF32_TowardPositiveF64,
915f8ee45dSMatt Arsenault HWTowardPositive) |
925f8ee45dSMatt Arsenault encodeFltRoundsTableSame(TowardNegativeF32_TowardNegativeF64,
935f8ee45dSMatt Arsenault HWTowardNegative) |
945f8ee45dSMatt Arsenault
955f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardZeroF32_NearestTiesToEvenF64, HWTowardZero,
965f8ee45dSMatt Arsenault HWNearestTiesToEven) |
975f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardZeroF32_TowardPositiveF64, HWTowardZero,
985f8ee45dSMatt Arsenault HWTowardPositive) |
995f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardZeroF32_TowardNegativeF64, HWTowardZero,
1005f8ee45dSMatt Arsenault HWTowardNegative) |
1015f8ee45dSMatt Arsenault
1025f8ee45dSMatt Arsenault encodeFltRoundsTable(NearestTiesToEvenF32_TowardZeroF64,
1035f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardZero) |
1045f8ee45dSMatt Arsenault encodeFltRoundsTable(NearestTiesToEvenF32_TowardPositiveF64,
1055f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardPositive) |
1065f8ee45dSMatt Arsenault encodeFltRoundsTable(NearestTiesToEvenF32_TowardNegativeF64,
1075f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardNegative) |
1085f8ee45dSMatt Arsenault
1095f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardPositiveF32_TowardZeroF64, HWTowardPositive,
1105f8ee45dSMatt Arsenault HWTowardZero) |
1115f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardPositiveF32_NearestTiesToEvenF64,
1125f8ee45dSMatt Arsenault HWTowardPositive, HWNearestTiesToEven) |
1135f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardPositiveF32_TowardNegativeF64, HWTowardPositive,
1145f8ee45dSMatt Arsenault HWTowardNegative) |
1155f8ee45dSMatt Arsenault
1165f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardNegativeF32_TowardZeroF64, HWTowardNegative,
1175f8ee45dSMatt Arsenault HWTowardZero) |
1185f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardNegativeF32_NearestTiesToEvenF64,
1195f8ee45dSMatt Arsenault HWTowardNegative, HWNearestTiesToEven) |
1205f8ee45dSMatt Arsenault encodeFltRoundsTable(TowardNegativeF32_TowardPositiveF64, HWTowardNegative,
1215f8ee45dSMatt Arsenault HWTowardPositive);
1225f8ee45dSMatt Arsenault
1235f8ee45dSMatt Arsenault // Verify evaluation of FltRoundConversionTable
1245f8ee45dSMatt Arsenault
1255f8ee45dSMatt Arsenault // If both modes are the same, should return the standard values.
1265f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1275f8ee45dSMatt Arsenault HWTowardZero, HWTowardZero)) == AMDGPUFltRounds::TowardZero);
1285f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1295f8ee45dSMatt Arsenault HWNearestTiesToEven, HWNearestTiesToEven)) ==
1305f8ee45dSMatt Arsenault AMDGPUFltRounds::NearestTiesToEven);
1315f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1325f8ee45dSMatt Arsenault HWTowardPositive, HWTowardPositive)) ==
1335f8ee45dSMatt Arsenault AMDGPUFltRounds::TowardPositive);
1345f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1355f8ee45dSMatt Arsenault HWTowardNegative, HWTowardNegative)) ==
1365f8ee45dSMatt Arsenault AMDGPUFltRounds::TowardNegative);
1375f8ee45dSMatt Arsenault
1385f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1395f8ee45dSMatt Arsenault HWTowardZero, HWNearestTiesToEven)) ==
1405f8ee45dSMatt Arsenault TowardZeroF32_NearestTiesToEvenF64);
1415f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(
1425f8ee45dSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWTowardPositive)) ==
1435f8ee45dSMatt Arsenault TowardZeroF32_TowardPositiveF64);
1445f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(
1455f8ee45dSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWTowardNegative)) ==
1465f8ee45dSMatt Arsenault TowardZeroF32_TowardNegativeF64);
1475f8ee45dSMatt Arsenault
1485f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1495f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardZero)) ==
1505f8ee45dSMatt Arsenault NearestTiesToEvenF32_TowardZeroF64);
1515f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1525f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardPositive)) ==
1535f8ee45dSMatt Arsenault NearestTiesToEvenF32_TowardPositiveF64);
1545f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1555f8ee45dSMatt Arsenault HWNearestTiesToEven, HWTowardNegative)) ==
1565f8ee45dSMatt Arsenault NearestTiesToEvenF32_TowardNegativeF64);
1575f8ee45dSMatt Arsenault
1585f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(
1595f8ee45dSMatt Arsenault getModeRegisterRoundMode(HWTowardPositive, HWTowardZero)) ==
1605f8ee45dSMatt Arsenault TowardPositiveF32_TowardZeroF64);
1615f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1625f8ee45dSMatt Arsenault HWTowardPositive, HWNearestTiesToEven)) ==
1635f8ee45dSMatt Arsenault TowardPositiveF32_NearestTiesToEvenF64);
1645f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1655f8ee45dSMatt Arsenault HWTowardPositive, HWTowardNegative)) ==
1665f8ee45dSMatt Arsenault TowardPositiveF32_TowardNegativeF64);
1675f8ee45dSMatt Arsenault
1685f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(
1695f8ee45dSMatt Arsenault getModeRegisterRoundMode(HWTowardNegative, HWTowardZero)) ==
1705f8ee45dSMatt Arsenault TowardNegativeF32_TowardZeroF64);
1715f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1725f8ee45dSMatt Arsenault HWTowardNegative, HWNearestTiesToEven)) ==
1735f8ee45dSMatt Arsenault TowardNegativeF32_NearestTiesToEvenF64);
1745f8ee45dSMatt Arsenault static_assert(decodeIndexFltRoundConversionTable(getModeRegisterRoundMode(
1755f8ee45dSMatt Arsenault HWTowardNegative, HWTowardPositive)) ==
1765f8ee45dSMatt Arsenault TowardNegativeF32_TowardPositiveF64);
177*d654278bSMatt Arsenault
178*d654278bSMatt Arsenault // Decode FLT_ROUNDS into the hardware value where the two rounding modes are
179*d654278bSMatt Arsenault // the same and use a standard value
encodeFltRoundsToHWTableSame(uint32_t HWVal,uint32_t FltRoundsVal)180*d654278bSMatt Arsenault static constexpr uint64_t encodeFltRoundsToHWTableSame(uint32_t HWVal,
181*d654278bSMatt Arsenault uint32_t FltRoundsVal) {
182*d654278bSMatt Arsenault if (FltRoundsVal > TowardNegative)
183*d654278bSMatt Arsenault FltRoundsVal -= ExtendedFltRoundOffset;
184*d654278bSMatt Arsenault
185*d654278bSMatt Arsenault return static_cast<uint64_t>(getModeRegisterRoundMode(HWVal, HWVal))
186*d654278bSMatt Arsenault << (FltRoundsVal << 2);
187*d654278bSMatt Arsenault }
188*d654278bSMatt Arsenault
189*d654278bSMatt Arsenault /// Decode FLT_ROUNDS into the hardware value where the two rounding modes
190*d654278bSMatt Arsenault /// different and use an extended value.
encodeFltRoundsToHWTable(uint32_t HWF32Val,uint32_t HWF64Val,uint32_t FltRoundsVal)191*d654278bSMatt Arsenault static constexpr uint64_t encodeFltRoundsToHWTable(uint32_t HWF32Val,
192*d654278bSMatt Arsenault uint32_t HWF64Val,
193*d654278bSMatt Arsenault uint32_t FltRoundsVal) {
194*d654278bSMatt Arsenault if (FltRoundsVal > TowardNegative)
195*d654278bSMatt Arsenault FltRoundsVal -= ExtendedFltRoundOffset;
196*d654278bSMatt Arsenault return static_cast<uint64_t>(getModeRegisterRoundMode(HWF32Val, HWF64Val))
197*d654278bSMatt Arsenault << (FltRoundsVal << 2);
198*d654278bSMatt Arsenault }
199*d654278bSMatt Arsenault
200*d654278bSMatt Arsenault const uint64_t AMDGPU::FltRoundToHWConversionTable =
201*d654278bSMatt Arsenault encodeFltRoundsToHWTableSame(HWTowardZero, TowardZeroF32_TowardZeroF64) |
202*d654278bSMatt Arsenault encodeFltRoundsToHWTableSame(HWNearestTiesToEven,
203*d654278bSMatt Arsenault NearestTiesToEvenF32_NearestTiesToEvenF64) |
204*d654278bSMatt Arsenault encodeFltRoundsToHWTableSame(HWTowardPositive,
205*d654278bSMatt Arsenault TowardPositiveF32_TowardPositiveF64) |
206*d654278bSMatt Arsenault encodeFltRoundsToHWTableSame(HWTowardNegative,
207*d654278bSMatt Arsenault TowardNegativeF32_TowardNegativeF64) |
208*d654278bSMatt Arsenault
209*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardZero, HWNearestTiesToEven,
210*d654278bSMatt Arsenault TowardZeroF32_NearestTiesToEvenF64) |
211*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardZero, HWTowardPositive,
212*d654278bSMatt Arsenault TowardZeroF32_TowardPositiveF64) |
213*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardZero, HWTowardNegative,
214*d654278bSMatt Arsenault TowardZeroF32_TowardNegativeF64) |
215*d654278bSMatt Arsenault
216*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWNearestTiesToEven, HWTowardZero,
217*d654278bSMatt Arsenault NearestTiesToEvenF32_TowardZeroF64) |
218*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWNearestTiesToEven, HWTowardPositive,
219*d654278bSMatt Arsenault NearestTiesToEvenF32_TowardPositiveF64) |
220*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWNearestTiesToEven, HWTowardNegative,
221*d654278bSMatt Arsenault NearestTiesToEvenF32_TowardNegativeF64) |
222*d654278bSMatt Arsenault
223*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardPositive, HWTowardZero,
224*d654278bSMatt Arsenault TowardPositiveF32_TowardZeroF64) |
225*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardPositive, HWNearestTiesToEven,
226*d654278bSMatt Arsenault TowardPositiveF32_NearestTiesToEvenF64) |
227*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardPositive, HWTowardNegative,
228*d654278bSMatt Arsenault TowardPositiveF32_TowardNegativeF64) |
229*d654278bSMatt Arsenault
230*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardNegative, HWTowardZero,
231*d654278bSMatt Arsenault TowardNegativeF32_TowardZeroF64) |
232*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardNegative, HWNearestTiesToEven,
233*d654278bSMatt Arsenault TowardNegativeF32_NearestTiesToEvenF64) |
234*d654278bSMatt Arsenault encodeFltRoundsToHWTable(HWTowardNegative, HWTowardPositive,
235*d654278bSMatt Arsenault TowardNegativeF32_TowardPositiveF64);
236*d654278bSMatt Arsenault
237*d654278bSMatt Arsenault /// Read the hardware rounding mode equivalent of a AMDGPUFltRounds value.
238*d654278bSMatt Arsenault static constexpr uint32_t
decodeFltRoundToHWConversionTable(uint64_t FltRoundToHWConversionTable,uint32_t FltRounds)239*d654278bSMatt Arsenault decodeFltRoundToHWConversionTable(uint64_t FltRoundToHWConversionTable,
240*d654278bSMatt Arsenault uint32_t FltRounds) {
241*d654278bSMatt Arsenault uint32_t IndexVal = FltRounds;
242*d654278bSMatt Arsenault if (IndexVal > TowardNegative)
243*d654278bSMatt Arsenault IndexVal -= ExtendedFltRoundOffset;
244*d654278bSMatt Arsenault return (FltRoundToHWConversionTable >> (IndexVal << 2)) & 0xf;
245*d654278bSMatt Arsenault }
246*d654278bSMatt Arsenault
decodeFltRoundToHWConversionTable(uint32_t FltRounds)247*d654278bSMatt Arsenault uint32_t AMDGPU::decodeFltRoundToHWConversionTable(uint32_t FltRounds) {
248*d654278bSMatt Arsenault return ::decodeFltRoundToHWConversionTable(FltRoundToHWConversionTable,
249*d654278bSMatt Arsenault FltRounds);
250*d654278bSMatt Arsenault }
251*d654278bSMatt Arsenault
decodeFltRoundToHW(uint32_t FltRounds)252*d654278bSMatt Arsenault static constexpr uint32_t decodeFltRoundToHW(uint32_t FltRounds) {
253*d654278bSMatt Arsenault return ::decodeFltRoundToHWConversionTable(FltRoundToHWConversionTable,
254*d654278bSMatt Arsenault FltRounds);
255*d654278bSMatt Arsenault }
256*d654278bSMatt Arsenault
257*d654278bSMatt Arsenault // Verify evaluation of FltRoundToHWConversionTable
258*d654278bSMatt Arsenault
259*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(AMDGPUFltRounds::TowardZero) ==
260*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWTowardZero));
261*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(AMDGPUFltRounds::NearestTiesToEven) ==
262*d654278bSMatt Arsenault getModeRegisterRoundMode(HWNearestTiesToEven,
263*d654278bSMatt Arsenault HWNearestTiesToEven));
264*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(AMDGPUFltRounds::TowardPositive) ==
265*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardPositive, HWTowardPositive));
266*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(AMDGPUFltRounds::TowardNegative) ==
267*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardNegative, HWTowardNegative));
268*d654278bSMatt Arsenault
269*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(NearestTiesToEvenF32_TowardPositiveF64) ==
270*d654278bSMatt Arsenault getModeRegisterRoundMode(HWNearestTiesToEven, HWTowardPositive));
271*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(NearestTiesToEvenF32_TowardNegativeF64) ==
272*d654278bSMatt Arsenault getModeRegisterRoundMode(HWNearestTiesToEven, HWTowardNegative));
273*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(NearestTiesToEvenF32_TowardZeroF64) ==
274*d654278bSMatt Arsenault getModeRegisterRoundMode(HWNearestTiesToEven, HWTowardZero));
275*d654278bSMatt Arsenault
276*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardPositiveF32_NearestTiesToEvenF64) ==
277*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardPositive, HWNearestTiesToEven));
278*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardPositiveF32_TowardNegativeF64) ==
279*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardPositive, HWTowardNegative));
280*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardPositiveF32_TowardZeroF64) ==
281*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardPositive, HWTowardZero));
282*d654278bSMatt Arsenault
283*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardNegativeF32_NearestTiesToEvenF64) ==
284*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardNegative, HWNearestTiesToEven));
285*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardNegativeF32_TowardPositiveF64) ==
286*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardNegative, HWTowardPositive));
287*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardNegativeF32_TowardZeroF64) ==
288*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardNegative, HWTowardZero));
289*d654278bSMatt Arsenault
290*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardZeroF32_NearestTiesToEvenF64) ==
291*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWNearestTiesToEven));
292*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardZeroF32_TowardPositiveF64) ==
293*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWTowardPositive));
294*d654278bSMatt Arsenault static_assert(decodeFltRoundToHW(TowardZeroF32_TowardNegativeF64) ==
295*d654278bSMatt Arsenault getModeRegisterRoundMode(HWTowardZero, HWTowardNegative));
296