Skip to content

Commit 2cd78d3

Browse files
Fix SVE Scatter*With*Offsets* codegen (dotnet#119712)
Currently, offsets are incorrectly treated as indices which is leading to incorrect code being emitted. e.g., `ScatterWithByteOffsets<long>` emits `ST1D Zdata.D, Pg, [Xbase, Zoffsets.D, lsl #3]` instead of, `ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]`
1 parent 55d09c7 commit 2cd78d3

File tree

4 files changed

+108
-82
lines changed

4 files changed

+108
-82
lines changed

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,12 +2300,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
23002300

23012301
case NI_Sve_Scatter:
23022302
case NI_Sve_Scatter16BitNarrowing:
2303-
case NI_Sve_Scatter16BitWithByteOffsetsNarrowing:
23042303
case NI_Sve_Scatter32BitNarrowing:
2305-
case NI_Sve_Scatter32BitWithByteOffsetsNarrowing:
23062304
case NI_Sve_Scatter8BitNarrowing:
2307-
case NI_Sve_Scatter8BitWithByteOffsetsNarrowing:
2308-
case NI_Sve_ScatterWithByteOffsets:
23092305
{
23102306
if (!varTypeIsSIMD(intrin.op2->gtType))
23112307
{
@@ -2340,6 +2336,23 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
23402336
break;
23412337
}
23422338

2339+
case NI_Sve_Scatter16BitWithByteOffsetsNarrowing:
2340+
case NI_Sve_Scatter32BitWithByteOffsetsNarrowing:
2341+
case NI_Sve_Scatter8BitWithByteOffsetsNarrowing:
2342+
case NI_Sve_ScatterWithByteOffsets:
2343+
{
2344+
emitAttr baseSize = emitActualTypeSize(intrin.baseType);
2345+
2346+
if (baseSize == EA_4BYTE)
2347+
{
2348+
opt = varTypeIsUnsigned(node->GetAuxiliaryType()) ? INS_OPTS_SCALABLE_S_UXTW
2349+
: INS_OPTS_SCALABLE_S_SXTW;
2350+
}
2351+
2352+
GetEmitter()->emitIns_R_R_R_R(ins, emitSize, op4Reg, op1Reg, op2Reg, op3Reg, opt);
2353+
break;
2354+
}
2355+
23432356
case NI_Sve_StoreNarrowing:
23442357
opt = emitter::optGetSveInsOpt(emitTypeSize(intrin.baseType));
23452358
GetEmitter()->emitIns_R_R_R_I(ins, emitSize, op3Reg, op1Reg, op2Reg, 0, opt);

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9074,73 +9074,73 @@ internal Arm64() { }
90749074
/// void svst1_scatter_[s64]offset[_f64](svbool_t pg, float64_t *base, svint64_t offsets, svfloat64_t data)
90759075
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
90769076
/// </summary>
9077-
public static unsafe void ScatterWithByteOffsets(Vector<double> mask, double* address, Vector<long> offsets, Vector<double> data) => Scatter(mask, address, offsets, data);
9077+
public static unsafe void ScatterWithByteOffsets(Vector<double> mask, double* address, Vector<long> offsets, Vector<double> data) => ScatterWithByteOffsets(mask, address, offsets, data);
90789078

90799079
/// <summary>
90809080
/// void svst1_scatter_[u64]offset[_f64](svbool_t pg, float64_t *base, svuint64_t offsets, svfloat64_t data)
90819081
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
90829082
/// </summary>
9083-
public static unsafe void ScatterWithByteOffsets(Vector<double> mask, double* address, Vector<ulong> offsets, Vector<double> data) => Scatter(mask, address, offsets, data);
9083+
public static unsafe void ScatterWithByteOffsets(Vector<double> mask, double* address, Vector<ulong> offsets, Vector<double> data) => ScatterWithByteOffsets(mask, address, offsets, data);
90849084

90859085
/// <summary>
90869086
/// void svst1_scatter_[s32]offset[_s32](svbool_t pg, int32_t *base, svint32_t offsets, svint32_t data)
90879087
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]
90889088
/// </summary>
9089-
public static unsafe void ScatterWithByteOffsets(Vector<int> mask, int* address, Vector<int> offsets, Vector<int> data) => Scatter(mask, address, offsets, data);
9089+
public static unsafe void ScatterWithByteOffsets(Vector<int> mask, int* address, Vector<int> offsets, Vector<int> data) => ScatterWithByteOffsets(mask, address, offsets, data);
90909090

90919091
/// <summary>
90929092
/// void svst1_scatter_[u32]offset[_s32](svbool_t pg, int32_t *base, svuint32_t offsets, svint32_t data)
90939093
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, UXTW]
90949094
/// </summary>
9095-
public static unsafe void ScatterWithByteOffsets(Vector<int> mask, int* address, Vector<uint> offsets, Vector<int> data) => Scatter(mask, address, offsets, data);
9095+
public static unsafe void ScatterWithByteOffsets(Vector<int> mask, int* address, Vector<uint> offsets, Vector<int> data) => ScatterWithByteOffsets(mask, address, offsets, data);
90969096

