0

我正在试图弄清楚一些 uint32 操作在 16 位 dsPIC 上需要多少个周期。我从按位 AND 开始并编写了以下程序:

int main(void) {
    
    unsigned long var1, var2, var3;
    
    var1 = 80000ul;
    var2 = 190000ul;
    while (1) {
        var3 = var1 & var2;
    }
    var1 = 0;
    return 0;
}

查看反汇编以查看编译器为程序集提出的内容,我得到以下信息:

!        var3 = var1 & var2;
0x2DE: MOV [W14+4], W0
0x2E0: MOV [W14+6], W1
0x2E2: MOV.D [W14], W2
0x2E4: MOV W2, W4
0x2E6: MOV W3, W2
0x2E8: MOV W0, W3
0x2EA: MOV W1, W0
0x2EC: AND W4, W3, W4
0x2EE: AND W2, W0, W0
0x2F0: CLR W1
0x2F2: SL W0, #0, W1
0x2F4: MOV #0x0, W0
0x2F6: MOV.D W0, W2
0x2F8: MUL.UU W4, #1, W0
0x2FA: IOR W2, W0, W2
0x2FC: IOR W3, W1, W3
0x2FE: MOV W2, [W14+8]
0x300: MOV W3, [W14+10]

20 个周期,6 个 I/O 移动和 14 个内核。这对我来说看起来很疯狂。难道就不能这样做吗?

MOV.D [W14+4], W0
MOV.D [W14], W2
AND W0, W2, W0
AND W1, W3, W1
MOV.D W0, [W14+8]

这将核心周期降至 2,这至少对我来说是合乎逻辑的(2 个 16 位宽的 AND)。我不明白的编译器是什么?

4

0 回答 0