LINUX.ORG.RU

Арифметические/логические операции в sbcl

 , , мировые открытия


1

1

Вот мне интересно, как sbcl проводит арифметические и логические операции. Вот как я себе это представляю:

1. Объявляются эти самые «known» функции в compiler/fndb.lisp

2. В compiler/target/float.lisp и compiler/target/arith.lisp определяются эти самые vop'ы для арифметических/логических операций.

3. При компиляции некоей функции, которая что-то, скажем, складывает, подставляется подходящий vop, или если это сделать нельзя, вызывается «generic-» функция, например generic-+ или generic-*. (как этот выбор происходит мне что-то не ясно)

4. В assembly/target/arith.lisp определяется эта «generic-» функция (которая на самом деле некая непонятная мне сущность assembly-routine). В ней происходит проверка (это уже в realtime), является ли аргуметы fixnum'ами. Если да, то операция проходит быстро (буквально в одну инструкцию) + возможный апгрейд до bignum.

5. Если хоть один операнд не fixnum, вызывается «статическая функция» two-arg-whatever, например two-arg-+. Они определены в code/numbers.lisp. В этом же файле определены «лисповые» арифметические функции. В «two-args-» происходит диспетчеризация по типам, что-то вроде внутреннего аналога typecase и непосредственно выполняется операция.

Ну вот вопросы такие:

1. Что же такое assembly-routine и в чём отличие от VOP?

2. Как подбирается нужный VOP и когда подставляется «generic-» функция?

3. А если я захочу ввести другой числовой тип (например, те же упакованные значения в SSE), что мне нужно будет дописать, чтобы их можно было складывать с помощью лиспового #'+? Есть что-то ещё кроме vop'ов и two-arg-'ов. Как правильно объявить тип, чтобы он был числовым? В compiler/generic/primtype.lisp вроде нет задания какой-либо иерархии.

4. И вообще про типы: primitive type похоже тоже на что-то для внутреннего использования. Видимо для того, чтобы определить, что значение этого типа может храниться в таких-то storage class'ах. А как объявляются «лисповые» типы?

Я думаю, тут такие спецы по sbcl, что разберутся в нем лучше авторов. Хорошо бы тут dmitry_vk и ловсана видеть, если они тут есть. А может ещё mv


И охреневшие лисперы еще имеют наглость понтоваться «стандартизованностью и открытостью» языка? Да в любой сишке и жабке поведение арифметики описано английским по белому в стандарте. Интересует конкретное поведение GCC или CLang — пожалуйста, все на блюдечке.

А для лиспа, значит, надо кастовать особо упоротых фанбоев, чтобы погадали на кофейной гуще. Ну-ну.

anonymous
()
Ответ на: комментарий от anonymous

И как обычно набежал упоротый петухонимус, чтобы вставить никому ненужные в этом треде свои пять копеек, молодец.

grouzen ★★
()

У ВОПов есть «стоимость» и список принимаемых локейшенов (регистры, етц). Компилятор пробует разные комбинации, пока не подберёт наиболее дешёвую цепочку.

mv ★★★★★
()
Ответ на: комментарий от anonymous

Да в любой сишке и жабке поведение арифметики описано английским по белому в стандарте. Интересует конкретное поведение GCC или CLang — пожалуйста, все на блюдечке.

Ну расскажи, куда в GCC что вписать, чтобы появился int256 и чтобы с ним работала арифметика.

monk ★★★★★
()
Ответ на: комментарий от monk

Ну расскажи, куда в GCC что вписать, чтобы появился int256 и чтобы с ним работала арифметика.

В код программы:

#include <gmpxx.h>

В строку компиляции:

-lgmpxx

anonymous
()
Ответ на: комментарий от anonymous

Не работает

$ cat test-int.c
#include <gmpxx.h>

int main()  
{  
   int128 x = 2;
   int128 y = 123;
   x = x + y;
}


$ gcc -lgmpxx test-int.c 
In file included from test-int.c:1:0:
/usr/include/gmpxx.h:24:18: fatal error: iosfwd: Нет такого файла или каталога
 #include <iosfwd>

monk ★★★★★
()
Ответ на: комментарий от anonymous

Так это ты странный рецепт предложил. В Си gmp операции не переопределяет, а всего лишь добавляет пачку функций.

monk ★★★★★
()
Ответ на: комментарий от monk
#include <iostream>
#include <gmpxx.h>

using namespace std;

typedef mpz_class int256;

int main(int argc, char** argv) {
    int256 x = 1, y = 2;
    x = x + y;
    cout << x << endl;
}
anonymous
()
Ответ на: комментарий от monk

В Си gmp операции не переопределяет, а всего лишь добавляет пачку функций.

Прошу прощения, но где я говорил про Си?

anonymous
()
Ответ на: комментарий от anonymous

Прошу прощения, но где я говорил про Си?

И охреневшие лисперы еще имеют наглость понтоваться «стандартизованностью и открытостью» языка? Да в любой сишке и жабке поведение арифметики описано английским по белому в стандарте. Интересует конкретное поведение GCC или CLang — пожалуйста, все на блюдечке.

Если ты имел в виду Java в GCC, можешь продемонстрировать «на блюдечке» внесение аналогичных изменений (int256) в GCJ.

monk ★★★★★
()
Ответ на: комментарий от monk

Если ты имел в виду Java в GCC

Нет, я не имел в виду Java в GCC.

anonymous
()
Ответ на: комментарий от monk

Тут суть ещё не что куда вписать, а что можно это ещё и налету сделать, сторонней библиотекой. Это я про лисп.

Хотя хз, может что-то может потребовать перекомпиляции всего sbcl.

shamaz
() автор топика
Ответ на: комментарий от shamaz

Хотя хз, может что-то может потребовать перекомпиляции всего sbcl.

не трогай больше вещь, а то и руки порежешь...

yyk ★★★★★
()
Ответ на: комментарий от anonymous

При виде человека, который вставляет приблизительно один и тот же спам в *каждый* комментарий на конкретную тему, у кого на почве этой темы бомбануло пукан становится очевидно.

naryl ★★★★★
()

Анонимус добился своего. shamaz, пошли в чатик, там информационного шума поменьше. Лучше на #lisp @ Freenode, если можешь в английский.

naryl ★★★★★
()
Ответ на: комментарий от naryl

БОМБАНУЛО БОМБАНУЛО БОМБАНУЛО БУГУРТ ОЛОЛО

И это всё, что ты можешь ответить на аргументированные претензии? Лисперы такие лисперы.

anonymous
()
Ответ на: комментарий от naryl

там информационного шума поменьше

А, так для тебя аргументированные претензии — всего-навсего «информационный шум». Тогда все понятно.

Точно так же английская речь будет «информационным шумом» для людоеда из племени мумбо-юмбо со словарным запасом в 300 слов.

anonymous
()
Ответ на: комментарий от anonymous

И это всё, что ты можешь ответить на аргументированные претензии?

Тот бред информационный шум, которым ты фонтанируешь с завидным постоянством дебила, может принять за аргументы только твои разжиженный мозг гидроцефала.

yyk ★★★★★
()
Ответ на: комментарий от yyk

Не сомневаюсь, что ответ людоеда англичанину был бы примерно таким же.

anonymous
()

Ога, вот про типы: code/class.lisp

shamaz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.