Загрузка видео...

Не удалось загрузить видео

На главную

I compiled Quake III's fast inverse square root on 64-bit Linux with gcc -O1 and it returned negative numbers. The long cast reads past the float into the stack, and the low bit of the return address ends up in the sign bit.

32,321 просмотров • 9 дней назад •via X (Twitter)

Комментарии: 23

Фото профиля tetsuo
tetsuo9 дней назад

Quake III's Q_rsqrt as shipped, on 64-bit Linux. gcc -O1 q.c -o q && ./q gcc 13 prints -0.499154. clang 18 -O1 prints 0.000000, because reading 8 bytes from a 4-byte float is undefined behavior and clang compiles Q_rsqrt to a single ret. Your result depends on your compiler version.

Фото профиля Frederico Pissarra
Frederico Pissarra9 дней назад

x86-64 SysV ABI? If that is the case `long int` is 64 bits long, not 32... maybe this is the reason. Change `long int` to `int`.

Фото профиля tetsuo
tetsuo9 дней назад

Yep, that's the bug. On x86-64 SysV long is 8 bytes so *(long *)&y reads 4 bytes past y into the stack. The fix is at ~10:30 you went straight to the replies 😄

Фото профиля Frederico Pissarra
Frederico Pissarra9 дней назад

Yep... I've got straight to the replies (sorry!) and watched the video now... as said before, always an AMAZING analysis. I wish I had the patience and skills to do amazing videos like this one!

Фото профиля tetsuo
tetsuo9 дней назад

I'll jump on discord this weekend and give you my work flow.

Фото профиля Frederico Pissarra
Frederico Pissarra9 дней назад

As always, this is an AWESOME analysis...

Фото профиля Traveler
Traveler8 дней назад

Quake III was made in 1999. For 32-bit CPU. So kids, if you think using explicit types like uin32_t,uin64_t,int32_t,int64_t and co is just meaningless old farts fad then you are in a world of pain if you try porting shit from 1981 to 2002 or so (AMD Opteron in 2003 was first x86 compatible 64-bit CPU) to modern day.

Фото профиля X Girls
X Girls9 дней назад

woah 🤯

Фото профиля why
why9 дней назад

A perfect example of code that was “clever” on 32-bit and undefined on 64-bit. `long` being 8 bytes turns that type pun into an out-of-bounds read.

Фото профиля patrick mcqueeny
patrick mcqueeny9 дней назад

interesting! but why?

Фото профиля Andrew
Andrew9 дней назад

Ya ..W/e use like Java script or something

Фото профиля Wow Cool Thanks
Wow Cool Thanks8 дней назад

NOTHING ELSE MATTERS UNLESS STRAFE JUMP GIVES ME ACCELERATION.

Фото профиля MancerAI
MancerAI9 дней назад

I understand this is mostly out of curiosity, so maybe a stupid comment but; doesn't modern CPUs have fast inverse square root built in/as an OP

Фото профиля ai(Key)骆驼
ai(Key)骆驼8 дней назад

Good

Фото профиля ヴァルカン
ヴァルカン8 дней назад

how do you make these vids? cool

Фото профиля Ben
Ben8 дней назад

Yep that one also drove me nuts, genius math in the game.

Фото профиля Time
Time8 дней назад

てつお!元気?何言ってるのか全くわからない😊✨

Фото профиля Necati Demir, PhD
Necati Demir, PhD8 дней назад

Just curious. Did you generate this visualization with Opus 5.5? If so that looks great.

Фото профиля Pollino Geroni
Pollino Geroni9 дней назад

@grok sono ignorante a cosa servirebbe quello che l’Op ha fatto?

Фото профиля A. I. (Macro Photography)🔬
A. I. (Macro Photography)🔬9 дней назад

Magic.

Фото профиля Bill Crowell
Bill Crowell8 дней назад

Impressive. I wonder what the performance would be on an alternate function that uses division.

Фото профиля Charles Waters
Charles Waters9 дней назад

I thought that Quake's version of this code was intended to be fast and 'accurate enough' for the games use, but had known limitations and was probably 8 bit? Maybe 16? I wouldn't expect perfect performance from it.

Фото профиля Orion Night
Orion Night9 дней назад

many such cases. long is 8 bytes on LP64 so the cast reads 4 bytes past the float, straight into whatever junk the frame left there. the magic constant was never the problem, the type punning was

Похожие видео