Let me explain the meaning of the two new terms: Front End and Back End.
If we put it simpler, the CPU is a complex made of a core and a memory subsystem, which has already been isolated into an individual block. The processor core can be represented as a combination of two unit blocks: Frond End and Back End. Note that the first block is responsible for providing the second block with the data for processing in time. And the Back End block is a group of the processor execution units in the broadest meaning of this word. In other words, it is exactly the part of the CPU that does all the “thinking” plus the auxiliary logics. This way, each processor subsystem has its own goals: memory Subsystem delivers the data from the memory to the processor, Front End rearranges this data in a certain way and then sends to Back End, which does all the processing. There is a special group of units that are responsible for making the proper data ready for further processing, for “predicting” as precisely as possible which way the next branch will go. So it is not just a purely auxiliary function on the one hand, but a very important mission: to create the best working conditions for all other units in the CPU to work with their maximum efficiency.
So, it would make perfect sense to discuss all the units keeping in mind this logical classification.
Let’s start with Back End units block. As I have already said, these are the functional units and the appropriate managing logics. If we take a look at the scheme above, we will see that there are five functional execution units, each of which performs its own operations. Three units of the five (two fast ALU units and one slow ALU) deal with fixed-point operations, and the remaining two – with floating-point operations. All these units are connected to the logics units preparing data for them, sending operands, reading data from registers, i.e. that are doing all the preliminary work for further calculations.
To illustrate this statement let me offer you one example. What do we need to increase the contents of some “A” register by 1? We need to make sure the following operations are performed:
- Take the contents of “A” register.
- Take 1.
- Send both numbers and the operation code (“addition”, “increase”) to the execution unit.
- Perform addition.
- Save the result.
You can notice that the functional units are actually performing only one operation: the fourth one in the list above. All preparations such as data transfer are carried out by the managing logics unit servicing the execution block. The functional units in our example receive the numbers, receive the operation code (“add”, “subtract”, “change the sign”), perform the operation and produce the result, which is a number, too. They are certainly very important, but they are helpless without the managing logics.
Now let’s bring up a more complicated example. Say, we have two tasks. The first task is to add the contents of registers “A” and “B”. and the second task is to increase the contents of register ”C” by 1.