The min[] and max[] values should be based on the result in double precision, not after it has been converted to fp16type.
Affects:
dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_2.opvectortimesscalar
dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_3.opvectortimesscalar
dEQP-VK.spirv_assembly.instruction.compute.float16.arithmetic_4.opvectortimesscalar
dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_2.opvectortimesscalar*
dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_3.opvectortimesscalar*
dEQP-VK.spirv_assembly.instruction.graphics.float16.arithmetic_4.opvectortimesscalar*
Components: Vulkan
VK-GL-CTS issue: 1532
Change-Id: I30810c8c954ee899bb05602b1f8805f82ac021b3
(cherry picked from commit
12b26bd9762dd56068522cc0a17b26c9e31df1e2)
for (size_t componentNdx = 0; componentNdx < getArgCompCount(0); ++componentNdx)
{
- const fp16type x (in[0][componentNdx]);
- const fp16type m (s.asDouble() * x.asDouble());
+ const fp16type x (in[0][componentNdx]);
+ const double result (s.asDouble() * x.asDouble());
+ const fp16type m (result);
out[componentNdx] = m.bits();
- min[componentNdx] = getMin(m.asDouble(), getULPs(in));
- max[componentNdx] = getMax(m.asDouble(), getULPs(in));
+ min[componentNdx] = getMin(result, getULPs(in));
+ max[componentNdx] = getMax(result, getULPs(in));
}
return true;