LINUX.ORG.RU

Как из двух аргументов i32 Си функции сделать i64?

 , ,


0

2

Пытаюсь сделать int64 для JS через WASM, родил вариант через memory https://wasdk.github.io/WasmFiddle/?enoel

void add(unsigned long long *first) {
   unsigned long long v0 = first[0];
   unsigned long long v1 = first[1];
   
   first[2] = v0 + v1;
}

Но думаю проще сразу передавать i32, но как их эффективнее соединить в i64? Т.е. нужно что-то такое:

void add(long l0, long h0, long l1, long h1, long long *result) {
    long long v0 = *((long long*)argc[0])
    long long v1 = *((long long*)argc[2])

    *result = v0 + v1;
}
★★★★★

Последнее исправление: foror (всего исправлений: 3)
Ответ на: комментарий от Vit

А как мне в JS хранить 64 битное целое число, а затем передавать его в add функцию на васме? Float64Array подойдет для этого? Других 64-х битных типизированных массивом там нет, поэтому я храню его в Int32Array... Или я что-то не понимаю.

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 3)
Ответ на: комментарий от foror

Тебе 56 бит не хватит и надо именно 64? Тогда только пополам бить.

Если будешь через кусок памяти данные гонять - учти что в яваскрипте порядок байт может быть разный, а у wasm он всегда LE.

Vit ★★★★★
()

на подобие того, как в сделаны LOWORD HIWORD и MAKELONG макросы в венде?

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

Может тебе ecmascripten тогда взять? У него рантайм есть, который благополучно скроет от тебя кучу всяких нюансов. Напрямую в webassembly лезут только извращенцы вроде меня, в познавательных целях.

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

Развлекаться - дело хорошее. Учти, что тебя ждет много удивительных открытий. LLVM пока временами выпиливает блоки кода. А emscripten иногда валит труху в заголовок, и ставит минимально возможный лимит памяти 16 мегов.

https://github.com/nodeca/multimath - позырь тут мейкфайл, может сэкономишь немного времени и нервов. Ну и в обертке там комментарии проставлены.

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

А ты смотрел в npm всякие bigint и т.п.? Тему про 64 и более длинные инты под нодой уже основательно перепахали. И, честно говоря, по-моему там уже достаточно хорошо и нет смысла на wasm перегонять (кроме личного желания).

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

Да, смотрел, даже выше ссылку кинул на GWT реализацию - одну из самых шустрых. Мне просто не нравится, что для хранения 64 битного числа используют 3 числа по 64 бита, да еще всякие мудреные операции над ними производят, мало ли где ошибка закрадется, тут же деньги (я работаю над аналогом 1С), а не лайки или просмотры на ютьюбе.

Вообще, 64 бита на 2 стадии из 4 в предложениях по 2018 стандарту, так что может к моему времени и не понадобится пилить на васме эмуляцию...

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от foror

Дык ты на жабу кинул, а я тебе предлагал на жабаскрипте посмотреть. Там штуки три точно есть условно вменяемых. Возможно, тебе будет проще PR заслать с улучшениями.

Просто если у тебя только арифметика для 64бит, то в wasm смысла мало. А если бесконечная точность по основанию 10 - упаришься свой лисапед тестировать, проще готовое.

Но если чо - ссылку на рыбы под wasm я дал, равлекайсо. Через пару неделек комрады допортируют код на сишечку и распишу инструкции получше.

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

Если любишь докер, можешь отсюда отковырять скрипты https://github.com/nodeca/pica/pull/86

В принципе мне LLVM больше нравится, но надо евоный WAST глазами смотреть, что он код не убил в угаре оптимизации.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от lovesan

Попробую этот вариант, по производительности он сильно будет отличаться от приведения указателя к int64?

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от lovesan
 mov    rax,QWORD PTR [rdi+0x8]
 add    rax,QWORD PTR [rdi]
 mov    QWORD PTR [rdi+0x10],rax
 ret    

vs

 shl    rsi,0x20
 shl    rcx,0x20
 and    rsi,rdi
 and    rdx,rcx
 lea    rdi,[rsi+rdx*1]
 mov    QWORD PTR [r8],rdi
 ret    
foror ★★★★★
() автор топика
Ответ на: комментарий от foror

Ну это копейки по производительности. А вот endianness ты не можешь гаранитировать.

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

А нормальные люди делают так

и получают ноль. а вообще, тред с самого начала не задался.

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