Rocket - diplomacy - misaligned

https://mp.weixin.qq.com/s/poCJBcx45clXHm6Uuv8M6w

 

介绍AddressSet.misaligned的实现。之前介绍的比较概括,也有偏差。这里根据实际执行结果,分析总结其功能。

 

 

1. 提取执行

 

misaligned功能比较独立,可以单独提取出来。执行观察运行结果,或者调试跟踪来观察其功能。

其中,需要解决的依赖是log2Floor。

 

执行结果如下:

 

2. 基本功能

 

misaligned的基本功能是把从base开始的size个地址,按照对齐原则,使用最少的基址/掩码对表示。

 

从上面的例子可以看出:

 

1) misaligned(0,4)

 

从0开始的4个地址,可以直接使用两位掩码进行表示,即(0,3=0b11);

 

2) misaligned(1,4)

 

从1开始的4个地址中:

a. 地址1=0b001最大对齐范围是1个地址,所以只能独自作为一个表示(1,0=0b0);

b. 地址2=0b010最大对齐范围是2个地址,由于还有三个地址没表示,可以把这两个地址包含在内,所以可以使用其表示为(2,1=0b1)。包含两个地址,即地址2和地址3;

c.地址4=0b100最大对齐范围就是4个地址,但是size中未表示的还有一个地址,所以只能使用表示(4,0=0b0)表示一个地址,即地址4;

 

3) misaligned(2,4)

 

a. 地址2=0b010最大对齐范围是2个地址,(2, 1=0b1)表示2个地址,即地址2和地址3;

b. 地址4=0b100最大对齐范围是4个地址,但size中未表示的地址还有2个,所以使用(4,1=0b1)表示2个地址,即地址4和地址5;

 

4) misaligned(3,4)

 

a. 地址3=0b011最大对齐范围是1个地址,只能独自使用一个表示(3,1=0b1);

b. 地址4=0b100最大对齐范围是4个地址,但size中未表示的地址还有3个,这3个地址无法使用一个掩码全部表示,所以使用(4,1=0b1)表示2个地址,即地址4和地址5;余下一个地址6另外表示;

c. 地址6=0b110最大地址范围是2个地址,但size中未表示的地址只有1个,所以使用(6,0=0b0)来表示这一个地址,即地址6;

 

3. 简单分析

 

a. 这是一个递归函数,如果size=0,即没有地址需要表示,则直接返回tail;tail中包含已经生成的基址/掩码对表示;

b. maxBaseAlignment表示基址允许的最大对齐地址数(这里取的是base的最低值为1的位);

c. maxSizeAlignment表示size中可以不多不少完整被一个基址/掩码对表示的地址数,这里取最高位。比如6=0b110,需要被分为4个和2个,两次对齐表示;

d. 从两个值中取较小的一个作为这一步向前跨出的地址数(step);

e. base+step:向前跨过step个地址;

f. size-step:地址数减少step个;

g. (base, step-1)作为基址/掩码对加入tail中;

 

posted @ 2019-11-07 22:13  wjcdx  阅读(283)  评论(0编辑  收藏  举报