Skip to content

Commit 07b7d21

Browse files
committed
1. Add unit case for non-default rounding mode
2. removed round-to-even, the default option from InsOpts as it will be handled on the default path.
1 parent 3973035 commit 07b7d21

File tree

6 files changed

+53
-15
lines changed

6 files changed

+53
-15
lines changed

src/coreclr/jit/emit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ class emitter
15461546
void idSetEvexbContext(insOpts instOptions)
15471547
{
15481548
assert(_idEvexbContext == 0);
1549-
if (instOptions == INS_OPTS_EVEX_eb_er_rn)
1549+
if (instOptions == INS_OPTS_EVEX_eb_er_rd)
15501550
{
15511551
_idEvexbContext = 1;
15521552
}

src/coreclr/jit/emitxarch.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ insOpts emitter::GetEmbRoundingMode(uint8_t mode) const
11521152
switch (mode)
11531153
{
11541154
case 1:
1155-
return INS_OPTS_EVEX_er_rd;
1155+
return INS_OPTS_EVEX_eb_er_rd;
11561156
case 2:
11571157
return INS_OPTS_EVEX_er_ru;
11581158
case 3:

src/coreclr/jit/emitxarch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ code_t AddSimdPrefixIfNeeded(const instrDesc* id, code_t code, emitAttr size)
345345
// instOptions - emit options
346346
void SetEvexBroadcastIfNeeded(instrDesc* id, insOpts instOptions)
347347
{
348-
if((instOptions & INS_OPTS_b_MASK) == INS_OPTS_EVEX_eb_er_rn)
348+
if((instOptions & INS_OPTS_b_MASK) == INS_OPTS_EVEX_eb_er_rd)
349349
{
350350
assert(UseEvexEncoding());
351351
id->idSetEvexbContext(instOptions);

src/coreclr/jit/instr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,7 @@ void CodeGen::inst_RV_RV_TT(
12391239
bool IsEmbBroadcast = CodeGenInterface::IsEmbeddedBroadcastEnabled(ins, op2);
12401240
if (IsEmbBroadcast)
12411241
{
1242-
instOptions = INS_OPTS_EVEX_eb_er_rn;
1242+
instOptions = INS_OPTS_EVEX_eb_er_rd;
12431243
if (emitter::IsBitwiseInstruction(ins) && varTypeIsLong(op2->AsHWIntrinsic()->GetSimdBaseType()))
12441244
{
12451245
switch (ins)

src/coreclr/jit/instr.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,13 @@ enum insOpts: unsigned
205205
{
206206
INS_OPTS_NONE = 0,
207207

208-
INS_OPTS_EVEX_eb_er_rn = 1, // Round to even
208+
INS_OPTS_EVEX_eb_er_rd = 1, // Embedded Broadcast or Round down
209209

210-
INS_OPTS_EVEX_er_rd = 2, // Round down
210+
INS_OPTS_EVEX_er_ru = 2, // Round up
211211

212-
INS_OPTS_EVEX_er_ru = 3, // Round up
212+
INS_OPTS_EVEX_er_rz = 3, // Round towards zero
213213

214-
INS_OPTS_EVEX_er_rz = 4, // Round towards zero
215-
216-
INS_OPTS_b_MASK = (INS_OPTS_EVEX_eb_er_rn | INS_OPTS_EVEX_er_rd | INS_OPTS_EVEX_er_ru | INS_OPTS_EVEX_er_rz), // mask for Evex.b related features.
214+
INS_OPTS_b_MASK = (INS_OPTS_EVEX_eb_er_rd | INS_OPTS_EVEX_er_ru | INS_OPTS_EVEX_er_rz), // mask for Evex.b related features.
217215
};
218216

219217
#elif defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)

src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/EmbeddedRounding.Double.cs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,62 @@ public partial class Program
1717
public static unsafe void AddEmbeddedRounding()
1818
{
1919
int testResult = 1;
20+
ulong[] answerTable_ToNegativeInfinity = new ulong[8] {0x3fe0000000000000, 0x3fe0000000000000, 0x3fdfffffffffffff, 0x3fe0000000000000,
21+
0xbfe0000000000000, 0xbfe0000000000000, 0xbfe0000000000000, 0xbfe0000000000001};
22+
ulong[] answerTable_ToPositiveInfinity = new ulong[8] {0x3fe0000000000001, 0x3fe0000000000001, 0x3fe0000000000000, 0x3fe0000000000000,
23+
0xbfe0000000000000, 0xbfe0000000000000, 0xbfdfffffffffffff, 0xbfe0000000000000};
24+
ulong[] answerTable_ToZero = new ulong[8] {0x3fe0000000000000, 0x3fe0000000000000, 0x3fdfffffffffffff, 0x3fe0000000000000,
25+
0xbfe0000000000000, 0xbfe0000000000000, 0xbfdfffffffffffff, 0xbfe0000000000000};
2026

2127
if (Avx512F.IsSupported)
2228
{
23-
using (TestTable_2Input<double> doubleTable = new TestTable_2Input<double>(new double[8] { 1, -5, 100, 0, 1, -5, 100, 0 }, new double[8] { 1, 1, 50, 0, 1, 1, 50, 0 }, new double[8]))
29+
using (TestTable_2Input<double> doubleTable = new TestTable_2Input<double>(new double[8] { 0.05 , 0.10, 0.15, 0.20, -0.25, -0.30, -0.35, -0.40 }, new double[8] { 0.45 , 0.40, 0.35, 0.30, -0.25, -0.20, -0.15, -0.10 }, new double[8]))
2430
{
2531

2632
var vd1 = Unsafe.Read<Vector512<double>>(doubleTable.inArray1Ptr);
2733
var vd2 = Unsafe.Read<Vector512<double>>(doubleTable.inArray2Ptr);
28-
var vd3 = Avx512F.Add(vd1, vd2, FloatRoundingMode.ToEven);
34+
var vd3 = Avx512F.Add(vd1, vd2, FloatRoundingMode.ToNegativeInfinity);
2935
Unsafe.Write(doubleTable.outArrayPtr, vd3);
30-
36+
37+
for (int i = 0; i < doubleTable.outArray.Length; i++)
38+
{
39+
if (BitConverter.DoubleToUInt64Bits(doubleTable.outArray[i]) != answerTable_ToNegativeInfinity[i])
40+
{
41+
Console.WriteLine("Avx512 Add Embedded rounding failed on double with ToNegativeInfinity:");
42+
foreach (var item in doubleTable.outArray)
43+
{
44+
Console.Write(item + ", ");
45+
}
46+
Console.WriteLine();
47+
Assert.Fail("");
48+
}
49+
}
50+
51+
vd3 = Avx512F.Add(vd1, vd2, FloatRoundingMode.ToPositiveInfinity);
52+
Unsafe.Write(doubleTable.outArrayPtr, vd3);
53+
54+
for (int i = 0; i < doubleTable.outArray.Length; i++)
55+
{
56+
if (BitConverter.DoubleToUInt64Bits(doubleTable.outArray[i]) != answerTable_ToPositiveInfinity[i])
57+
{
58+
Console.WriteLine("Avx512 Add Embedded rounding failed on double with ToPositiveInfinity:");
59+
foreach (var item in doubleTable.outArray)
60+
{
61+
Console.Write(item + ", ");
62+
}
63+
Console.WriteLine();
64+
Assert.Fail("");
65+
}
66+
}
67+
68+
vd3 = Avx512F.Add(vd1, vd2, FloatRoundingMode.ToZero);
69+
Unsafe.Write(doubleTable.outArrayPtr, vd3);
70+
3171
for (int i = 0; i < doubleTable.outArray.Length; i++)
3272
{
33-
if (BitConverter.DoubleToInt64Bits(doubleTable.outArray[i]) != BitConverter.DoubleToInt64Bits(doubleTable.inArray1[i] + doubleTable.inArray2[i]))
73+
if (BitConverter.DoubleToUInt64Bits(doubleTable.outArray[i]) != answerTable_ToZero[i])
3474
{
35-
Console.WriteLine("Avx512 Add Embedded rounding failed on double:");
75+
Console.WriteLine("Avx512 Add Embedded rounding failed on double with ToZero:");
3676
foreach (var item in doubleTable.outArray)
3777
{
3878
Console.Write(item + ", ");

0 commit comments

Comments
 (0)