mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge branch 'master' of https://github.com/odin-lang/Odin
This commit is contained in:
@@ -14,23 +14,12 @@ import "base:intrinsics"
|
|||||||
This allows to benchmark and/or setting optimized values for a certain CPU without recompiling.
|
This allows to benchmark and/or setting optimized values for a certain CPU without recompiling.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
========================== TUNABLES ==========================
|
|
||||||
|
|
||||||
`initialize_constants` returns `#config(MUL_KARATSUBA_CUTOFF, _DEFAULT_MUL_KARATSUBA_CUTOFF)`
|
|
||||||
and we initialize this cutoff that way so that the procedure is used and called,
|
|
||||||
because it handles initializing the constants ONE, ZERO, MINUS_ONE, NAN and INF.
|
|
||||||
|
|
||||||
`initialize_constants` also replaces the other `_DEFAULT_*` cutoffs with custom compile-time values if so `#config`ured.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
There is a bug with DLL globals. They don't get set.
|
There is a bug with DLL globals. They don't get set.
|
||||||
To allow tests to run we add `-define:MATH_BIG_EXE=false` to hardcode the cutoffs for now.
|
To allow tests to run we add `-define:MATH_BIG_EXE=false` to hardcode the cutoffs for now.
|
||||||
*/
|
*/
|
||||||
when #config(MATH_BIG_EXE, true) {
|
when #config(MATH_BIG_EXE, true) {
|
||||||
MUL_KARATSUBA_CUTOFF := initialize_constants()
|
MUL_KARATSUBA_CUTOFF := _DEFAULT_MUL_KARATSUBA_CUTOFF
|
||||||
SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF
|
SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF
|
||||||
MUL_TOOM_CUTOFF := _DEFAULT_MUL_TOOM_CUTOFF
|
MUL_TOOM_CUTOFF := _DEFAULT_MUL_TOOM_CUTOFF
|
||||||
SQR_TOOM_CUTOFF := _DEFAULT_SQR_TOOM_CUTOFF
|
SQR_TOOM_CUTOFF := _DEFAULT_SQR_TOOM_CUTOFF
|
||||||
|
|||||||
@@ -778,13 +778,14 @@ int_from_bytes_little_python :: proc(a: ^Int, buf: []u8, signed := false, alloca
|
|||||||
*/
|
*/
|
||||||
INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}
|
INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}
|
||||||
|
|
||||||
@(init, private)
|
@(private)
|
||||||
_init_constants :: proc "contextless" () {
|
constant_allocator: runtime.Allocator
|
||||||
initialize_constants()
|
|
||||||
}
|
|
||||||
|
|
||||||
initialize_constants :: proc "contextless" () -> (res: int) {
|
@(init, private)
|
||||||
|
initialize_constants :: proc "contextless" () {
|
||||||
context = runtime.default_context()
|
context = runtime.default_context()
|
||||||
|
constant_allocator = context.allocator
|
||||||
|
|
||||||
internal_int_set_from_integer( INT_ZERO, 0); INT_ZERO.flags = {.Immutable}
|
internal_int_set_from_integer( INT_ZERO, 0); INT_ZERO.flags = {.Immutable}
|
||||||
internal_int_set_from_integer( INT_ONE, 1); INT_ONE.flags = {.Immutable}
|
internal_int_set_from_integer( INT_ONE, 1); INT_ONE.flags = {.Immutable}
|
||||||
internal_int_set_from_integer(INT_MINUS_ONE, -1); INT_MINUS_ONE.flags = {.Immutable}
|
internal_int_set_from_integer(INT_MINUS_ONE, -1); INT_MINUS_ONE.flags = {.Immutable}
|
||||||
@@ -796,15 +797,17 @@ initialize_constants :: proc "contextless" () -> (res: int) {
|
|||||||
internal_int_set_from_integer( INT_NAN, 1); INT_NAN.flags = {.Immutable, .NaN}
|
internal_int_set_from_integer( INT_NAN, 1); INT_NAN.flags = {.Immutable, .NaN}
|
||||||
internal_int_set_from_integer( INT_INF, 1); INT_INF.flags = {.Immutable, .Inf}
|
internal_int_set_from_integer( INT_INF, 1); INT_INF.flags = {.Immutable, .Inf}
|
||||||
internal_int_set_from_integer(INT_MINUS_INF, -1); INT_MINUS_INF.flags = {.Immutable, .Inf}
|
internal_int_set_from_integer(INT_MINUS_INF, -1); INT_MINUS_INF.flags = {.Immutable, .Inf}
|
||||||
|
|
||||||
return _DEFAULT_MUL_KARATSUBA_CUTOFF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Destroy constants.
|
Destroy constants.
|
||||||
Optional for an EXE, as this would be called at the very end of a process.
|
Optional for an EXE, as this would be called at the very end of a process.
|
||||||
*/
|
*/
|
||||||
destroy_constants :: proc() {
|
@(fini, private)
|
||||||
|
destroy_constants :: proc "contextless" () {
|
||||||
|
context = runtime.default_context()
|
||||||
|
context.allocator = constant_allocator
|
||||||
|
|
||||||
internal_destroy(INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN)
|
internal_destroy(INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user