Pull to refresh
287
-0.1
Владимир @32bit_me

Программист

Send message
Ну не знаю, я особых сложностей не вижу, если честно.
Разберите сразу обе команды, например.
В конечном итоге, если в вашем процессоре доступ к элементу массива вообще как-то осуществляется, т.е сущ-вует соответствующая последовательность команд, вы можете просто вручную (в смысле, своим кастомным кодом) заменять пару getelementptr/load этой последовательностью.
Я всё равно не понимаю, чем это отличается от стандарной схемы.
Например, код на с:

//сумма эл-тов массива
int foo(int arr[10]) {
  int sum = 0;
  for(int i = 0; i < 10; ++i) {
    sum += arr[i];
  }
  return sum;
}

Код на LLVM IR: (служебная информация опущена)
`
entry:
br label %for.body

for.cond.cleanup:; preds = %for.body
ret i32 %add

for.body:; preds = %for.body, %entry
%indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
%sum.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
%arrayidx = getelementptr inbounds i32, i32 %arr, i64 %indvars.iv
%0 = load i32, i32
%arrayidx, align 4, !tbaa !1
%add = add nsw i32 %0, %sum.06
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond = icmp eq i64 %indvars.iv.next, 10
br i1 %exitcond, label %for.cond.cleanup, label %for.body
}
Видно, что доступ к элементам массива происходит через gelelementptr/load Код на асме ARM:
foo: # foo

BB#0: # %entry
mov r2, 0
mov r3, 0

LBB0_1: # %for.body

=>This Inner Loop Header: Depth=1
mov r4, r1
add r4, r2
ldw r0, 0(r4)
add r0, r3
addi    r2, 4
mov r3, r0
jeqi    r2, 40 goto LBB0_2
jmp LBB0_1

LBB0_2: # %for.cond.cleanup
ret
`

Доступ к элементам массива происходит через индексный регистр r4. Никаких проблем нет.

(парсер хабра что-то чудит с разметкой, но вроде всё понятно)
То есть индексный регистр + смещение = адрес ячейки, я правильно понял?
Никаких проблем здесь нет. Аргументы инструкции getelementptr можно привести к такому виду без особых проблем. Они как бы к такому виду и приводятся обычно, т. к. в большинстве стандартных архитектур адрес и задаётся как индексный регистр+ смещение.
Я не знаю Rust, увы, может быть, там не указателей с точки зрения пользователя, но на всякий случай попробуйте скомпилировать какую-либо тестовую программу в LLVM IR. Что-то мне подсказывает, что там будут и указатели, и всё вот это.
Ну хорошо, а каким образом в вашей архитектуре происходит доступ к элементу массива?
Не нужно также забывать, что в языке С указатели не просто есть, они составляют основу языка, и с этим придётся смириться.
Вы именно ошибаетесь.
Для обращения по индексу в LLVM служит инструкция getelementptr, которая возвращает указатель, получая в качестве аргументов базовый указатель и индексы.
В обычных случаях она преобразуется в сложения и умножения очевидным образом, но при желании её можно обработать как угодно.
Спасибо, внёс дополнение в текст.
Да, и даже такие проекты существуют. Не знаю, насколько они закончены и сколько там багов, но на гитхабе я видел.
Вот это интересно, не знал.
Спасибо, послушаю.
Проблемы алиасинга, даже не слышал, если честно. Буду рад узнать, что это такое.
Часы на FPGA из огурцов:

И ни слова об академике Семихатове!
Прекрасная штука. Следует добавить, что у него 3 байта памяти, 1 регистр общего назначения и аккумулятор.
После вашего форума и вашей конторы нужно руки с мылом мыть.
Дододо. У меня нет желания с вами тут дискутировать.
По факту вы не модерируете форум, и ваш техдиректор очень неумный человек, так скажем.
Про российские не слышал, если честно, рад, если разрабатывают. Я думаю, оба варианта (процессор с ПЛИС и ПЛИС с процессором) найдут свои применения.

Information

Rating
Does not participate
Date of birth
Registered
Activity