アセンブラ談義

汎用コンテナの所まで後ずさりしてLLVMをやってる。

Blackfinを改造してこんなコードを吐かせた。

.file "t2.bc"
.text
.globl _main
.align 4
.type _main,@function
_main: // @main
// BB#0:
sp += -24;
LIMMimm7p(p0,0); //(゚Д゚)ハァ?
LIMMimm7p(p1,-3); //(゚Д゚)ハァ?
[sp + 20] = p0;
LIMMimm7p(p2,5); //(゚Д゚)ハァ?
[sp + 16] = p1;
[sp + 12] = p2;
r0 = [sp + 16];
r0 += 5;
[sp + 8] = r0;
r0 = [sp + 12];
r1 = [sp + 16];
r0 = r0 & r1;
[sp + 8] = r0;
r0 = [sp + 12];
r1 = [sp + 16];
r0 = r0 ^ r1;
[sp + 8] = r0;
r0 = [sp + 12];
LIMMimm7(r1,16); //デフォルトはp1だった
ADDpimm32(r1,sp,r1); //・・・アレ?
r1.l = w[r1];
r0 = lshift r0 by r1.l;
[sp + 8] = r0;
r0 = [sp + 12];
r1 = [sp + 16];
r0 *= r1;
[sp + 8] = r0;
r0 = [sp + 12];
r1 = p2;
r0 *= r1;
LIMMimm7p(p1,10); //(゚Д゚)ハァ?
r1 = r0;
r1 += 7;
[sp + 8] = r0;
r0 = p1;
cc = r1 < r0;
[sp + 8] = r1;
if cc jump .BB0_2;
jump .BB0_1;
// BB#1:
[sp + 8] = p1;
jump .BB0_3;
.BB0_2:
[sp + 8] = p0;
.BB0_3:
LIMMimm7(r0,16); //デフォルトはp0
ADDpimm32(p0,sp,r0);
[sp + 4] = p0;
r0 = [sp + 8];
r1 = [sp + 16];
r0 = r1 + r0;
[sp + 16] = r0;
p0 = [sp + 4];
r0 = [p0];
sp += 24;
rts;
"`(0":
.size _main, "`(0"-_main


所々修正すべき箇所があるんだよなぁ・・


追記:最初の方のLIMMは直った。