Date: Sat, 1 Apr 2023 17:00:40 +0100
Link to GodBolt:
https://godbolt.org/z/vjdcWqhKW
Here's the code copy-pasted:
void Func(_BitInt(127) *const parg)
{
*parg += 73;
}
#include <iostream>
int main(void)
{
_BitInt(16) i;
std::cout << typeid(i * i).name() << std::endl;
short j;
std::cout << typeid(j * j).name() << std::endl;
}
Note that the function, 'Func', takes a 127-Bit number rather than
128-Bit, and here's the x86_64 assembler for it. The third and fourth
lines are where it gets bitwise-AND'ed to wipe out the high bit:
Func:
add QWORD PTR [rdi],0x49
mov rax,QWORD PTR [rdi+0x8]
adc rax,0x0
movabs rcx,0x7fffffffffffffff
and rcx,rax
mov QWORD PTR [rdi+0x8],rcx
ret
xchg ax,ax
I don't know what that last line is doing there after the function has
returned, by anyway moving on. . .
The short program above prints:
DB16_
i
so this tells me that 'short' is a 16-Bit type that gets promoted to
int, and that '_BitInt(16)' is a 16-Bit type that doesn't get
promoted.
https://godbolt.org/z/vjdcWqhKW
Here's the code copy-pasted:
void Func(_BitInt(127) *const parg)
{
*parg += 73;
}
#include <iostream>
int main(void)
{
_BitInt(16) i;
std::cout << typeid(i * i).name() << std::endl;
short j;
std::cout << typeid(j * j).name() << std::endl;
}
Note that the function, 'Func', takes a 127-Bit number rather than
128-Bit, and here's the x86_64 assembler for it. The third and fourth
lines are where it gets bitwise-AND'ed to wipe out the high bit:
Func:
add QWORD PTR [rdi],0x49
mov rax,QWORD PTR [rdi+0x8]
adc rax,0x0
movabs rcx,0x7fffffffffffffff
and rcx,rax
mov QWORD PTR [rdi+0x8],rcx
ret
xchg ax,ax
I don't know what that last line is doing there after the function has
returned, by anyway moving on. . .
The short program above prints:
DB16_
i
so this tells me that 'short' is a 16-Bit type that gets promoted to
int, and that '_BitInt(16)' is a 16-Bit type that doesn't get
promoted.
Received on 2023-04-01 16:00:51