90979097
/// <summary>
90989098
/// void svst1_scatter_[s64]offset[_s64](svbool_t pg, int64_t *base, svint64_t offsets, svint64_t data)
90999099
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
91009100
/// </summary>
9101-
public static unsafe void ScatterWithByteOffsets(Vector<long> mask, long* address, Vector<long> offsets, Vector<long> data) => Scatter(mask, address, offsets, data);
9101+
public static unsafe void ScatterWithByteOffsets(Vector<long> mask, long* address, Vector<long> offsets, Vector<long> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91029102

91039103
/// <summary>
91049104
/// void svst1_scatter_[u64]offset[_s64](svbool_t pg, int64_t *base, svuint64_t offsets, svint64_t data)
91059105
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
91069106
/// </summary>
9107-
public static unsafe void ScatterWithByteOffsets(Vector<long> mask, long* address, Vector<ulong> offsets, Vector<long> data) => Scatter(mask, address, offsets, data);
9107+
public static unsafe void ScatterWithByteOffsets(Vector<long> mask, long* address, Vector<ulong> offsets, Vector<long> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91089108

91099109
/// <summary>
91109110
/// void svst1_scatter_[s32]offset[_f32](svbool_t pg, float32_t *base, svint32_t offsets, svfloat32_t data)
91119111
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]
91129112
/// </summary>
9113-
public static unsafe void ScatterWithByteOffsets(Vector<float> mask, float* address, Vector<int> offsets, Vector<float> data) => Scatter(mask, address, offsets, data);
9113+
public static unsafe void ScatterWithByteOffsets(Vector<float> mask, float* address, Vector<int> offsets, Vector<float> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91149114

91159115
/// <summary>
91169116
/// void svst1_scatter_[u32]offset[_f32](svbool_t pg, float32_t *base, svuint32_t offsets, svfloat32_t data)
91179117
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, UXTW]
91189118
/// </summary>
9119-
public static unsafe void ScatterWithByteOffsets(Vector<float> mask, float* address, Vector<uint> offsets, Vector<float> data) => Scatter(mask, address, offsets, data);
9119+
public static unsafe void ScatterWithByteOffsets(Vector<float> mask, float* address, Vector<uint> offsets, Vector<float> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91209120

91219121
/// <summary>
91229122
/// void svst1_scatter_[s32]offset[_u32](svbool_t pg, uint32_t *base, svint32_t offsets, svuint32_t data)
91239123
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]
91249124
/// </summary>
9125-
public static unsafe void ScatterWithByteOffsets(Vector<uint> mask, uint* address, Vector<int> offsets, Vector<uint> data) => Scatter(mask, address, offsets, data);
9125+
public static unsafe void ScatterWithByteOffsets(Vector<uint> mask, uint* address, Vector<int> offsets, Vector<uint> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91269126

91279127
/// <summary>
91289128
/// void svst1_scatter_[u32]offset[_u32](svbool_t pg, uint32_t *base, svuint32_t offsets, svuint32_t data)
91299129
/// ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, UXTW]
91309130
/// </summary>
9131-
public static unsafe void ScatterWithByteOffsets(Vector<uint> mask, uint* address, Vector<uint> offsets, Vector<uint> data) => Scatter(mask, address, offsets, data);
9131+
public static unsafe void ScatterWithByteOffsets(Vector<uint> mask, uint* address, Vector<uint> offsets, Vector<uint> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91329132

91339133
/// <summary>
91349134
/// void svst1_scatter_[s64]offset[_u64](svbool_t pg, uint64_t *base, svint64_t offsets, svuint64_t data)
91359135
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
91369136
/// </summary>
9137-
public static unsafe void ScatterWithByteOffsets(Vector<ulong> mask, ulong* address, Vector<long> offsets, Vector<ulong> data) => Scatter(mask, address, offsets, data);
9137+
public static unsafe void ScatterWithByteOffsets(Vector<ulong> mask, ulong* address, Vector<long> offsets, Vector<ulong> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91389138

91399139
/// <summary>
91409140
/// void svst1_scatter_[u64]offset[_u64](svbool_t pg, uint64_t *base, svuint64_t offsets, svuint64_t data)
91419141
/// ST1D Zdata.D, Pg, [Xbase, Zoffsets.D]
91429142
/// </summary>
9143-
public static unsafe void ScatterWithByteOffsets(Vector<ulong> mask, ulong* address, Vector<ulong> offsets, Vector<ulong> data) => Scatter(mask, address, offsets, data);
9143+
public static unsafe void ScatterWithByteOffsets(Vector<ulong> mask, ulong* address, Vector<ulong> offsets, Vector<ulong> data) => ScatterWithByteOffsets(mask, address, offsets, data);
91449144

91459145

91469146
// Write to the first-fault register

0 commit comments

Comments
 (0)