在前面的文章中已经介绍过,lcc中跟硬件平台相关的配置由src中*.md配置,本文以x86为例,详解这一部分的工作机制。
熟悉汇编的同学都知道32位x86机器有八个通用寄存器:
eax ebx ecx edx esi edi esp ebp
而ebp和esp两个寄存器是有固定作用的,其保存的帧指针和栈指针是组成栈帧的基本组成部分,所以这两个寄存器不参与分配。
所以参与分配的通用寄存器只有六个,lcc用枚举将这两个寄存器编号:
enum { EAX=0, ECX=1, EDX=2, EBX=3, ESI=6, EDI=7 };
在x86.md的最下面是一个Interface结构体的填充,关于Interface结构体中字段的详细作用,请看这里。
其代码如下:
Interface x86IR = {
1, 1, 0, /* char */
2, 2, 0, /* short */
4, 4, 0, /* int */
4, 4, 0, /* long */
4, 4, 0, /* long long */
4, 4, 1, /* float */
8, 4, 1, /* double */
8, 4, 1, /* long double */
4, 4, 0,