mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 14:48:47 +00:00
implement lshrti3 on wasm
This commit is contained in:
@@ -52,3 +52,24 @@ udivti3 :: proc "c" (la, ha, lb, hb: u64) -> u128 {
|
|||||||
b.lo, b.hi = lb, hb
|
b.lo, b.hi = lb, hb
|
||||||
return udivmodti4(a.all, b.all, nil)
|
return udivmodti4(a.all, b.all, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(link_name="__lshrti3", linkage="strong")
|
||||||
|
__lshrti3 :: proc "c" (la, ha: u64, b: u32) -> i128 {
|
||||||
|
bits :: size_of(u32)*8
|
||||||
|
|
||||||
|
input, result: ti_int
|
||||||
|
input.lo = la
|
||||||
|
input.hi = ha
|
||||||
|
|
||||||
|
if b & bits != 0 {
|
||||||
|
result.hi = 0
|
||||||
|
result.lo = input.hi >> (b - bits)
|
||||||
|
} else if b == 0 {
|
||||||
|
return input.all
|
||||||
|
} else {
|
||||||
|
result.hi = input.hi >> b
|
||||||
|
result.lo = (input.hi << (bits - b)) | (input.lo >> b)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.all
|
||||||
|
}
|
||||||
|
|||||||
+54
-46
@@ -3935,6 +3935,60 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool REQUIRE = true;
|
||||||
|
Type *bt = base_type(x->type);
|
||||||
|
if (op.kind == Token_Mod || op.kind == Token_ModEq ||
|
||||||
|
op.kind == Token_ModMod || op.kind == Token_ModModEq) {
|
||||||
|
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
||||||
|
case Basic_u128: add_package_dependency(c, "runtime", "umodti3", REQUIRE); break;
|
||||||
|
case Basic_i128: add_package_dependency(c, "runtime", "modti3", REQUIRE); break;
|
||||||
|
}
|
||||||
|
} else if (op.kind == Token_Quo || op.kind == Token_QuoEq) {
|
||||||
|
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
||||||
|
case Basic_complex32: add_package_dependency(c, "runtime", "quo_complex32"); break;
|
||||||
|
case Basic_complex64: add_package_dependency(c, "runtime", "quo_complex64"); break;
|
||||||
|
case Basic_complex128: add_package_dependency(c, "runtime", "quo_complex128"); break;
|
||||||
|
case Basic_quaternion64: add_package_dependency(c, "runtime", "quo_quaternion64"); break;
|
||||||
|
case Basic_quaternion128: add_package_dependency(c, "runtime", "quo_quaternion128"); break;
|
||||||
|
case Basic_quaternion256: add_package_dependency(c, "runtime", "quo_quaternion256"); break;
|
||||||
|
|
||||||
|
case Basic_u128: add_package_dependency(c, "runtime", "udivti3", REQUIRE); break;
|
||||||
|
case Basic_i128: add_package_dependency(c, "runtime", "divti3", REQUIRE); break;
|
||||||
|
}
|
||||||
|
} else if (op.kind == Token_Mul || op.kind == Token_MulEq) {
|
||||||
|
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
||||||
|
case Basic_quaternion64: add_package_dependency(c, "runtime", "mul_quaternion64"); break;
|
||||||
|
case Basic_quaternion128: add_package_dependency(c, "runtime", "mul_quaternion128"); break;
|
||||||
|
case Basic_quaternion256: add_package_dependency(c, "runtime", "mul_quaternion256"); break;
|
||||||
|
|
||||||
|
|
||||||
|
case Basic_u128:
|
||||||
|
case Basic_i128:
|
||||||
|
if (is_arch_wasm()) {
|
||||||
|
add_package_dependency(c, "runtime", "__multi3", REQUIRE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (op.kind == Token_Shl || op.kind == Token_ShlEq) {
|
||||||
|
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
||||||
|
case Basic_u128:
|
||||||
|
case Basic_i128:
|
||||||
|
if (is_arch_wasm()) {
|
||||||
|
add_package_dependency(c, "runtime", "__ashlti3", REQUIRE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (op.kind == Token_Shr || op.kind == Token_ShrEq) {
|
||||||
|
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
||||||
|
case Basic_u128:
|
||||||
|
case Basic_i128:
|
||||||
|
if (is_arch_wasm()) {
|
||||||
|
add_package_dependency(c, "runtime", "__lshrti3", REQUIRE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (token_is_shift(op.kind)) {
|
if (token_is_shift(op.kind)) {
|
||||||
check_shift(c, x, y, node, type_hint);
|
check_shift(c, x, y, node, type_hint);
|
||||||
return;
|
return;
|
||||||
@@ -4103,52 +4157,6 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool REQUIRE = true;
|
|
||||||
|
|
||||||
Type *bt = base_type(x->type);
|
|
||||||
if (op.kind == Token_Mod || op.kind == Token_ModEq ||
|
|
||||||
op.kind == Token_ModMod || op.kind == Token_ModModEq) {
|
|
||||||
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
|
||||||
case Basic_u128: add_package_dependency(c, "runtime", "umodti3", REQUIRE); break;
|
|
||||||
case Basic_i128: add_package_dependency(c, "runtime", "modti3", REQUIRE); break;
|
|
||||||
}
|
|
||||||
} else if (op.kind == Token_Quo || op.kind == Token_QuoEq) {
|
|
||||||
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
|
||||||
case Basic_complex32: add_package_dependency(c, "runtime", "quo_complex32"); break;
|
|
||||||
case Basic_complex64: add_package_dependency(c, "runtime", "quo_complex64"); break;
|
|
||||||
case Basic_complex128: add_package_dependency(c, "runtime", "quo_complex128"); break;
|
|
||||||
case Basic_quaternion64: add_package_dependency(c, "runtime", "quo_quaternion64"); break;
|
|
||||||
case Basic_quaternion128: add_package_dependency(c, "runtime", "quo_quaternion128"); break;
|
|
||||||
case Basic_quaternion256: add_package_dependency(c, "runtime", "quo_quaternion256"); break;
|
|
||||||
|
|
||||||
case Basic_u128: add_package_dependency(c, "runtime", "udivti3", REQUIRE); break;
|
|
||||||
case Basic_i128: add_package_dependency(c, "runtime", "divti3", REQUIRE); break;
|
|
||||||
}
|
|
||||||
} else if (op.kind == Token_Mul || op.kind == Token_MulEq) {
|
|
||||||
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
|
||||||
case Basic_quaternion64: add_package_dependency(c, "runtime", "mul_quaternion64"); break;
|
|
||||||
case Basic_quaternion128: add_package_dependency(c, "runtime", "mul_quaternion128"); break;
|
|
||||||
case Basic_quaternion256: add_package_dependency(c, "runtime", "mul_quaternion256"); break;
|
|
||||||
|
|
||||||
|
|
||||||
case Basic_u128:
|
|
||||||
case Basic_i128:
|
|
||||||
if (is_arch_wasm()) {
|
|
||||||
add_package_dependency(c, "runtime", "__multi3", REQUIRE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (op.kind == Token_Shl || op.kind == Token_ShlEq) {
|
|
||||||
if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
|
|
||||||
case Basic_u128:
|
|
||||||
case Basic_i128:
|
|
||||||
if (is_arch_wasm()) {
|
|
||||||
add_package_dependency(c, "runtime", "__ashlti3", REQUIRE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
x->mode = Addressing_Value;
|
x->mode = Addressing_Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2723,6 +2723,7 @@ gb_internal void generate_minimum_dependency_set(Checker *c, Entity *start) {
|
|||||||
// WASM Specific
|
// WASM Specific
|
||||||
str_lit("__ashlti3"),
|
str_lit("__ashlti3"),
|
||||||
str_lit("__multi3"),
|
str_lit("__multi3"),
|
||||||
|
str_lit("__lshrti3"),
|
||||||
);
|
);
|
||||||
|
|
||||||
FORCE_ADD_RUNTIME_ENTITIES(!build_context.no_rtti,
|
FORCE_ADD_RUNTIME_ENTITIES(!build_context.no_rtti,
|
||||||
|
|||||||
Reference in New Issue
Block a user