
Сообщение от
Hunta
Да да, видно
Об том и речь. Нет разницы, какой вариант C компилируется, "ванильный" или "правильный" - архитектура LLVM настолько заточена под современные реалии, что сделать на базе LLVM нормальный кросс-компилятор для PDP-11 весьма непросто.
Для примера. Самый простенький и невинный (по затратам на преодоление) затык с LLVM возникает из-за того, что весь движок LLVM построен в априорном предположении, будто индексная адресация выгоднее автоинкрементной.
Чтобы заставить LLVM использовать автоинкрементную адресацию в нулевом базовом блоке - нужно изменить относительно немного кода компилятора и результат компиляции такой:
Код:
extern "C" void post_5ac( int x, int *pi16 )
{
*pi16++ = x;
*pi16++ = x;
*pi16++ = x;
}
Код:
.globl post_5ac ; -- Begin function post_5ac
post_5ac: ; @post_5ac
; BB#0: ; %entry
Mov R0, (R1)+
Mov R0, (R1)+
Mov R0, (R1)
Return
; -- End function
Но чтобы заставить LLVM использовать автоинкрементную адресацию в нескольких базовых блоках подряд - нужно полностью переделать весьма большой кусок компилятора, на что у меня пока запала нет. А без этого результат плачевен:
Код:
extern "C" int post_6a( int x, int *pi16 )
{
x |= *pi16++;
x |= *pi16++;
x |= *pi16++;
if( !x )
{
x += *pi16++;
x += *pi16++;
x += *pi16++;
}
else
{
x -= *pi16++;
x -= *pi16++;
x -= *pi16++;
}
return x;
}
Код:
.globl post_6a ; -- Begin function post_6a
post_6a: ; @post_6a
; BB#0: ; %entry
Mov R1, R2
BiS (R2)+, R0
BiS (R2)+, R0
BiS (R2)+, R0
Tst R0
BEq .LBB0_2
; BB#1: ; %if.else
SUB (R2), R0
SUB 8(R1), R0
SUB 10(R1), R0
Br .LBB0_3
.LBB0_2: ; %if.then
ADD (R2), R0
ADD 8(R1), R0
ADD 10(R1), R0
.LBB0_3: ; %if.end
Return
; -- End function