|
14 | 14 |
|
15 | 15 | include "riscv_vector_common.td" |
16 | 16 |
|
| 17 | +class IsFloat<string type> { |
| 18 | + bit val = !or(!eq(type, "x"), !eq(type, "f"), !eq(type, "d"), !eq(type, "y")); |
| 19 | +} |
| 20 | + |
17 | 21 | //===----------------------------------------------------------------------===// |
18 | 22 | // Instruction definitions |
19 | 23 | //===----------------------------------------------------------------------===// |
@@ -198,3 +202,169 @@ let ManualCodegen = [{ |
198 | 202 | defm sf_vfnrclip_xu_f_qf : RVVVFNRCLIPBuiltinSet<"Uv", "UvFqf", "c">; |
199 | 203 | } |
200 | 204 | } |
| 205 | + |
| 206 | +multiclass RVVSFTileLoadStoreBuiltinSet<list<string> types, |
| 207 | + list<string> RequiredFeatures = []> { |
| 208 | + let OverloadedName = NAME, |
| 209 | + Name = NAME, |
| 210 | + IRName = NAME, |
| 211 | + Log2LMUL = [0], |
| 212 | + HasMasked = false, |
| 213 | + ManualCodegen = [{IntrinsicTypes = {Ops.back()->getType()};}] in |
| 214 | + foreach type = types in { |
| 215 | + let RequiredFeatures = !listconcat(RequiredFeatures, |
| 216 | + !cond(!eq(type, "x"): ["zvfhmin"], |
| 217 | + !eq(type, "y"): ["zvfbfmin"], |
| 218 | + true: []<string>)) in { |
| 219 | + def : RVVBuiltin<"e", "0zPCe", type>; |
| 220 | + if !not(IsFloat<type>.val) then |
| 221 | + def : RVVBuiltin<"Ue", "0zPCUe", type>; |
| 222 | + } |
| 223 | + } |
| 224 | +} |
| 225 | + |
| 226 | +multiclass RVVSFTileMoveBuiltinSet<list<list<string>> suffixes_prototypes, |
| 227 | + list<int> intrinsic_types, |
| 228 | + string type, |
| 229 | + list<string> RequiredFeatures = []> { |
| 230 | + foreach sp = suffixes_prototypes in |
| 231 | + let RequiredFeatures = !listconcat(RequiredFeatures, |
| 232 | + !cond(!eq(type, "x"): ["zvfhmin"], |
| 233 | + !eq(type, "y"): ["zvfbfmin"], |
| 234 | + true: []<string>)), |
| 235 | + SupportOverloading = false, |
| 236 | + HasMasked = false, |
| 237 | + Name = NAME, |
| 238 | + IRName = NAME, |
| 239 | + HasVL = true, |
| 240 | + Log2LMUL = [3], |
| 241 | + IntrinsicTypes = intrinsic_types in |
| 242 | + def : RVVBuiltin<sp[0], sp[1], type>; |
| 243 | +} |
| 244 | + |
| 245 | +multiclass RVVSFTileMoveVTBuiltinSet<list<string> RequiredFeatures = []> { |
| 246 | + foreach type = ["c", "s", "i", "l"] in |
| 247 | + defm NAME : |
| 248 | + RVVSFTileMoveBuiltinSet<[["v", "vz"], ["Uv", "Uvz"]], [-1], type, |
| 249 | + RequiredFeatures>; |
| 250 | + foreach type = ["x", "y", "f", "d"] in |
| 251 | + defm NAME : |
| 252 | + RVVSFTileMoveBuiltinSet<[["v", "vz"]], [-1], type, RequiredFeatures>; |
| 253 | +} |
| 254 | + |
| 255 | +multiclass RVVSFTileMoveTVBuiltinSet<list<string> RequiredFeatures = []> { |
| 256 | + let SupportOverloading = true, OverloadedName = NAME in { |
| 257 | + foreach type = ["c", "s", "i", "l"] in |
| 258 | + defm NAME : |
| 259 | + RVVSFTileMoveBuiltinSet<[["v", "0zv"], ["Uv", "0zUv"]], [1], type, |
| 260 | + RequiredFeatures>; |
| 261 | + foreach type = ["x", "y", "f", "d"] in |
| 262 | + defm NAME : |
| 263 | + RVVSFTileMoveBuiltinSet<[["v", "0zv"]], [1], type, RequiredFeatures>; |
| 264 | + } |
| 265 | +} |
| 266 | + |
| 267 | +multiclass RVVOp0Op1Op2BuiltinSet<string intrinsic_name, string type_range, |
| 268 | + list<list<string>> suffixes_prototypes> |
| 269 | + : RVVBuiltinSet<intrinsic_name, type_range, suffixes_prototypes, [0, 1, 2]>; |
| 270 | + |
| 271 | +multiclass RVVSFMatMulBuiltinSet<string prototype, string suffix, |
| 272 | + string type_range, list<int> widens> { |
| 273 | + foreach widen = widens in |
| 274 | + let OverloadedName = NAME, |
| 275 | + TWiden = widen, |
| 276 | + HasVL = false, |
| 277 | + Log2LMUL = [3], |
| 278 | + HasMasked = false in |
| 279 | + defm NAME : RVVOp0Op1Op2BuiltinSet<NAME, type_range, |
| 280 | + [[!strconcat("w", !cast<string>(widen)), suffix, prototype]]>; |
| 281 | +} |
| 282 | + |
| 283 | +multiclass RVVSFMatMulFloatBuiltinSet<string name, string prototype, string suffix, |
| 284 | + list<string> type_range, int widen> { |
| 285 | + // Currently the XSfmm spec doesn't support w8. |
| 286 | + foreach type = type_range in |
| 287 | + let OverloadedName = name # !strconcat("_w", !cast<string>(widen)), |
| 288 | + TWiden = widen, |
| 289 | + HasVL = false, |
| 290 | + Log2LMUL = [3], |
| 291 | + Name = name # "_" # !strconcat("w", !cast<string>(widen)), |
| 292 | + HasMasked = false in |
| 293 | + defm : RVVOp0Op1BuiltinSet<name, type, [["", suffix, prototype]]>; |
| 294 | +} |
| 295 | + |
| 296 | +multiclass RVVSFVTZeroBuiltinSet { |
| 297 | + let SupportOverloading = false, |
| 298 | + HasVL = false, |
| 299 | + HasMasked = false, |
| 300 | + Name = NAME, |
| 301 | + IRName = NAME, |
| 302 | + Log2LMUL = [0] in |
| 303 | + defm : RVVOp0BuiltinSet<NAME, "i", [["", "", "0Kzzzzz"]]>; |
| 304 | +} |
| 305 | + |
| 306 | +multiclass RVVSFVTDiscardBuiltinSet { |
| 307 | + let SupportOverloading = false, |
| 308 | + HasVL = false, |
| 309 | + HasMasked = false, |
| 310 | + Name = NAME, |
| 311 | + IRName = NAME, |
| 312 | + Log2LMUL = [0] in |
| 313 | + defm : RVVBuiltinSet<NAME, "i", [["", "", "0"]], []>; |
| 314 | +} |
| 315 | + |
| 316 | +let RequiredFeatures = ["xsfmmbase"] in { |
| 317 | + let SupportOverloading = false, |
| 318 | + HasVL = false, |
| 319 | + HasMasked = false, |
| 320 | + Log2LMUL = [0], |
| 321 | + ManualCodegen = [{IntrinsicTypes = {ResultType};}] in // Set XLEN type |
| 322 | + { |
| 323 | + // let HasBuiltinAlias = false in |
| 324 | + def sf_vsettnt : RVVBuiltin<"", "zzKzKz", "i">; |
| 325 | + def sf_vsettm : RVVBuiltin<"", "zzKzKz", "i">; |
| 326 | + let IRName = "sf_vsettnt" in |
| 327 | + def sf_vsettn : RVVBuiltin<"", "zzKzKz", "i">; |
| 328 | + def sf_vsettk : RVVBuiltin<"", "zzKzKz", "i">; |
| 329 | + } |
| 330 | + defm sf_vtzero_t : RVVSFVTZeroBuiltinSet; |
| 331 | + defm sf_vtdiscard : RVVSFVTDiscardBuiltinSet; |
| 332 | +} |
| 333 | + |
| 334 | +defm sf_vtmv_v_t : RVVSFTileMoveVTBuiltinSet<["xsfmmbase"]>; |
| 335 | +defm sf_vtmv_t_v : RVVSFTileMoveTVBuiltinSet<["xsfmmbase"]>; |
| 336 | + |
| 337 | +defm sf_vlte8 : RVVSFTileLoadStoreBuiltinSet<["c"], ["xsfmmbase"]>; |
| 338 | +defm sf_vlte16 : RVVSFTileLoadStoreBuiltinSet<["s", "x", "y"], ["xsfmmbase"]>; |
| 339 | +defm sf_vlte32 : RVVSFTileLoadStoreBuiltinSet<["i", "f"], ["xsfmmbase"]>; |
| 340 | +defm sf_vlte64 : RVVSFTileLoadStoreBuiltinSet<["l", "d"], ["xsfmmbase"]>; |
| 341 | + |
| 342 | +defm sf_vste8 : RVVSFTileLoadStoreBuiltinSet<["c"], ["xsfmmbase"]>; |
| 343 | +defm sf_vste16 : RVVSFTileLoadStoreBuiltinSet<["s", "x", "y"], ["xsfmmbase"]>; |
| 344 | +defm sf_vste32 : RVVSFTileLoadStoreBuiltinSet<["i", "f"], ["xsfmmbase"]>; |
| 345 | +defm sf_vste64 : RVVSFTileLoadStoreBuiltinSet<["l", "d"], ["xsfmmbase"]>; |
| 346 | + |
| 347 | +let RequiredFeatures = ["xsfmm32a8i"] in { |
| 348 | + defm sf_mm_u_u : RVVSFMatMulBuiltinSet<"0KzUvUvzzz", "UvUv", "c", [4]>; |
| 349 | + defm sf_mm_s_u : RVVSFMatMulBuiltinSet<"0KzvUvzzz", "vUv", "c", [4]>; |
| 350 | + defm sf_mm_u_s : RVVSFMatMulBuiltinSet<"0KzUvvzzz", "Uvv", "c", [4]>; |
| 351 | + defm sf_mm_s_s : RVVSFMatMulBuiltinSet<"0Kzvvzzz", "vv", "c", [4]>; |
| 352 | + |
| 353 | +} |
| 354 | + |
| 355 | +let RequiredFeatures = ["xsfmm32a16f"] in |
| 356 | + defm : RVVSFMatMulFloatBuiltinSet<"sf_mm_f_f", "0Kzvvzzz", "v", ["x", "y"], 2>; |
| 357 | + |
| 358 | +let RequiredFeatures = ["xsfmm32a32f"] in |
| 359 | + defm : RVVSFMatMulFloatBuiltinSet<"sf_mm_f_f", "0Kzvvzzz", "v", ["f"], 1>; |
| 360 | + |
| 361 | +let RequiredFeatures = ["xsfmm32a8f"] in |
| 362 | + foreach e1 = [5, 4] in |
| 363 | + foreach e2 = [5, 4] in |
| 364 | + let OverloadedName = "sf_mm_e" # e1 # "m" # !sub(7, e1) # "_e" # e2 # "m" # !sub(7, e2) in |
| 365 | + defm : RVVSFMatMulFloatBuiltinSet< |
| 366 | + "sf_mm_e" # e1 # "m" # !sub(7, e1) # "_e" # e2 # "m" # !sub(7, e2), |
| 367 | + "0KzUvUvzzz", "UvUv", ["c"], 4>; |
| 368 | + |
| 369 | +let RequiredFeatures = ["xsfmm64a64f"] in |
| 370 | + defm : RVVSFMatMulFloatBuiltinSet<"sf_mm_f_f", "0Kzvvzzz", "v", ["d"], 1>; |
0 commit comments