| 
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