@@ -1261,6 +1261,41 @@ FLOAT_SPECIAL_OP(OpType::IsInf, (std::isinf(A)));
12611261FLOAT_SPECIAL_OP (OpType::IsNan, (std::isnan(A)));
12621262#undef FLOAT_SPECIAL_OP
12631263
1264+ template <typename T> struct Op <OpType::ModF, T, 1 > : DefaultValidation<T> {};
1265+
1266+ template <typename T> static T modF (T Input, T &OutParam);
1267+
1268+ template <> float modF (float Input, float &OutParam) {
1269+ return std::modf (Input, &OutParam);
1270+ }
1271+
1272+ template <> HLSLHalf_t modF (HLSLHalf_t Input, HLSLHalf_t &OutParam) {
1273+ float Exp = 0 .0f ;
1274+ float Man = std::modf (float (Input), &Exp);
1275+ OutParam = HLSLHalf_t (Exp);
1276+ return Man;
1277+ }
1278+
1279+ template <typename T> struct ExpectedBuilder <OpType::ModF, T> {
1280+ static std::vector<T> buildExpected (Op<OpType::ModF, T, 1 > &,
1281+ const InputSets<T> &Inputs) {
1282+ DXASSERT_NOMSG (Inputs.size () == 1 );
1283+ size_t VectorSize = Inputs[0 ].size ();
1284+
1285+ std::vector<T> Expected;
1286+ Expected.resize (VectorSize * 2 );
1287+
1288+ for (size_t I = 0 ; I < VectorSize; ++I) {
1289+ T Exp;
1290+ T Man = modF (Inputs[0 ][I], Exp);
1291+ Expected[I] = Man;
1292+ Expected[I + VectorSize] = Exp;
1293+ }
1294+
1295+ return Expected;
1296+ }
1297+ };
1298+
12641299//
12651300// Wave Ops
12661301//
@@ -1957,10 +1992,12 @@ class DxilConf_SM69_Vectorized {
19571992 HLK_TEST (IsFinite, HLSLHalf_t);
19581993 HLK_TEST (IsInf, HLSLHalf_t);
19591994 HLK_TEST (IsNan, HLSLHalf_t);
1995+ HLK_TEST (ModF, HLSLHalf_t);
19601996
19611997 HLK_TEST (IsFinite, float );
19621998 HLK_TEST (IsInf, float );
19631999 HLK_TEST (IsNan, float );
2000+ HLK_TEST (ModF, float );
19642001
19652002 // Binary Comparison
19662003
0 commit comments