mirror of
https://github.com/codex-storage/constantine.git
synced 2025-02-11 18:26:22 +00:00
Fix inline assembly and inline __int128 in C++ mode
This commit is contained in:
parent
c8e482f6d2
commit
4b7c6b552e
@ -108,6 +108,14 @@ when sizeof(int) == 8:
|
|||||||
# 3. -
|
# 3. -
|
||||||
# 4. no clobbered registers beside explectly used RAX and RDX
|
# 4. no clobbered registers beside explectly used RAX and RDX
|
||||||
when defined(amd64):
|
when defined(amd64):
|
||||||
|
when defined(cpp):
|
||||||
|
asm """
|
||||||
|
divq %[divisor]
|
||||||
|
: "=a" (`q`), "=d" (`r`)
|
||||||
|
: "d" (`n_hi`), "a" (`n_lo`), [divisor] "rm" (`d`)
|
||||||
|
:
|
||||||
|
"""
|
||||||
|
else:
|
||||||
asm """
|
asm """
|
||||||
divq %[divisor]
|
divq %[divisor]
|
||||||
: "=a" (`*q`), "=d" (`*r`)
|
: "=a" (`*q`), "=d" (`*r`)
|
||||||
@ -118,7 +126,11 @@ when sizeof(int) == 8:
|
|||||||
var dblPrec {.noInit.}: uint128
|
var dblPrec {.noInit.}: uint128
|
||||||
{.emit:[dblPrec, " = (unsigned __int128)", n_hi," << 64 | (unsigned __int128)",n_lo,";"].}
|
{.emit:[dblPrec, " = (unsigned __int128)", n_hi," << 64 | (unsigned __int128)",n_lo,";"].}
|
||||||
|
|
||||||
# Don't forget to dereference the var param
|
# Don't forget to dereference the var param in C mode
|
||||||
|
when defined(cpp):
|
||||||
|
{.emit:[q, " = (NU64)(", dblPrec," / ", d, ");"].}
|
||||||
|
{.emit:[r, " = (NU64)(", dblPrec," % ", d, ");"].}
|
||||||
|
else:
|
||||||
{.emit:["*",q, " = (NU64)(", dblPrec," / ", d, ");"].}
|
{.emit:["*",q, " = (NU64)(", dblPrec," / ", d, ");"].}
|
||||||
{.emit:["*",r, " = (NU64)(", dblPrec," % ", d, ");"].}
|
{.emit:["*",r, " = (NU64)(", dblPrec," % ", d, ");"].}
|
||||||
|
|
||||||
@ -132,7 +144,11 @@ when sizeof(int) == 8:
|
|||||||
var dblPrec {.noInit.}: uint128
|
var dblPrec {.noInit.}: uint128
|
||||||
{.emit:[dblPrec, " = (unsigned __int128)", a," * (unsigned __int128)", b, " + (unsigned __int128)",c,";"].}
|
{.emit:[dblPrec, " = (unsigned __int128)", a," * (unsigned __int128)", b, " + (unsigned __int128)",c,";"].}
|
||||||
|
|
||||||
# Don't forget to dereference the var param
|
# Don't forget to dereference the var param in C mode
|
||||||
|
when defined(cpp):
|
||||||
|
{.emit:[hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
|
{.emit:[lo, " = (NU64)", dblPrec," & ", 1'u64 shl 63 - 1, ";"].}
|
||||||
|
else:
|
||||||
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
{.emit:["*",lo, " = (NU64)", dblPrec," & ", 1'u64 shl 63 - 1, ";"].}
|
{.emit:["*",lo, " = (NU64)", dblPrec," & ", 1'u64 shl 63 - 1, ";"].}
|
||||||
|
|
||||||
@ -145,7 +161,11 @@ when sizeof(int) == 8:
|
|||||||
" + (unsigned __int128)", a2," * (unsigned __int128)", b2,
|
" + (unsigned __int128)", a2," * (unsigned __int128)", b2,
|
||||||
" + (unsigned __int128)", c1,
|
" + (unsigned __int128)", c1,
|
||||||
" + (unsigned __int128)", c2, ";"].}
|
" + (unsigned __int128)", c2, ";"].}
|
||||||
# Don't forget to dereference the var param
|
# Don't forget to dereference the var param in C mode
|
||||||
|
when defined(cpp):
|
||||||
|
{.emit:[hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
|
{.emit:[lo, " = (NU64)", dblPrec," & ", (1'u64 shl 63 - 1), ";"].}
|
||||||
|
else:
|
||||||
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
{.emit:["*",lo, " = (NU64)", dblPrec," & ", (1'u64 shl 63 - 1), ";"].}
|
{.emit:["*",lo, " = (NU64)", dblPrec," & ", (1'u64 shl 63 - 1), ";"].}
|
||||||
|
|
||||||
@ -157,7 +177,10 @@ when sizeof(int) == 8:
|
|||||||
{.emit:[dblPrec, " = (unsigned __int128)", a1," * (unsigned __int128)", b1,
|
{.emit:[dblPrec, " = (unsigned __int128)", a1," * (unsigned __int128)", b1,
|
||||||
" + (unsigned __int128)", a2," * (unsigned __int128)", b2,
|
" + (unsigned __int128)", a2," * (unsigned __int128)", b2,
|
||||||
" + (unsigned __int128)", c, ";"].}
|
" + (unsigned __int128)", c, ";"].}
|
||||||
# Don't forget to dereference the var param
|
# Don't forget to dereference the var param in C mode
|
||||||
|
when defined(cpp):
|
||||||
|
{.emit:[hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
|
else:
|
||||||
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
{.emit:["*",hi, " = (NU64)(", dblPrec," >> ", 63'u64, ");"].}
|
||||||
|
|
||||||
elif defined(vcc):
|
elif defined(vcc):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user