github.com/Rookout/GoSDK@v0.1.48/pkg/services/assembler/internal/sys/arch.go (about)

     1  // Copyright 2016 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.assembler file.
     4  
     5  package sys
     6  
     7  import "encoding/binary"
     8  
     9  
    10  
    11  type ArchFamily byte
    12  
    13  const (
    14  	NoArch ArchFamily = iota
    15  	AMD64
    16  	ARM
    17  	ARM64
    18  	I386
    19  	Loong64
    20  	MIPS
    21  	MIPS64
    22  	PPC64
    23  	RISCV64
    24  	S390X
    25  	Wasm
    26  )
    27  
    28  
    29  type Arch struct {
    30  	Name   string
    31  	Family ArchFamily
    32  
    33  	ByteOrder binary.ByteOrder
    34  
    35  	
    36  	
    37  	PtrSize int
    38  
    39  	
    40  	RegSize int
    41  
    42  	
    43  	MinLC int
    44  
    45  	
    46  	
    47  	
    48  	
    49  	Alignment int8
    50  
    51  	
    52  	
    53  	
    54  	CanMergeLoads bool
    55  
    56  	
    57  	
    58  	CanJumpTable bool
    59  
    60  	
    61  	
    62  	HasLR bool
    63  
    64  	
    65  	
    66  	
    67  	
    68  	
    69  	
    70  	FixedFrameSize int64
    71  }
    72  
    73  
    74  
    75  func (a *Arch) InFamily(xs ...ArchFamily) bool {
    76  	for _, x := range xs {
    77  		if a.Family == x {
    78  			return true
    79  		}
    80  	}
    81  	return false
    82  }
    83  
    84  var Arch386 = &Arch{
    85  	Name:           "386",
    86  	Family:         I386,
    87  	ByteOrder:      binary.LittleEndian,
    88  	PtrSize:        4,
    89  	RegSize:        4,
    90  	MinLC:          1,
    91  	Alignment:      1,
    92  	CanMergeLoads:  true,
    93  	HasLR:          false,
    94  	FixedFrameSize: 0,
    95  }
    96  
    97  var ArchAMD64 = &Arch{
    98  	Name:           "amd64",
    99  	Family:         AMD64,
   100  	ByteOrder:      binary.LittleEndian,
   101  	PtrSize:        8,
   102  	RegSize:        8,
   103  	MinLC:          1,
   104  	Alignment:      1,
   105  	CanMergeLoads:  true,
   106  	CanJumpTable:   true,
   107  	HasLR:          false,
   108  	FixedFrameSize: 0,
   109  }
   110  
   111  var ArchARM = &Arch{
   112  	Name:           "arm",
   113  	Family:         ARM,
   114  	ByteOrder:      binary.LittleEndian,
   115  	PtrSize:        4,
   116  	RegSize:        4,
   117  	MinLC:          4,
   118  	Alignment:      4, 
   119  	CanMergeLoads:  false,
   120  	HasLR:          true,
   121  	FixedFrameSize: 4, 
   122  }
   123  
   124  var ArchARM64 = &Arch{
   125  	Name:           "arm64",
   126  	Family:         ARM64,
   127  	ByteOrder:      binary.LittleEndian,
   128  	PtrSize:        8,
   129  	RegSize:        8,
   130  	MinLC:          4,
   131  	Alignment:      1,
   132  	CanMergeLoads:  true,
   133  	CanJumpTable:   true,
   134  	HasLR:          true,
   135  	FixedFrameSize: 8, 
   136  }
   137  
   138  var ArchLoong64 = &Arch{
   139  	Name:           "loong64",
   140  	Family:         Loong64,
   141  	ByteOrder:      binary.LittleEndian,
   142  	PtrSize:        8,
   143  	RegSize:        8,
   144  	MinLC:          4,
   145  	Alignment:      8, 
   146  	CanMergeLoads:  false,
   147  	HasLR:          true,
   148  	FixedFrameSize: 8, 
   149  }
   150  
   151  var ArchMIPS = &Arch{
   152  	Name:           "mips",
   153  	Family:         MIPS,
   154  	ByteOrder:      binary.BigEndian,
   155  	PtrSize:        4,
   156  	RegSize:        4,
   157  	MinLC:          4,
   158  	Alignment:      4,
   159  	CanMergeLoads:  false,
   160  	HasLR:          true,
   161  	FixedFrameSize: 4, 
   162  }
   163  
   164  var ArchMIPSLE = &Arch{
   165  	Name:           "mipsle",
   166  	Family:         MIPS,
   167  	ByteOrder:      binary.LittleEndian,
   168  	PtrSize:        4,
   169  	RegSize:        4,
   170  	MinLC:          4,
   171  	Alignment:      4,
   172  	CanMergeLoads:  false,
   173  	HasLR:          true,
   174  	FixedFrameSize: 4, 
   175  }
   176  
   177  var ArchMIPS64 = &Arch{
   178  	Name:           "mips64",
   179  	Family:         MIPS64,
   180  	ByteOrder:      binary.BigEndian,
   181  	PtrSize:        8,
   182  	RegSize:        8,
   183  	MinLC:          4,
   184  	Alignment:      8,
   185  	CanMergeLoads:  false,
   186  	HasLR:          true,
   187  	FixedFrameSize: 8, 
   188  }
   189  
   190  var ArchMIPS64LE = &Arch{
   191  	Name:           "mips64le",
   192  	Family:         MIPS64,
   193  	ByteOrder:      binary.LittleEndian,
   194  	PtrSize:        8,
   195  	RegSize:        8,
   196  	MinLC:          4,
   197  	Alignment:      8,
   198  	CanMergeLoads:  false,
   199  	HasLR:          true,
   200  	FixedFrameSize: 8, 
   201  }
   202  
   203  var ArchPPC64 = &Arch{
   204  	Name:          "ppc64",
   205  	Family:        PPC64,
   206  	ByteOrder:     binary.BigEndian,
   207  	PtrSize:       8,
   208  	RegSize:       8,
   209  	MinLC:         4,
   210  	Alignment:     1,
   211  	CanMergeLoads: false,
   212  	HasLR:         true,
   213  	
   214  	
   215  	FixedFrameSize: 4 * 8,
   216  }
   217  
   218  var ArchPPC64LE = &Arch{
   219  	Name:           "ppc64le",
   220  	Family:         PPC64,
   221  	ByteOrder:      binary.LittleEndian,
   222  	PtrSize:        8,
   223  	RegSize:        8,
   224  	MinLC:          4,
   225  	Alignment:      1,
   226  	CanMergeLoads:  true,
   227  	HasLR:          true,
   228  	FixedFrameSize: 4 * 8,
   229  }
   230  
   231  var ArchRISCV64 = &Arch{
   232  	Name:           "riscv64",
   233  	Family:         RISCV64,
   234  	ByteOrder:      binary.LittleEndian,
   235  	PtrSize:        8,
   236  	RegSize:        8,
   237  	MinLC:          4,
   238  	Alignment:      8, 
   239  	CanMergeLoads:  false,
   240  	HasLR:          true,
   241  	FixedFrameSize: 8, 
   242  }
   243  
   244  var ArchS390X = &Arch{
   245  	Name:           "s390x",
   246  	Family:         S390X,
   247  	ByteOrder:      binary.BigEndian,
   248  	PtrSize:        8,
   249  	RegSize:        8,
   250  	MinLC:          2,
   251  	Alignment:      1,
   252  	CanMergeLoads:  true,
   253  	HasLR:          true,
   254  	FixedFrameSize: 8, 
   255  }
   256  
   257  var ArchWasm = &Arch{
   258  	Name:           "wasm",
   259  	Family:         Wasm,
   260  	ByteOrder:      binary.LittleEndian,
   261  	PtrSize:        8,
   262  	RegSize:        8,
   263  	MinLC:          1,
   264  	Alignment:      1,
   265  	CanMergeLoads:  false,
   266  	HasLR:          false,
   267  	FixedFrameSize: 0,
   268  }
   269  
   270  var Archs = [...]*Arch{
   271  	Arch386,
   272  	ArchAMD64,
   273  	ArchARM,
   274  	ArchARM64,
   275  	ArchLoong64,
   276  	ArchMIPS,
   277  	ArchMIPSLE,
   278  	ArchMIPS64,
   279  	ArchMIPS64LE,
   280  	ArchPPC64,
   281  	ArchPPC64LE,
   282  	ArchRISCV64,
   283  	ArchS390X,
   284  	ArchWasm,
   285  }