Skip to content

Commit 5888837

Browse files
SVE2 API for FusedAddHalving and FusedSubtractHalving (#117609)
1 parent f1f1167 commit 5888837

File tree

6 files changed

+396
-0
lines changed

6 files changed

+396
-0
lines changed

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,8 @@ HARDWARE_INTRINSIC(Sve2, BitwiseClearXor,
337337
HARDWARE_INTRINSIC(Sve2, BitwiseSelect, -1, 3, {INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
338338
HARDWARE_INTRINSIC(Sve2, BitwiseSelectLeftInverted, -1, 3, {INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
339339
HARDWARE_INTRINSIC(Sve2, BitwiseSelectRightInverted, -1, 3, {INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
340+
HARDWARE_INTRINSIC(Sve2, FusedAddHalving, -1, -1, {INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)
341+
HARDWARE_INTRINSIC(Sve2, FusedSubtractHalving, -1, -1, {INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)
340342
HARDWARE_INTRINSIC(Sve2, InterleavingXorEvenOdd, -1, 3, {INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics)
341343
HARDWARE_INTRINSIC(Sve2, InterleavingXorOddEven, -1, 3, {INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics)
342344
HARDWARE_INTRINSIC(Sve2, ShiftArithmeticRounded, -1, -1, {INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,170 @@ internal Arm64() { }
10061006
/// </summary>
10071007
public static Vector<ulong> BitwiseSelectRightInverted(Vector<ulong> select, Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
10081008

1009+
// Halving add
1010+
1011+
/// <summary>
1012+
/// svuint8_t svhadd[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2)
1013+
/// svuint8_t svhadd[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2)
1014+
/// svuint8_t svhadd[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2)
1015+
/// UHADD Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1016+
/// UHADD Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1017+
/// UHADD Ztied2.B, Pg/M, Ztied2.B, Zop1.B
1018+
/// </summary>
1019+
public static Vector<byte> FusedAddHalving(Vector<byte> left, Vector<byte> right) { throw new PlatformNotSupportedException(); }
1020+
1021+
/// <summary>
1022+
/// svint16_t svhadd[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2)
1023+
/// svint16_t svhadd[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2)
1024+
/// svint16_t svhadd[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2)
1025+
/// SHADD Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1026+
/// SHADD Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1027+
/// SHADD Ztied2.H, Pg/M, Ztied2.H, Zop1.H
1028+
/// </summary>
1029+
public static Vector<short> FusedAddHalving(Vector<short> left, Vector<short> right) { throw new PlatformNotSupportedException(); }
1030+
1031+
/// <summary>
1032+
/// svint32_t svhadd[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2)
1033+
/// svint32_t svhadd[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2)
1034+
/// svint32_t svhadd[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2)
1035+
/// SHADD Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1036+
/// SHADD Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1037+
/// SHADD Ztied2.S, Pg/M, Ztied2.S, Zop1.S
1038+
/// </summary>
1039+
public static Vector<int> FusedAddHalving(Vector<int> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
1040+
1041+
/// <summary>
1042+
/// svint64_t svhadd[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2)
1043+
/// svint64_t svhadd[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2)
1044+
/// svint64_t svhadd[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2)
1045+
/// SHADD Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1046+
/// SHADD Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1047+
/// SHADD Ztied2.D, Pg/M, Ztied2.D, Zop1.D
1048+
/// </summary>
1049+
public static Vector<long> FusedAddHalving(Vector<long> left, Vector<long> right) { throw new PlatformNotSupportedException(); }
1050+
1051+
/// <summary>
1052+
/// svint8_t svhadd[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2)
1053+
/// svint8_t svhadd[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2)
1054+
/// svint8_t svhadd[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2)
1055+
/// SHADD Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1056+
/// SHADD Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1057+
/// SHADD Ztied2.B, Pg/M, Ztied2.B, Zop1.B
1058+
/// </summary>
1059+
public static Vector<sbyte> FusedAddHalving(Vector<sbyte> left, Vector<sbyte> right) { throw new PlatformNotSupportedException(); }
1060+
1061+
/// <summary>
1062+
/// svuint16_t svhadd[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2)
1063+
/// svuint16_t svhadd[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2)
1064+
/// svuint16_t svhadd[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2)
1065+
/// UHADD Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1066+
/// UHADD Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1067+
/// UHADD Ztied2.H, Pg/M, Ztied2.H, Zop1.H
1068+
/// </summary>
1069+
public static Vector<ushort> FusedAddHalving(Vector<ushort> left, Vector<ushort> right) { throw new PlatformNotSupportedException(); }
1070+
1071+
/// <summary>
1072+
/// svuint32_t svhadd[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2)
1073+
/// svuint32_t svhadd[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2)
1074+
/// svuint32_t svhadd[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2)
1075+
/// UHADD Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1076+
/// UHADD Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1077+
/// UHADD Ztied2.S, Pg/M, Ztied2.S, Zop1.S
1078+
/// </summary>
1079+
public static Vector<uint> FusedAddHalving(Vector<uint> left, Vector<uint> right) { throw new PlatformNotSupportedException(); }
1080+
1081+
/// <summary>
1082+
/// svuint64_t svhadd[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2)
1083+
/// svuint64_t svhadd[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2)
1084+
/// svuint64_t svhadd[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2)
1085+
/// UHADD Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1086+
/// UHADD Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1087+
/// UHADD Ztied2.D, Pg/M, Ztied2.D, Zop1.D
1088+
/// </summary>
1089+
public static Vector<ulong> FusedAddHalving(Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
1090+
1091+
// Halving subtract
1092+
1093+
/// <summary>
1094+
/// svuint8_t svhsub[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2)
1095+
/// svuint8_t svhsub[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2)
1096+
/// svuint8_t svhsub[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2)
1097+
/// UHSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1098+
/// UHSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1099+
/// UHSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B
1100+
/// </summary>
1101+
public static Vector<byte> FusedSubtractHalving(Vector<byte> left, Vector<byte> right) { throw new PlatformNotSupportedException(); }
1102+
1103+
/// <summary>
1104+
/// svint16_t svhsub[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2)
1105+
/// svint16_t svhsub[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2)
1106+
/// svint16_t svhsub[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2)
1107+
/// SHSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1108+
/// SHSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1109+
/// SHSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H
1110+
/// </summary>
1111+
public static Vector<short> FusedSubtractHalving(Vector<short> left, Vector<short> right) { throw new PlatformNotSupportedException(); }
1112+
1113+
/// <summary>
1114+
/// svint32_t svhsub[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2)
1115+
/// svint32_t svhsub[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2)
1116+
/// svint32_t svhsub[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2)
1117+
/// SHSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1118+
/// SHSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1119+
/// SHSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S
1120+
/// </summary>
1121+
public static Vector<int> FusedSubtractHalving(Vector<int> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
1122+
1123+
/// <summary>
1124+
/// svint64_t svhsub[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2)
1125+
/// svint64_t svhsub[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2)
1126+
/// svint64_t svhsub[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2)
1127+
/// SHSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1128+
/// SHSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1129+
/// SHSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D
1130+
/// </summary>
1131+
public static Vector<long> FusedSubtractHalving(Vector<long> left, Vector<long> right) { throw new PlatformNotSupportedException(); }
1132+
1133+
/// <summary>
1134+
/// svint8_t svhsub[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2)
1135+
/// svint8_t svhsub[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2)
1136+
/// svint8_t svhsub[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2)
1137+
/// SHSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1138+
/// SHSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B
1139+
/// SHSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B
1140+
/// </summary>
1141+
public static Vector<sbyte> FusedSubtractHalving(Vector<sbyte> left, Vector<sbyte> right) { throw new PlatformNotSupportedException(); }
1142+
1143+
/// <summary>
1144+
/// svuint16_t svhsub[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2)
1145+
/// svuint16_t svhsub[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2)
1146+
/// svuint16_t svhsub[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2)
1147+
/// UHSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1148+
/// UHSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H
1149+
/// UHSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H
1150+
/// </summary>
1151+
public static Vector<ushort> FusedSubtractHalving(Vector<ushort> left, Vector<ushort> right) { throw new PlatformNotSupportedException(); }
1152+
1153+
/// <summary>
1154+
/// svuint32_t svhsub[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2)
1155+
/// svuint32_t svhsub[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2)
1156+
/// svuint32_t svhsub[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2)
1157+
/// UHSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1158+
/// UHSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S
1159+
/// UHSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S
1160+
/// </summary>
1161+
public static Vector<uint> FusedSubtractHalving(Vector<uint> left, Vector<uint> right) { throw new PlatformNotSupportedException(); }
1162+
1163+
/// <summary>
1164+
/// svuint64_t svhsub[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2)
1165+
/// svuint64_t svhsub[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2)
1166+
/// svuint64_t svhsub[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2)
1167+
/// UHSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1168+
/// UHSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D
1169+
/// UHSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D
1170+
/// </summary>
1171+
public static Vector<ulong> FusedSubtractHalving(Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
1172+
10091173
/// Interleaving Xor
10101174

10111175
/// <summary>

0 commit comments

Comments
 (0)