Source file src/simd/archsimd/_gen/simdgen/arch.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import "fmt"
     8  
     9  // ArchInfo contains all architecture-specific naming conventions.
    10  type ArchInfo struct {
    11  	Arch            string          // e.g., "amd64", "arm64"
    12  	ArchUpper       string          // e.g., "AMD64", "ARM64"
    13  	ObjArch         string          // e.g., "x86", "arm64" (for cmd/internal/obj/*)
    14  	RegInfoKeys     []string        // RegInfo shapes that generate SSA lowering code (gen_simdssa.go)
    15  	RegInfoSet      map[string]bool // Valid regInfo shapes (for gen_simdMachineOps.go)
    16  	RegInfoParams   string          // Function parameter declaration for generated ops (simd[AMD64|ARM64]ops.go)
    17  	GeneratedHeader string          // Header comment for generated files
    18  	Arrangements    []string        // SIMD arrangement suffixes (e.g., "4S", "2D" for ARM64; nil for amd64)
    19  }
    20  
    21  var amd64RegInfoKeys = []string{
    22  	"v11",
    23  	"v21",
    24  	"v2k",
    25  	"v2kv",
    26  	"v2kk",
    27  	"vkv",
    28  	"v31",
    29  	"v3kv",
    30  	"v11Imm8",
    31  	"vkvImm8",
    32  	"v21Imm8",
    33  	"v2kImm8",
    34  	"v2kkImm8",
    35  	"v31ResultInArg0",
    36  	"v3kvResultInArg0",
    37  	"vfpv",
    38  	"vfpkv",
    39  	"vgpvImm8",
    40  	"vgpvImm",
    41  	"vgpImm8",
    42  	"vgpImm",
    43  	"v2kvImm8",
    44  	"vkvload",
    45  	"v21load",
    46  	"v31loadResultInArg0",
    47  	"v3kvloadResultInArg0",
    48  	"v2kvload",
    49  	"v2kload",
    50  	"v11load",
    51  	"v11loadImm8",
    52  	"vkvloadImm8",
    53  	"v21loadImm8",
    54  	"v2kloadImm8",
    55  	"v2kkloadImm8",
    56  	"v2kvloadImm8",
    57  	"v31ResultInArg0Imm8",
    58  	"v31loadResultInArg0Imm8",
    59  	"v21ResultInArg0",
    60  	"v21ResultInArg0Imm8",
    61  	"v31x0AtIn2ResultInArg0",
    62  	"v2kvResultInArg0",
    63  }
    64  
    65  var arm64RegInfoKeys = []string{
    66  	"v11",
    67  	"v11Imm",
    68  	"v11ImmIn1",
    69  	"v11Scalar",
    70  	"v11ScalarImmIn1",
    71  	"v21",
    72  	"v21Imm",
    73  	"v31ResultInArg0",
    74  	"vgpImmIn1",
    75  	"vgpvResultInArg0ImmOutIn0",
    76  	"vfpvResultInArg0ImmOutIn1",
    77  	"v11Long",
    78  	"v11Narrow",
    79  	"v11ImmNarrow",
    80  	"v11ImmLong",
    81  	"v21Long",
    82  	"v11Long2",
    83  	"v21Narrow2",
    84  	"v21ImmNarrow2",
    85  	"v11ImmLong2",
    86  	"v21Long2",
    87  	"v21List",
    88  	"v31ResultInArg0List",
    89  }
    90  
    91  var amd64RegInfoSet = map[string]bool{
    92  	"v11": true, "v21": true, "v2k": true, "v2kv": true, "v2kk": true, "vkv": true, "v31": true, "v3kv": true, "vgpv": true, "vgp": true, "vfpv": true, "vfpkv": true,
    93  	"w11": true, "w21": true, "w2k": true, "w2kw": true, "w2kk": true, "wkw": true, "w31": true, "w3kw": true, "wgpw": true, "wgp": true, "wfpw": true, "wfpkw": true,
    94  	"wkwload": true, "v21load": true, "v31load": true, "v11load": true, "w21load": true, "w31load": true, "w2kload": true, "w2kwload": true, "w11load": true,
    95  	"w3kwload": true, "w2kkload": true, "v31x0AtIn2": true,
    96  }
    97  
    98  var arm64RegInfoSet = map[string]bool{
    99  	"v11":                 true,
   100  	"v21":                 true,
   101  	"v21Imm":              true,
   102  	"v31":                 true,
   103  	"vgp":                 true,
   104  	"vgpv":                true,
   105  	"vfpv":                true,
   106  	"v11ImmIn1":           true,
   107  	"v11Long":             true,
   108  	"v11Narrow":           true,
   109  	"v11ImmNarrow":        true,
   110  	"v11ImmLong":          true,
   111  	"v21Long":             true,
   112  	"v11Long2":            true,
   113  	"v21Narrow2":          true,
   114  	"v21ImmNarrow2":       true,
   115  	"v11ImmLong2":         true,
   116  	"v21Long2":            true,
   117  	"v21List":             true,
   118  	"v31ResultInArg0List": true,
   119  }
   120  
   121  // arm64Arrangements contains the SIMD arrangement suffixes for ARM64 NEON.
   122  // These correspond to the ARNG_* constants in cmd/internal/obj/arm64/a.out.go.
   123  var arm64Arrangements = []string{
   124  	"8B", "16B", "1D", "4H", "8H", "2S", "4S", "2D", "1Q", "B", "H", "S", "D",
   125  }
   126  
   127  const amd64RegInfoParams = "v11, v21, v2k, vkv, v2kv, v2kk, v31, v3kv, vgpv, vgp, vfpv, vfpkv, w11, w21, w2k, wkw, w2kw, w2kk, w31, w3kw, wgpw, wgp, wfpw, wfpkw,\n\twkwload, v21load, v31load, v11load, w21load, w31load, w2kload, w2kwload, w11load, w3kwload, w2kkload, v31x0AtIn2 regInfo"
   128  
   129  const arm64RegInfoParams = "v11, v21, v31, vgp, vgpv, vfpv regInfo"
   130  
   131  const amd64GeneratedHeader = `// Code generated by 'simdgen -o godefs -goroot $GOROOT -arch amd64 -xedPath $XED_PATH go_amd64.yaml types.yaml categories.yaml'; DO NOT EDIT.
   132  `
   133  
   134  const arm64GeneratedHeader = `// Code generated by 'simdgen -o godefs -goroot $GOROOT -arch arm64 -arm64Path $ARM64_ISA_PATH go_arm64.yaml types.yaml categories.yaml'; DO NOT EDIT.
   135  `
   136  
   137  // GetArchInfo returns architecture-specific information based on the target architecture.
   138  func GetArchInfo(arch string) (ArchInfo, error) {
   139  	switch arch {
   140  	case "amd64":
   141  		return ArchInfo{
   142  			Arch:            "amd64",
   143  			ArchUpper:       "AMD64",
   144  			ObjArch:         "x86",
   145  			RegInfoKeys:     amd64RegInfoKeys,
   146  			RegInfoSet:      amd64RegInfoSet,
   147  			RegInfoParams:   amd64RegInfoParams,
   148  			GeneratedHeader: amd64GeneratedHeader,
   149  		}, nil
   150  	case "arm64":
   151  		return ArchInfo{
   152  			Arch:            "arm64",
   153  			ArchUpper:       "ARM64",
   154  			ObjArch:         "arm64",
   155  			RegInfoKeys:     arm64RegInfoKeys,
   156  			RegInfoSet:      arm64RegInfoSet,
   157  			RegInfoParams:   arm64RegInfoParams,
   158  			GeneratedHeader: arm64GeneratedHeader,
   159  			Arrangements:    arm64Arrangements,
   160  		}, nil
   161  	default:
   162  		return ArchInfo{}, fmt.Errorf("unsupported architecture: %s", arch)
   163  	}
   164  }
   165  
   166  // CurrentArch returns the ArchInfo for the current FlagArch setting.
   167  func CurrentArch() ArchInfo {
   168  	info, err := GetArchInfo(*FlagArch)
   169  	if err != nil {
   170  		panic(err)
   171  	}
   172  	return info
   173  }
   174  

View as plain text