Creating Our Own Fibers 98 but require some operations to be handled by software that could be directly handled by the hardware in a CISC architecture. The x86-64 instruction set we'll focus on is an example of a CISC architecture. To add a little complexity (you know, it's not fun if it's too easy), there are different names that refer to the same ISA. For example, the x86-64 instruction set is also referred to as the AMD64 instruction set and the Intel 64 instruction set, so no matter which one you encounter, just know that they refer to the same thing. In our book, we'll simply call it the x86-64 instruction set. Tip To find the architecture on your current system, run one of the following commands in your terminal: On Linux and Mac OS: arch or uname-m On Windows Power Shell: $env:PROCESSOR_ARCHITECTURE On Windows Command Prompt: echo %PROCESSOR_ARCHITECTURE% The instruction set just defines how a program can interface with the CPU. The concrete implementation of an ISA can vary between different manufacturers, and a specific implementation is referred to as a CPU architecture, such as Intel Core processors. However, in practice, these terms are often used interchangeably since they all perform the same functions from a programmer's perspective and there is seldom a need to target a specific implementation of an ISA. The ISA specifies the minimum set of instructions the CPU must be able to execute. Over time, there have been extensions to this instruction set, such as Streaming SIMD Extensions (SSE), that add more instructions and registers that programmers can take advantage of. For the examples in this chapter, we will target the x86-64 ISA, a popular architecture used in most desktop computers and servers today. So, we know that a processor architecture presents an interface that programmers can use. Operating system implementors use this infrastructure to create operating systems. Operating systems such as Windows and Linux define an ABI that specifies a set of rules that the programmer has to adhere to for their programs to work correctly on that platform. Examples of operating system ABI's are System V ABI (Linux) and Win64 (Windows). The ABI specifies how the operating system expects a stack to be set up, how you should call a function, how you create a file that will load and run as a program, the name of the function that will be called once the program has loaded, etc. A very important part of the ABI that operating systems must specify is its calling convention. The calling convention defines how the stack is used and how functions are called. Let's illustrate this with an example of how Linux and Windows handle arguments to a function on x86-64; for example, a function with a signature such as fn foo(a: i64, b: i64).