diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index 737e3a52f3..1389b32d14 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -343,7 +343,8 @@ RUN(NAME bindc_06 LABELS llvm c EXTRAFILES bindc_06b.c) RUN(NAME test_generics_01 LABELS cpython llvm c) RUN(NAME test_cmath LABELS cpython llvm c) -RUN(NAME test_complex LABELS cpython llvm c) +RUN(NAME test_complex_01 LABELS cpython llvm c wasm) +RUN(NAME test_complex_02 LABELS cpython llvm c) RUN(NAME test_max_min LABELS cpython llvm c) RUN(NAME test_global LABELS cpython llvm c) RUN(NAME test_global_decl LABELS cpython llvm c) diff --git a/integration_tests/test_complex.py b/integration_tests/test_complex.py deleted file mode 100644 index dc9f4d230a..0000000000 --- a/integration_tests/test_complex.py +++ /dev/null @@ -1,142 +0,0 @@ -from ltypes import i32, i64, f32, f64, c32, c64 - -def test_real_imag(): - x: c64 - x = c64(2) + 3j - a: f64 - b: f64 - eps: f64 - eps = 1e-12 - a = x.real - b = x.imag - assert abs(a - 2.0) < eps - assert abs(b - 3.0) < eps - -def test_complex(): - x: c64 - x = complex(4.5, 6.7) - eps: f64 - eps = 1e-12 - assert abs(x.real - 4.5) < eps - assert abs(x.imag - 6.7) < eps - - x = complex(-4, 2) - assert abs(x.real - (-4.0)) < eps - assert abs(x.imag - 2.0) < eps - - x = complex(4, 7.89) - assert abs(x.real - 4.0) < eps - assert abs(x.imag - 7.89) < eps - - x = complex(5.6, 0) - assert abs(x.real - 5.6) < eps - assert abs(x.imag - 0.0) < eps - - a: f64 - a = 534.6 - x = complex(a, -a) # (f64, f64) - - assert abs(x.real - 534.60000000000002274) < eps - assert abs(x.imag - (-534.60000000000002274)) < eps - - a2: f32 - a2 = -f32(423.5430806348152437) - a3: f32 - a3 = f32(34.5) - x2: c32 - x2 = c32(complex(a2, a3)) # (f32, f32) - - assert f64(abs(x2.imag - f32(34.5))) < eps - - i1: i32 - i1 = -5 - i2: i64 - i2 = -i64(6) - - x = complex(a3, a) # (f32, f64) - x = complex(a, a3) # (f64, f32) - x = complex(i1, i2) # (i32, i64) - x = complex(i1, -i1) # (i32, i32) - x = complex(-i2, -i2) # (i64, i64) - x = complex(i2, -i1) # (i64, i32) - - -def test_complex_abs(): - x: c32 - x = c32(complex(3, 4)) - eps: f64 - eps = 1e-12 - assert f64(abs(f64(abs(x)) - 5.0)) < eps - y: c64 - y = complex(6, 8) - assert abs(abs(y) - 10.0) < eps - -def test_complex_binop_32(): - x: c32 - y: c32 - z: c32 - x = c32(c64(2) + 3j) - y = c32(c64(4) + 5j) - z = x + y - z = x - y - z = x * y - # TODO: - #z = x / y - z = x ** y - -def test_complex_binop_64(): - x: c64 - y: c64 - z: c64 - x = c64(2) + 3j - y = c64(4) + 5j - z = x + y - z = x - y - z = x * y - # TODO: - #z = x / y - z = x ** y - -def test_complex_unary_minus(): - c: c32 - c = c32(complex(3, 4.5)) - _c: c32 - _c = -c - assert abs(f64(_c.real) - (-3.0)) < 1e-12 - assert abs(f64(_c.imag) - (-4.5)) < 1e-12 - _c = c32(complex(5, -78)) - _c = -_c - assert abs(f64(_c.real) - (-5.0)) < 1e-12 - assert abs(f64(_c.imag) - 78.0) < 1e-12 - c2: c64 - c2 = complex(-4.5, -7.8) - c2 = -c2 - assert abs(c2.real - 4.5) < 1e-12 - assert abs(c2.imag - 7.8) < 1e-12 - c2 = c64(3) + 4j - c2 = -c2 - assert abs(c2.real - (-3.0)) < 1e-12 - assert abs(c2.imag - (-4.0)) < 1e-12 - -def test_complex_not(): - c: c32 - c = c32(complex(4, 5)) - b: bool - b = not c - assert not b - - c2: c64 - c2 = complex(0, 0) - b = not c2 - assert b - -def check(): - test_real_imag() - test_complex() - test_complex_abs() - test_complex_binop_32() - test_complex_binop_64() - test_complex_unary_minus() - test_complex_not() - -check() diff --git a/integration_tests/test_complex_01.py b/integration_tests/test_complex_01.py new file mode 100644 index 0000000000..16d712f1a1 --- /dev/null +++ b/integration_tests/test_complex_01.py @@ -0,0 +1,102 @@ +from ltypes import i32, i64, f32, f64, c32, c64 + +def test_real_imag(): + x: c64 + x = c64(2) + 3j + a: f64 + b: f64 + eps: f64 + eps = 1e-12 + a = x.real + b = x.imag + assert abs(a - 2.0) <= eps + assert abs(b - 3.0) <= eps + +def test_complex(): + x: c64 + x = complex(4.5, 6.7) + eps: f64 + eps = 1e-12 + assert abs(x.real - 4.5) <= eps + assert abs(x.imag - 6.7) <= eps + + x = complex(-4, 2) + assert abs(x.real - (-4.0)) <= eps + assert abs(x.imag - 2.0) <= eps + + x = complex(4, 7.89) + assert abs(x.real - 4.0) <= eps + assert abs(x.imag - 7.89) <= eps + + x = complex(5.6, 0) + assert abs(x.real - 5.6) <= eps + assert abs(x.imag - 0.0) <= eps + + a: f64 + a = 534.6 + x = complex(a, -a) # (f64, f64) + + assert abs(x.real - 534.60000000000002274) <= eps + assert abs(x.imag - (-534.60000000000002274)) <= eps + + a2: f32 + a2 = -f32(423.5430806348152437) + a3: f32 + a3 = f32(34.5) + x2: c32 + x2 = c32(complex(a2, a3)) # (f32, f32) + + assert f64(abs(x2.imag - f32(34.5))) <= eps + + i1: i32 + i1 = -5 + i2: i64 + i2 = -i64(6) + + x = complex(a3, a) # (f32, f64) + x = complex(a, a3) # (f64, f32) + x = complex(i1, i2) # (i32, i64) + x = complex(i1, -i1) # (i32, i32) + x = complex(-i2, -i2) # (i64, i64) + x = complex(i2, -i1) # (i64, i32) + +def test_complex_unary_minus(): + c: c32 + c = c32(complex(3, 4.5)) + _c: c32 + _c = -c + assert abs(f64(_c.real) - (-3.0)) <= 1e-12 + assert abs(f64(_c.imag) - (-4.5)) <= 1e-12 + _c = c32(complex(5, -78)) + _c = -_c + assert abs(f64(_c.real) - (-5.0)) <= 1e-12 + assert abs(f64(_c.imag) - 78.0) <= 1e-12 + c2: c64 + c2 = complex(-4.5, -7.8) + c2 = -c2 + assert abs(c2.real - 4.5) <= 1e-12 + assert abs(c2.imag - 7.8) <= 1e-12 + c2 = c64(3) + 4j + c2 = -c2 + assert abs(c2.real - (-3.0)) <= 1e-12 + assert abs(c2.imag - (-4.0)) <= 1e-12 + +def test_complex_not(): + c: c32 + c = c32(complex(4, 5)) + b: bool + b = not c + assert not b + + c2: c64 + c2 = complex(0, 0) + b = not c2 + assert b + +def check(): + test_real_imag() + test_complex() + test_complex_unary_minus() + test_complex_not() + +check() diff --git a/integration_tests/test_complex_02.py b/integration_tests/test_complex_02.py new file mode 100644 index 0000000000..0da86a3f33 --- /dev/null +++ b/integration_tests/test_complex_02.py @@ -0,0 +1,44 @@ +from ltypes import f64, c32, c64 + +def test_complex_abs(): + x: c32 + x = c32(complex(3, 4)) + eps: f64 + eps = 1e-12 + assert f64(abs(f64(abs(x)) - 5.0)) < eps + y: c64 + y = complex(6, 8) + assert abs(abs(y) - 10.0) < eps + +def test_complex_binop_32(): + x: c32 + y: c32 + z: c32 + x = c32(c64(2) + 3j) + y = c32(c64(4) + 5j) + z = x + y + z = x - y + z = x * y + # TODO: + #z = x / y + z = x ** y + +def test_complex_binop_64(): + x: c64 + y: c64 + z: c64 + x = c64(2) + 3j + y = c64(4) + 5j + z = x + y + z = x - y + z = x * y + # TODO: + #z = x / y + z = x ** y + +def check(): + test_complex_abs() + test_complex_binop_32() + test_complex_binop_64() + +check() diff --git a/src/libasr/codegen/asr_to_wasm.cpp b/src/libasr/codegen/asr_to_wasm.cpp index 1010cfcacd..5c7f69a723 100644 --- a/src/libasr/codegen/asr_to_wasm.cpp +++ b/src/libasr/codegen/asr_to_wasm.cpp @@ -73,6 +73,7 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { uint32_t nesting_level; uint32_t cur_loop_nesting_level; bool is_prototype_only; + ASR::Function_t* main_func; Vec m_type_section; Vec m_import_section; @@ -97,15 +98,20 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { uint32_t max_no_pages; std::map m_var_name_idx_map; + std::map m_global_var_name_idx_map; std::map m_func_name_idx_map; std::map m_import_func_asr_map; + std::map m_self_func_name_idx_map; std::map m_string_to_iov_loc_map; + std::map m_self_funcs_map; + public: ASRToWASMVisitor(Allocator &al, diag::Diagnostics &diagnostics) : m_al(al), diag(diagnostics) { intrinsic_module = false; is_prototype_only = false; + main_func = nullptr; nesting_level = 0; cur_loop_nesting_level = 0; no_of_types = 0; @@ -350,251 +356,390 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { cur_loop_nesting_level = prev_cur_loop_nesting_level; } - void emit_print_int() { - uint32_t func_idx = no_of_types; + void define_emit_func( + std::vector params, + std::vector results, + std::vector locals, + std::string func_name, + std::function func_body, + int func_idx = -1 + ) { + + if (func_idx == -1) { + func_idx = no_of_types++; + } + { // type declaration wasm::emit_b8(m_type_section, m_al, 0x60); - wasm::emit_u32(m_type_section, m_al, 1); // no of params - wasm::emit_b8(m_type_section, m_al, wasm::type::i64); - wasm::emit_u32(m_type_section, m_al, 0); // no of results - no_of_types++; + wasm::emit_u32(m_type_section, m_al, params.size()); // no of params + for (auto param:params) { + wasm::emit_b8(m_type_section, m_al, param); + } + wasm::emit_u32(m_type_section, m_al, results.size()); // no of results + for (auto result:results) { + wasm::emit_b8(m_type_section, m_al, result); + } } + /*** Reference Function Prototype ***/ wasm::emit_u32(m_func_section, m_al, func_idx); /*** Function Body Starts Here ***/ uint32_t len_idx_code_section_func_size = wasm::emit_len_placeholder(m_code_section, m_al); - wasm::emit_u32(m_code_section, m_al, 4u); // no of local vars - for (int i = 0; i < 4; i++) { + + wasm::emit_u32(m_code_section, m_al, locals.size()); + for (auto local:locals) { wasm::emit_u32(m_code_section, m_al, 1u); // count of local vars of this type - wasm::emit_b8(m_code_section, m_al, wasm::type::i64); + wasm::emit_b8(m_code_section, m_al, local); } - // locals 0 is given parameter - // locals 1 is digits_cnt - // locals 2 is divisor (in powers of 10) - // locals 3 is loop counter (counts upto digits_cnt (which is decreasing)) - // locals 4 is extra copy of given parameter + func_body(); - emit_if_else([&](){ - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_i64_eq(m_code_section, m_al); - }, [&](){ - emit_call_fd_write(1, "0", 1, 0); - wasm::emit_b8(m_code_section, m_al, 0x0F); // emit wasm return instruction - }, [&](){}); + wasm::emit_b8(m_code_section, m_al, 0x0F); // emit wasm return instruction + wasm::emit_expr_end(m_code_section, m_al); + wasm::fixup_len(m_code_section, m_al, len_idx_code_section_func_size); - emit_if_else([&](){ - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_i64_lt_s(m_code_section, m_al); - }, [&](){ - emit_call_fd_write(1, "-", 1, 0); - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_const(m_code_section, m_al, -1); - wasm::emit_i64_mul(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 0); - }, [&](){}); + /*** Export the function ***/ + wasm::emit_export_fn(m_export_section, m_al, func_name, func_idx); // add function to export + no_of_functions++; + no_of_exports++; + } - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_set_local(m_code_section, m_al, 4); - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_set_local(m_code_section, m_al, 1); + void emit_print_int(int fn_idx = -1) { + using namespace wasm; + define_emit_func({i64}, {}, {i64, i64, i64, i64}, "print_i64", [&](){ + // locals 0 is given parameter + // locals 1 is digits_cnt + // locals 2 is divisor (in powers of 10) + // locals 3 is loop counter (counts upto digits_cnt (which is decreasing)) + // locals 4 is extra copy of given parameter + + emit_if_else([&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_i64_eq(m_code_section, m_al); + }, [&](){ + emit_call_fd_write(1, "0", 1, 0); + wasm::emit_b8(m_code_section, m_al, 0x0F); // emit wasm return instruction + }, [&](){}); + + emit_if_else([&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_i64_lt_s(m_code_section, m_al); + }, [&](){ + emit_call_fd_write(1, "-", 1, 0); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_const(m_code_section, m_al, -1); + wasm::emit_i64_mul(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 0); + }, [&](){}); - emit_loop([&](){ wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_set_local(m_code_section, m_al, 4); wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_i64_gt_s(m_code_section, m_al); - }, [&](){ - wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 1); - wasm::emit_i64_add(m_code_section, m_al); wasm::emit_set_local(m_code_section, m_al, 1); + + emit_loop([&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_i64_gt_s(m_code_section, m_al); + }, [&](){ + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_const(m_code_section, m_al, 1); + wasm::emit_i64_add(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_const(m_code_section, m_al, 10); + wasm::emit_i64_div_s(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 0); + }); + + emit_loop([&](){ + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_i64_gt_s(m_code_section, m_al); + }, [&](){ + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_const(m_code_section, m_al, 1); + wasm::emit_i64_sub(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 1); + + wasm::emit_i64_const(m_code_section, m_al, 1); + wasm::emit_set_local(m_code_section, m_al, 2); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_set_local(m_code_section, m_al, 3); + + emit_loop([&](){ + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_lt_s(m_code_section, m_al); + }, [&](){ + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_i64_const(m_code_section, m_al, 1); + wasm::emit_i64_add(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 3); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_i64_const(m_code_section, m_al, 10); + wasm::emit_i64_mul(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 2); + }); + + + wasm::emit_get_local(m_code_section, m_al, 4); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_i64_div_s(m_code_section, m_al); + wasm::emit_i64_const(m_code_section, m_al, 10); + wasm::emit_i64_rem_s(m_code_section, m_al); + + /* The digit is on stack */ + wasm::emit_i64_const(m_code_section, m_al, 12 /* 4 + 4 + 4 (iov vec + str size)*/); + wasm::emit_i64_mul(m_code_section, m_al); + wasm::emit_i64_const(m_code_section, m_al, digits_mem_loc); + wasm::emit_i64_add(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 0); // temporary save + + { + wasm::emit_i32_const(m_code_section, m_al, 1); // file type: 1 for stdout + wasm::emit_get_local(m_code_section, m_al, 0); // use stored digit + wasm::emit_i32_wrap_i64(m_code_section, m_al); + wasm::emit_i32_const(m_code_section, m_al, 1); // size of iov vector + wasm::emit_i32_const(m_code_section, m_al, 0); // mem_loction to return no. of bytes written + // call WASI fd_write + wasm::emit_call( + m_code_section, m_al, + m_func_name_idx_map[get_hash( + m_import_func_asr_map["fd_write"])] + ->index); + wasm::emit_drop(m_code_section, m_al); + } + + }); + }, fn_idx); + } + + void emit_print_float(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f64}, {}, {i64, i64, i64}, "print_f64", [&](){ + emit_if_else([&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_f64_const(m_code_section, m_al, 0); + wasm::emit_f64_lt(m_code_section, m_al); + }, [&](){ + emit_call_fd_write(1, "-", 1, 0); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_f64_const(m_code_section, m_al, -1); + wasm::emit_f64_mul(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 0); + }, [&](){}); + wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_const(m_code_section, m_al, 10); - wasm::emit_i64_div_s(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 0); - }); + wasm::emit_i64_trunc_f64_s(m_code_section, m_al); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_i64"]); + emit_call_fd_write(1, ".", 1, 0); - emit_loop([&](){ - wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_i64_gt_s(m_code_section, m_al); - }, [&](){ - wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 1); - wasm::emit_i64_sub(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_i64_trunc_f64_s(m_code_section, m_al); + wasm::emit_f64_convert_i64_s(m_code_section, m_al); + wasm::emit_f64_sub(m_code_section, m_al); + wasm::emit_f64_const(m_code_section, m_al, 1e8); + wasm::emit_f64_mul(m_code_section, m_al); + wasm::emit_i64_trunc_f64_s(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 2); /* save the current fractional part value */ + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_set_local(m_code_section, m_al, 3); /* save the another copy */ - wasm::emit_i64_const(m_code_section, m_al, 1); - wasm::emit_set_local(m_code_section, m_al, 2); wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_set_local(m_code_section, m_al, 3); + wasm::emit_set_local(m_code_section, m_al, 1); // digits_cnt emit_loop([&](){ - wasm::emit_get_local(m_code_section, m_al, 3); - wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_lt_s(m_code_section, m_al); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_i64_const(m_code_section, m_al, 0); + wasm::emit_i64_gt_s(m_code_section, m_al); }, [&](){ - wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_get_local(m_code_section, m_al, 1); wasm::emit_i64_const(m_code_section, m_al, 1); wasm::emit_i64_add(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 3); + wasm::emit_set_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f64_convert_i64_s(m_code_section, m_al); wasm::emit_i64_const(m_code_section, m_al, 10); - wasm::emit_i64_mul(m_code_section, m_al); + wasm::emit_f64_convert_i64_s(m_code_section, m_al); + wasm::emit_f64_div(m_code_section, m_al); + wasm::emit_i64_trunc_f64_s(m_code_section, m_al); wasm::emit_set_local(m_code_section, m_al, 2); }); + emit_loop([&](){ + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_const(m_code_section, m_al, 8); + wasm::emit_i64_lt_s(m_code_section, m_al); + }, [&](){ + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_i64_const(m_code_section, m_al, 1); + wasm::emit_i64_add(m_code_section, m_al); + wasm::emit_set_local(m_code_section, m_al, 1); + + emit_call_fd_write(1, "0", 1, 0); + }); + + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_i64"]); + }, fn_idx); + } - wasm::emit_get_local(m_code_section, m_al, 4); + void emit_complex_add_32(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f32, f32, f32, f32}, {f32, f32}, {}, "add_c32", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); wasm::emit_get_local(m_code_section, m_al, 2); - wasm::emit_i64_div_s(m_code_section, m_al); - wasm::emit_i64_const(m_code_section, m_al, 10); - wasm::emit_i64_rem_s(m_code_section, m_al); + wasm::emit_f32_add(m_code_section, m_al); - /* The digit is on stack */ - wasm::emit_i64_const(m_code_section, m_al, 12 /* 4 + 4 + 4 (iov vec + str size)*/); - wasm::emit_i64_mul(m_code_section, m_al); - wasm::emit_i64_const(m_code_section, m_al, digits_mem_loc); - wasm::emit_i64_add(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 0); // temporary save + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f32_add(m_code_section, m_al); + }, fn_idx); + } - { - wasm::emit_i32_const(m_code_section, m_al, 1); // file type: 1 for stdout - wasm::emit_get_local(m_code_section, m_al, 0); // use stored digit - wasm::emit_i32_wrap_i64(m_code_section, m_al); - wasm::emit_i32_const(m_code_section, m_al, 1); // size of iov vector - wasm::emit_i32_const(m_code_section, m_al, 0); // mem_loction to return no. of bytes written - // call WASI fd_write - wasm::emit_call( - m_code_section, m_al, - m_func_name_idx_map[get_hash( - m_import_func_asr_map["fd_write"])] - ->index); - wasm::emit_drop(m_code_section, m_al); - } + void emit_complex_add_64(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f64, f64, f64, f64}, {f64, f64}, {}, "add_c64", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f64_add(m_code_section, m_al); - }); + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f64_add(m_code_section, m_al); + }, fn_idx); + } - wasm::emit_b8(m_code_section, m_al, 0x0F); // emit wasm return instruction - wasm::emit_expr_end(m_code_section, m_al); - wasm::fixup_len(m_code_section, m_al, len_idx_code_section_func_size); + void emit_complex_sub_32(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f32, f32, f32, f32}, {f32, f32}, {}, "sub_c32", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f32_sub(m_code_section, m_al); - /*** Export the function ***/ - wasm::emit_export_fn(m_export_section, m_al, "print_i64", func_idx); // add function to export - no_of_functions++; - no_of_exports++; + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f32_sub(m_code_section, m_al); + }, fn_idx); } - void emit_print_float() { - uint32_t func_idx = no_of_types; - { // type declaration - wasm::emit_b8(m_type_section, m_al, 0x60); - wasm::emit_u32(m_type_section, m_al, 1); // no of params - wasm::emit_b8(m_type_section, m_al, wasm::type::f64); - wasm::emit_u32(m_type_section, m_al, 0); // no of results - no_of_types++; - } - /*** Reference Function Prototype ***/ - wasm::emit_u32(m_func_section, m_al, func_idx); + void emit_complex_sub_64(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f64, f64, f64, f64}, {f64, f64}, {}, "sub_c64", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f64_sub(m_code_section, m_al); - /*** Function Body Starts Here ***/ - uint32_t len_idx_code_section_func_size = - wasm::emit_len_placeholder(m_code_section, m_al); - wasm::emit_u32(m_code_section, m_al, 3u); // no of local vars - for (int i = 0; i < 3; i++) { - wasm::emit_u32(m_code_section, m_al, 1u); // count of local vars of this type - wasm::emit_b8(m_code_section, m_al, wasm::type::i64); - } + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f64_sub(m_code_section, m_al); + }, fn_idx); + } - emit_if_else([&](){ + void emit_complex_mul_32(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f32, f32, f32, f32}, {f32, f32}, {}, "mul_c32", [&](){ wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_f64_const(m_code_section, m_al, 0); - wasm::emit_f64_lt(m_code_section, m_al); - }, [&](){ - emit_call_fd_write(1, "-", 1, 0); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f32_mul(m_code_section, m_al); + + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f32_mul(m_code_section, m_al); + + wasm::emit_f32_sub(m_code_section, m_al); + wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_f64_const(m_code_section, m_al, -1); - wasm::emit_f64_mul(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 0); - }, [&](){}); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f32_mul(m_code_section, m_al); - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_trunc_f64_s(m_code_section, m_al); - wasm::emit_call(m_code_section, m_al, no_of_imports /* print_i64 */); - emit_call_fd_write(1, ".", 1, 0); - - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_get_local(m_code_section, m_al, 0); - wasm::emit_i64_trunc_f64_s(m_code_section, m_al); - wasm::emit_f64_convert_i64_s(m_code_section, m_al); - wasm::emit_f64_sub(m_code_section, m_al); - wasm::emit_f64_const(m_code_section, m_al, 1e8); - wasm::emit_f64_mul(m_code_section, m_al); - wasm::emit_i64_trunc_f64_s(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 2); /* save the current fractional part value */ - wasm::emit_get_local(m_code_section, m_al, 2); - wasm::emit_set_local(m_code_section, m_al, 3); /* save the another copy */ - - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_set_local(m_code_section, m_al, 1); // digits_cnt - - emit_loop([&](){ + wasm::emit_get_local(m_code_section, m_al, 1); wasm::emit_get_local(m_code_section, m_al, 2); - wasm::emit_i64_const(m_code_section, m_al, 0); - wasm::emit_i64_gt_s(m_code_section, m_al); - }, [&](){ + wasm::emit_f32_mul(m_code_section, m_al); + + wasm::emit_f32_add(m_code_section, m_al); + }, fn_idx); + } + + void emit_complex_mul_64(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f64, f64, f64, f64}, {f64, f64}, {}, "mul_c64", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 2); + wasm::emit_f64_mul(m_code_section, m_al); + wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 1); - wasm::emit_i64_add(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f64_mul(m_code_section, m_al); + + wasm::emit_f64_sub(m_code_section, m_al); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 3); + wasm::emit_f64_mul(m_code_section, m_al); + + wasm::emit_get_local(m_code_section, m_al, 1); wasm::emit_get_local(m_code_section, m_al, 2); - wasm::emit_f64_convert_i64_s(m_code_section, m_al); - wasm::emit_i64_const(m_code_section, m_al, 10); - wasm::emit_f64_convert_i64_s(m_code_section, m_al); - wasm::emit_f64_div(m_code_section, m_al); - wasm::emit_i64_trunc_f64_s(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 2); - }); + wasm::emit_f64_mul(m_code_section, m_al); + + wasm::emit_f64_add(m_code_section, m_al); + }, fn_idx); + } + + void emit_complex_abs_32(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f32, f32}, {f32}, {}, "abs_c32", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_f32_mul(m_code_section, m_al); - emit_loop([&](){ wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 8); - wasm::emit_i64_lt_s(m_code_section, m_al); - }, [&](){ wasm::emit_get_local(m_code_section, m_al, 1); - wasm::emit_i64_const(m_code_section, m_al, 1); - wasm::emit_i64_add(m_code_section, m_al); - wasm::emit_set_local(m_code_section, m_al, 1); + wasm::emit_f32_mul(m_code_section, m_al); - emit_call_fd_write(1, "0", 1, 0); - }); + wasm::emit_f32_add(m_code_section, m_al); + wasm::emit_f32_sqrt(m_code_section, m_al); + }, fn_idx); + } - wasm::emit_get_local(m_code_section, m_al, 3); - wasm::emit_call(m_code_section, m_al, no_of_imports /* print_i64 */); + void emit_complex_abs_64(int fn_idx = -1) { + using namespace wasm; + define_emit_func({f64, f64}, {f64}, {}, "abs_c64", [&](){ + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_get_local(m_code_section, m_al, 0); + wasm::emit_f64_mul(m_code_section, m_al); - wasm::emit_b8(m_code_section, m_al, 0x0F); // emit wasm return instruction - wasm::emit_expr_end(m_code_section, m_al); - wasm::fixup_len(m_code_section, m_al, len_idx_code_section_func_size); + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_get_local(m_code_section, m_al, 1); + wasm::emit_f64_mul(m_code_section, m_al); - /*** Export the function ***/ - wasm::emit_export_fn(m_export_section, m_al, "print_f64", func_idx); // add function to export - no_of_functions++; - no_of_exports++; + wasm::emit_f64_add(m_code_section, m_al); + wasm::emit_f64_sqrt(m_code_section, m_al); + }, fn_idx); } - void declare_global_vars() { - { // global variable to hold the available memory location - m_global_section.push_back(m_al, wasm::type::i32); - m_global_section.push_back(m_al, 0x01 /* mutable */); - wasm::emit_i32_const(m_global_section, m_al, 0); - wasm::emit_expr_end(m_global_section, m_al); // end instructions - no_of_globals++; + template + void declare_global_var(wasm::type var_type, std::string name, T initial_value, bool isMutable) { + m_global_section.push_back(m_al, var_type); + m_global_section.push_back(m_al, isMutable); + switch (var_type) + { + case wasm::type::i32: wasm::emit_i32_const(m_global_section, m_al, initial_value); break; + case wasm::type::i64: wasm::emit_i64_const(m_global_section, m_al, initial_value); break; + case wasm::type::f32: wasm::emit_f32_const(m_global_section, m_al, initial_value); break; + case wasm::type::f64: wasm::emit_f64_const(m_global_section, m_al, initial_value); break; + default: throw CodeGenError("declare_global_var: Unsupport var_type"); break; } + wasm::emit_expr_end(m_global_section, m_al); // end instructions + m_global_var_name_idx_map[name] = no_of_globals; + no_of_globals++; } void visit_TranslationUnit(const ASR::TranslationUnit_t &x) { @@ -613,18 +758,32 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { wasm::emit_export_mem(m_export_section, m_al, "memory", 0 /* mem_idx */); no_of_exports++; - declare_global_vars(); + declare_global_var(wasm::type::i32, "cur_mem_loc", 0, true); + declare_global_var(wasm::type::f32, "tmp_reg_f32", 0, true); + declare_global_var(wasm::type::f64, "tmp_reg_f64", 0, true); emit_string(" "); emit_string("\n"); emit_string("-"); emit_string("."); + emit_string("("); + emit_string(")"); + emit_string(","); digits_mem_loc = avail_mem_loc; for (int i = 0; i < 10; i++) { emit_string(std::to_string(i)); } - emit_print_int(); - emit_print_float(); + + m_self_funcs_map["print_i64"] = &ASRToWASMVisitor::emit_print_int; + m_self_funcs_map["print_f64"] = &ASRToWASMVisitor::emit_print_float; + m_self_funcs_map["add_c32"] = &ASRToWASMVisitor::emit_complex_add_32; + m_self_funcs_map["add_c64"] = &ASRToWASMVisitor::emit_complex_add_64; + m_self_funcs_map["sub_c32"] = &ASRToWASMVisitor::emit_complex_sub_32; + m_self_funcs_map["sub_c64"] = &ASRToWASMVisitor::emit_complex_sub_64; + m_self_funcs_map["mul_c32"] = &ASRToWASMVisitor::emit_complex_mul_32; + m_self_funcs_map["mul_c64"] = &ASRToWASMVisitor::emit_complex_mul_64; + m_self_funcs_map["abs_c32"] = &ASRToWASMVisitor::emit_complex_abs_32; + m_self_funcs_map["abs_c64"] = &ASRToWASMVisitor::emit_complex_abs_64; { // Pre-declare all functions first, then generate code @@ -639,9 +798,7 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { x.m_global_scope->get_scope().end()); ASR::symbol_t *mod = x.m_global_scope->get_symbol(item); if (ASR::is_a(*mod)) { - ASR::Module_t *m = - ASR::down_cast(mod); - declare_all_functions(*(m->m_symtab)); + visit_symbol(*mod); } } @@ -651,9 +808,7 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { // then the main program: for (auto &item : x.m_global_scope->get_scope()) { if (ASR::is_a(*item.second)) { - ASR::Program_t *p = - ASR::down_cast(item.second); - declare_all_functions(*(p->m_symtab)); + visit_symbol(*item.second); } } } @@ -694,6 +849,21 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { visit_symbol(*item.second); } } + + std::vector> ordered_self_funcs_name_idx; + for (auto self_func:m_self_func_name_idx_map) { + ordered_self_funcs_name_idx.push_back(self_func); + } + + sort(ordered_self_funcs_name_idx.begin(), + ordered_self_funcs_name_idx.end(), + [](std::pair &a, std::pair &b){ + return a.second < b.second; + }); + + for (auto self_func:ordered_self_funcs_name_idx) { + (this->*m_self_funcs_map[self_func.first])(self_func.second); + } } void declare_all_functions(const SymbolTable &symtab) { @@ -725,14 +895,15 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { declare_all_functions(*x.m_symtab); // Generate main program code - auto main_func = ASRUtils::make_Function_t_util( - m_al, x.base.base.loc, x.m_symtab, s2c(m_al, "_start"), - nullptr, 0, nullptr, 0, x.m_body, x.n_body, nullptr, - ASR::abiType::Source, ASR::accessType::Public, - ASR::deftypeType::Implementation, nullptr, false, false, false, false, false, - nullptr, 0, nullptr, 0, false, false, false); - emit_function_prototype(*((ASR::Function_t *)main_func)); - emit_function_body(*((ASR::Function_t *)main_func)); + if (main_func == nullptr) { + main_func = (ASR::Function_t *)ASRUtils::make_Function_t_util( + m_al, x.base.base.loc, x.m_symtab, s2c(m_al, "_start"), + nullptr, 0, nullptr, 0, x.m_body, x.n_body, nullptr, + ASR::abiType::Source, ASR::accessType::Public, + ASR::deftypeType::Implementation, nullptr, false, false, false, false, false, + nullptr, 0, nullptr, 0, false, false, false); + } + this->visit_Function(*main_func); } void emit_var_type(Vec &code, ASR::Variable_t *v) { @@ -826,6 +997,22 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { "Characters of kind 1 only supported"); } } + } else if (ASRUtils::is_complex(*v->m_type)) { + ASR::Complex_t *v_comp = + ASR::down_cast(v->m_type); + + if (is_array) { + wasm::emit_b8(code, m_al, wasm::type::i32); + } else { + if (v_comp->m_kind == 4) { + wasm::emit_b8(code, m_al, wasm::type::f32); + } else if (v_comp->m_kind == 8) { + wasm::emit_b8(code, m_al, wasm::type::f64); + } else { + throw CodeGenError( + "Complex numbers of kind 4 and 8 only supported yet"); + } + } } else { // throw CodeGenError("Param, Result, Var Types other than // integer, floating point and logical not yet supported"); @@ -855,6 +1042,13 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { v); // emit the type of this var m_var_name_idx_map[get_hash((ASR::asr_t *)v)] = var_idx++; local_vars_cnt++; + if (!ASRUtils::is_array(v->m_type) && ASRUtils::is_complex(*v->m_type)) { + // emit type again for imaginary part + wasm::emit_u32(m_code_section, m_al, 1U); // count of local vars of this type + emit_var_type(m_code_section, v); // emit the type of this var + var_idx++; + local_vars_cnt++; + } } } } @@ -876,6 +1070,11 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { LCOMPILERS_ASSERT(m_var_name_idx_map.find( get_hash((ASR::asr_t *)v)) != m_var_name_idx_map.end()) + if (ASRUtils::is_complex(*v->m_type)) { + wasm::emit_set_local( + m_code_section, m_al, + m_var_name_idx_map[get_hash((ASR::asr_t *)v)] + 1); + } wasm::emit_set_local( m_code_section, m_al, m_var_name_idx_map[get_hash((ASR::asr_t *)v)]); @@ -921,6 +1120,11 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { emit_var_type(m_type_section, arg); m_var_name_idx_map[get_hash((ASR::asr_t *)arg)] = s->no_of_variables++; + if (!ASRUtils::is_array(arg->m_type) && ASRUtils::is_complex(*arg->m_type)) { + // emit type again for imaginary part + emit_var_type(m_type_section, arg); // emit the type of this var + s->no_of_variables++; + } if (arg->m_intent == ASR::intentType::Out || arg->m_intent == ASR::intentType::InOut || arg->m_intent == ASR::intentType::Unspecified) { @@ -930,10 +1134,17 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { /********************* Result Types List *********************/ if (x.m_return_var) { // It is a function - wasm::emit_u32(m_type_section, m_al, - 1U); // there is just one return variable s->return_var = ASRUtils::EXPR2VAR(x.m_return_var); - emit_var_type(m_type_section, s->return_var); + if (!ASRUtils::is_array(s->return_var->m_type) && ASRUtils::is_complex(*s->return_var->m_type)) { + wasm::emit_u32(m_type_section, m_al, 2U); // there are two return variables + // emit type for real part + emit_var_type(m_type_section, s->return_var); // emit the type of this var + // emit type again for imaginary part + emit_var_type(m_type_section, s->return_var); // emit the type of this var + } else { + wasm::emit_u32(m_type_section, m_al, 1U); // there is just one return variable + emit_var_type(m_type_section, s->return_var); + } } else { // It is a subroutine uint32_t len_idx_type_section_return_types_list = wasm::emit_len_placeholder(m_type_section, m_al); @@ -943,6 +1154,10 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { arg->m_intent == ASR::intentType::InOut || arg->m_intent == ASR::intentType::Unspecified) { emit_var_type(m_type_section, arg); + if (!ASRUtils::is_array(arg->m_type) && ASRUtils::is_complex(*arg->m_type)) { + // emit type again for imaginary part + emit_var_type(m_type_section, arg); // emit the type of this var + } } } wasm::fixup_len(m_type_section, m_al, @@ -1193,6 +1408,11 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { LCOMPILERS_ASSERT( m_var_name_idx_map.find(get_hash((ASR::asr_t *)asr_target)) != m_var_name_idx_map.end()); + if (ASRUtils::is_complex(*asr_target->m_type)) { + // first set the imaginary part + wasm::emit_set_local(m_code_section, m_al, + m_var_name_idx_map[get_hash((ASR::asr_t *)asr_target)] + 1u); + } wasm::emit_set_local( m_code_section, m_al, m_var_name_idx_map[get_hash((ASR::asr_t *)asr_target)]); @@ -1473,6 +1693,81 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } + void visit_ComplexBinOp(const ASR::ComplexBinOp_t &x) { + if (x.m_value) { + this->visit_expr(*x.m_value); + return; + } + this->visit_expr(*x.m_left); + this->visit_expr(*x.m_right); + LCOMPILERS_ASSERT(ASRUtils::is_complex(*x.m_type)); + int a_kind = ASR::down_cast(ASRUtils::type_get_past_pointer(x.m_type))->m_kind; + switch (x.m_op) { + case ASR::binopType::Add: { + if (a_kind == 4) { + if (m_self_func_name_idx_map.find("add_c32") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["add_c32"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["add_c32"]); + } else { + if (m_self_func_name_idx_map.find("add_c64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["add_c64"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["add_c64"]); + } + break; + }; + case ASR::binopType::Sub: { + if (a_kind == 4) { + if (m_self_func_name_idx_map.find("sub_c32") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["sub_c32"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["sub_c32"]); + } else { + if (m_self_func_name_idx_map.find("sub_c64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["sub_c64"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["sub_c64"]); + } + break; + }; + case ASR::binopType::Mul: { + if (a_kind == 4) { + if (m_self_func_name_idx_map.find("mul_c32") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["mul_c32"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["mul_c32"]); + } else { + if (m_self_func_name_idx_map.find("mul_c64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["mul_c64"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["mul_c64"]); + } + break; + }; + // case ASR::binopType::Div: { + // if (a_kind == 4) { + // fn_name = "_lfortran_complex_div_32"; + // } else { + // fn_name = "_lfortran_complex_div_64"; + // } + // break; + // }; + // case ASR::binopType::Pow: { + // if (a_kind == 4) { + // fn_name = "_lfortran_complex_pow_32"; + // } else { + // fn_name = "_lfortran_complex_pow_64"; + // } + // break; + // }; + default: { + throw CodeGenError("ComplexBinOp: Binary operator '" + ASRUtils::binop_to_str_python(x.m_op) + "' not supported", + x.base.base.loc); + } + } + } + void visit_IntegerUnaryMinus(const ASR::IntegerUnaryMinus_t &x) { if (x.m_value) { visit_expr(*x.m_value); @@ -1511,6 +1806,29 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } + void visit_ComplexUnaryMinus(const ASR::ComplexUnaryMinus_t &x) { + if (x.m_value) { + visit_expr(*x.m_value); + return; + } + ASR::Complex_t *f = ASR::down_cast(x.m_type); + if (f->m_kind == 4) { + this->visit_expr(*x.m_arg); + wasm::emit_f32_neg(m_code_section, m_al); + wasm::emit_set_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f32"]); + wasm::emit_f32_neg(m_code_section, m_al); + wasm::emit_get_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f32"]); + } else if (f->m_kind == 8) { + this->visit_expr(*x.m_arg); + wasm::emit_f64_neg(m_code_section, m_al); + wasm::emit_set_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f64"]); + wasm::emit_f64_neg(m_code_section, m_al); + wasm::emit_get_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f64"]); + } else { + throw CodeGenError("ComplexUnaryMinus: Only kind 4 and 8 supported"); + } + } + template int get_kind_from_operands(const T &x) { ASR::ttype_t *left_ttype = ASRUtils::expr_type(x.m_left); @@ -1771,7 +2089,18 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { m_var_name_idx_map[get_hash((ASR::asr_t *)v)]); break; } - + case ASR::ttypeType::Complex: { + LCOMPILERS_ASSERT( + m_var_name_idx_map.find(get_hash((ASR::asr_t *)v)) != + m_var_name_idx_map.end()); + wasm::emit_get_local( + m_code_section, m_al, + m_var_name_idx_map[get_hash((ASR::asr_t *)v)]); // get real part + wasm::emit_get_local( + m_code_section, m_al, + m_var_name_idx_map[get_hash((ASR::asr_t *)v)] + 1); // get imag part + break; + } default: throw CodeGenError( "Only Integer and Float Variable types currently " @@ -1933,11 +2262,23 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { wasm::emit_get_local(m_code_section, m_al, m_var_name_idx_map[get_hash( (ASR::asr_t *)cur_sym_info->return_var)]); + if (!ASRUtils::is_array(cur_sym_info->return_var->m_type) + && ASRUtils::is_complex(*cur_sym_info->return_var->m_type)) { + wasm::emit_get_local(m_code_section, m_al, + m_var_name_idx_map[get_hash( + (ASR::asr_t *)cur_sym_info->return_var)] + 1); + } } else { for (auto return_var : cur_sym_info->referenced_vars) { wasm::emit_get_local( m_code_section, m_al, m_var_name_idx_map[get_hash((ASR::asr_t *)(return_var))]); + if (!ASRUtils::is_array(return_var->m_type) + && ASRUtils::is_complex(*return_var->m_type)) { + wasm::emit_get_local(m_code_section, m_al, + m_var_name_idx_map[get_hash( + (ASR::asr_t *)return_var)] + 1); + } } } wasm::emit_b8(m_code_section, m_al, @@ -1998,6 +2339,25 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } + void visit_ComplexConstant(const ASR::ComplexConstant_t &x) { + int a_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type); + switch( a_kind ) { + case 4: { + wasm::emit_f32_const(m_code_section, m_al, x.m_re); + wasm::emit_f32_const(m_code_section, m_al, x.m_im); + break; + } + case 8: { + wasm::emit_f64_const(m_code_section, m_al, x.m_re); + wasm::emit_f64_const(m_code_section, m_al, x.m_im); + break; + } + default: { + throw CodeGenError("kind type is not supported"); + } + } + } + std::string convert_int_to_bytes_string(int n) { uint8_t bytes[sizeof(n)]; std::memcpy(&bytes, &n, sizeof(n)); @@ -2193,11 +2553,65 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { break; } case (ASR::cast_kindType::RealToComplex): { - throw CodeGenError("Complex types are not supported yet."); + int arg_kind = -1, dest_kind = -1; + extract_kinds(x, arg_kind, dest_kind); + if (arg_kind == dest_kind) { + + } else if (arg_kind == 4 && dest_kind == 8) { + wasm::emit_f64_promote_f32(m_code_section, m_al); + } else if (arg_kind == 8 && dest_kind == 4) { + wasm::emit_f32_demote_f64(m_code_section, m_al); + } else { + std::string msg = "RealToComplex: Conversion from " + + std::to_string(arg_kind) + " to " + + std::to_string(dest_kind) + + " not implemented yet."; + throw CodeGenError(msg); + } + switch(dest_kind) + { + case 4: + wasm::emit_f32_const(m_code_section, m_al, 0.0); + break; + case 8: + wasm::emit_f64_const(m_code_section, m_al, 0.0); + break; + default: + throw CodeGenError("RealToComplex: Only 32 and 64 bits real kinds are supported."); + } break; } case (ASR::cast_kindType::IntegerToComplex): { - throw CodeGenError("Complex types are not supported yet."); + int arg_kind = -1, dest_kind = -1; + extract_kinds(x, arg_kind, dest_kind); + if (arg_kind > 0 && dest_kind > 0) { + if (arg_kind == 4 && dest_kind == 4) { + wasm::emit_f32_convert_i32_s(m_code_section, m_al); + } else if (arg_kind == 8 && dest_kind == 8) { + wasm::emit_f64_convert_i64_s(m_code_section, m_al); + } else if (arg_kind == 4 && dest_kind == 8) { + wasm::emit_f64_convert_i32_s(m_code_section, m_al); + } else if (arg_kind == 8 && dest_kind == 4) { + wasm::emit_f32_convert_i64_s(m_code_section, m_al); + } else { + std::string msg = "IntegerToComplex: Conversion from " + + std::to_string(arg_kind) + " to " + + std::to_string(dest_kind) + + " not implemented yet."; + throw CodeGenError(msg); + } + } + switch(dest_kind) + { + case 4: + wasm::emit_f32_const(m_code_section, m_al, 0.0); + break; + case 8: + wasm::emit_f64_const(m_code_section, m_al, 0.0); + break; + default: + throw CodeGenError("RealToComplex: Only 32 and 64 bits real kinds are supported."); + } break; } case (ASR::cast_kindType::IntegerToLogical): { @@ -2250,7 +2664,29 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { break; } case (ASR::cast_kindType::ComplexToLogical): { - throw CodeGenError("Complex types are not supported yet."); + int arg_kind = -1, dest_kind = -1; + extract_kinds(x, arg_kind, dest_kind); + if (arg_kind == 4) { + if (m_self_func_name_idx_map.find("abs_c32") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["abs_c32"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["abs_c32"]); + wasm::emit_f32_const(m_code_section, m_al, 0.0); + wasm::emit_f32_gt(m_code_section, m_al); + } else if (arg_kind == 8) { + if (m_self_func_name_idx_map.find("abs_c64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["abs_c64"] = no_of_types++; + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["abs_c64"]); + wasm::emit_f64_const(m_code_section, m_al, 0.0); + wasm::emit_f64_gt(m_code_section, m_al); + } else { + std::string msg = "ComplexToLogical: Conversion from kinds " + + std::to_string(arg_kind) + " to " + + std::to_string(dest_kind) + + " not supported"; + throw CodeGenError(msg); + } break; } case (ASR::cast_kindType::LogicalToInteger): { @@ -2269,7 +2705,6 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } break; - break; } case (ASR::cast_kindType::LogicalToReal): { int arg_kind = -1, dest_kind = -1; @@ -2326,11 +2761,11 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { break; } case (ASR::cast_kindType::ComplexToComplex): { - throw CodeGenError("Complex types are not supported yet."); + throw CodeGenError("ComplexToComplex: Complex types are not supported yet."); break; } case (ASR::cast_kindType::ComplexToReal): { - throw CodeGenError("Complex types are not supported yet."); + throw CodeGenError("ComplexToReal: Complex types are not supported yet."); break; } default: @@ -2338,6 +2773,24 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } + void visit_ComplexRe(const ASR::ComplexRe_t &x) { + this->visit_expr(*x.m_arg); + wasm::emit_drop(m_code_section, m_al); + } + + void visit_ComplexIm(const ASR::ComplexIm_t &x) { + this->visit_expr(*x.m_arg); + + int a_kind = ASRUtils::extract_kind_from_ttype_t(ASRUtils::expr_type(x.m_arg)); + wasm::emit_set_global(m_code_section, m_al, + (a_kind == 4) ? m_global_var_name_idx_map["tmp_reg_f32"] + : m_global_var_name_idx_map["tmp_reg_f64"]); + wasm::emit_drop(m_code_section, m_al); + wasm::emit_get_global(m_code_section, m_al, + (a_kind == 4) ? m_global_var_name_idx_map["tmp_reg_f32"] + : m_global_var_name_idx_map["tmp_reg_f64"]); + } + void emit_call_fd_write(int filetype, const std::string &str, int iov_vec_len, int return_val_mem_loc) { wasm::emit_i32_const(m_code_section, m_al, filetype); // file type: 1 for stdout wasm::emit_i32_const(m_code_section, m_al, m_string_to_iov_loc_map[str]); // iov location @@ -2364,15 +2817,18 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { int a_kind = ASRUtils::extract_kind_from_ttype_t(t); if (ASRUtils::is_integer(*t) || ASRUtils::is_logical(*t)) { + if (m_self_func_name_idx_map.find("print_i64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["print_i64"] = no_of_types++; + } this->visit_expr(*x.m_values[i]); switch (a_kind) { case 4: { wasm::emit_i64_extend_i32_s(m_code_section, m_al); - wasm::emit_call(m_code_section, m_al, no_of_imports /* print_i64 */); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_i64"]); break; } case 8: { - wasm::emit_call(m_code_section, m_al, no_of_imports /* print_i64 */); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_i64"]); break; } default: { @@ -2382,15 +2838,21 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { } } } else if (ASRUtils::is_real(*t)) { + if (m_self_func_name_idx_map.find("print_i64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["print_i64"] = no_of_types++; + } + if (m_self_func_name_idx_map.find("print_f64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["print_f64"] = no_of_types++; + } this->visit_expr(*x.m_values[i]); switch (a_kind) { case 4: { wasm::emit_f64_promote_f32(m_code_section, m_al); - wasm::emit_call(m_code_section, m_al, no_of_imports + 1 /* print_f64 */); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_f64"]); break; } case 8: { - wasm::emit_call(m_code_section, m_al, no_of_imports + 1 /* print_f64 */); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_f64"]); break; } default: { @@ -2412,6 +2874,27 @@ class ASRToWASMVisitor : public ASR::BaseVisitor { m_import_func_asr_map["fd_write"])] ->index); wasm::emit_drop(m_code_section, m_al); + } else if (t->type == ASR::ttypeType::Complex) { + if (m_self_func_name_idx_map.find("print_i64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["print_i64"] = no_of_types++; + } + if (m_self_func_name_idx_map.find("print_f64") == m_self_func_name_idx_map.end()) { + m_self_func_name_idx_map["print_f64"] = no_of_types++; + } + emit_call_fd_write(1, "(", 1, 0); + this->visit_expr(*x.m_values[i]); + if (a_kind == 4) { + wasm::emit_f64_promote_f32(m_code_section, m_al); + wasm::emit_set_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f64"]); + wasm::emit_f64_promote_f32(m_code_section, m_al); + } else { + wasm::emit_set_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f64"]); + } + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_f64"]); + emit_call_fd_write(1, ",", 1, 0); + wasm::emit_get_global(m_code_section, m_al, m_global_var_name_idx_map["tmp_reg_f64"]); + wasm::emit_call(m_code_section, m_al, m_self_func_name_idx_map["print_f64"]); + emit_call_fd_write(1, ")", 1, 0); } } diff --git a/src/libasr/codegen/wasm_decoder.h b/src/libasr/codegen/wasm_decoder.h index 69afe6854a..9edb61080d 100644 --- a/src/libasr/codegen/wasm_decoder.h +++ b/src/libasr/codegen/wasm_decoder.h @@ -109,10 +109,9 @@ class WASMDecoder { func_types.resize(al, no_of_func_types); for (uint32_t i = 0; i < no_of_func_types; i++) { - if (wasm_bytes[offset] != 0x60) { + if (read_b8(wasm_bytes, offset) != 0x60) { throw CodeGenError("Invalid type section"); } - offset++; // read result type 1 uint32_t no_of_params = read_u32(wasm_bytes, offset); @@ -234,6 +233,20 @@ class WASMDecoder { globals.p[i].type = read_b8(wasm_bytes, offset); globals.p[i].mut = read_b8(wasm_bytes, offset); globals.p[i].insts_start_idx = offset; + + wasm::read_b8(wasm_bytes, offset); + switch (globals[i].type) + { + case 0x7F: wasm::read_i32(wasm_bytes, offset); break; + case 0x7E: wasm::read_i64(wasm_bytes, offset); break; + case 0x7D: wasm::read_f32(wasm_bytes, offset); break; + case 0x7C: wasm::read_f64(wasm_bytes, offset); break; + default: throw CodeGenError("decode_global_section: Unsupport global type"); break; + } + + if (read_b8(wasm_bytes, offset) != 0x0B) { + throw AssemblerError("decode_global_section: Invalid byte for expr end"); + } } } diff --git a/src/libasr/codegen/wasm_to_wat.cpp b/src/libasr/codegen/wasm_to_wat.cpp index 67e63a76c9..25bff32dfb 100644 --- a/src/libasr/codegen/wasm_to_wat.cpp +++ b/src/libasr/codegen/wasm_to_wat.cpp @@ -350,8 +350,10 @@ class WATVisitor : public WASMDecoder, decode_instructions(); global_initialization_insts = this->src; } + std::string global_type = ((globals[i].mut == 0x00) ? var_type_to_string[globals[i].type]: + "(mut " + var_type_to_string[globals[i].type] + ")" ); result += indent + "(global $" + std::to_string(i); - result += " " + var_type_to_string[globals[i].type]; + result += " " + global_type; result += " (" + global_initialization_insts + "))"; } diff --git a/tests/reference/asr-test_complex-70f026c.json b/tests/reference/asr-test_complex-70f026c.json deleted file mode 100644 index 874b48bd2e..0000000000 --- a/tests/reference/asr-test_complex-70f026c.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "basename": "asr-test_complex-70f026c", - "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", - "infile": "tests/../integration_tests/test_complex.py", - "infile_hash": "0c9a9dbec41e0ad2e587ebdfc9a19e0fdb4a547747f25ac008f31175", - "outfile": null, - "outfile_hash": null, - "stdout": "asr-test_complex-70f026c.stdout", - "stdout_hash": "7e1e9fcdc73c6fcf6156e3b19ffc2f84af2e73490a7b963dad70425b", - "stderr": null, - "stderr_hash": null, - "returncode": 0 -} \ No newline at end of file diff --git a/tests/reference/asr-test_complex-70f026c.stdout b/tests/reference/asr-test_complex-70f026c.stdout deleted file mode 100644 index 1377faecd5..0000000000 --- a/tests/reference/asr-test_complex-70f026c.stdout +++ /dev/null @@ -1 +0,0 @@ -(TranslationUnit (SymbolTable 1 {_lpython_main_program: (Function (SymbolTable 104 {}) _lpython_main_program (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [check] [] [(SubroutineCall 1 check () [] ())] () Public .false. .false.), check: (Function (SymbolTable 9 {}) check (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [test_real_imag test_complex test_complex_abs test_complex_binop_32 test_complex_binop_64 test_complex_unary_minus test_complex_not] [] [(SubroutineCall 1 test_real_imag () [] ()) (SubroutineCall 1 test_complex () [] ()) (SubroutineCall 1 test_complex_abs () [] ()) (SubroutineCall 1 test_complex_binop_32 () [] ()) (SubroutineCall 1 test_complex_binop_64 () [] ()) (SubroutineCall 1 test_complex_unary_minus () [] ()) (SubroutineCall 1 test_complex_not () [] ())] () Public .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 103 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), test_complex: (Function (SymbolTable 3 {a: (Variable 3 a [] Local () () Default (Real 8 []) Source Public Required .false.), a2: (Variable 3 a2 [] Local () () Default (Real 4 []) Source Public Required .false.), a3: (Variable 3 a3 [] Local () () Default (Real 4 []) Source Public Required .false.), abs: (ExternalSymbol 3 abs 11 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 3 abs@__lpython_overloaded_0__abs 11 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), abs@__lpython_overloaded_1__abs: (ExternalSymbol 3 abs@__lpython_overloaded_1__abs 11 __lpython_overloaded_1__abs lpython_builtin [] __lpython_overloaded_1__abs Public), complex: (ExternalSymbol 3 complex 11 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_10__complex: (ExternalSymbol 3 complex@__lpython_overloaded_10__complex 11 __lpython_overloaded_10__complex lpython_builtin [] __lpython_overloaded_10__complex Public), complex@__lpython_overloaded_11__complex: (ExternalSymbol 3 complex@__lpython_overloaded_11__complex 11 __lpython_overloaded_11__complex lpython_builtin [] __lpython_overloaded_11__complex Public), complex@__lpython_overloaded_12__complex: (ExternalSymbol 3 complex@__lpython_overloaded_12__complex 11 __lpython_overloaded_12__complex lpython_builtin [] __lpython_overloaded_12__complex Public), complex@__lpython_overloaded_13__complex: (ExternalSymbol 3 complex@__lpython_overloaded_13__complex 11 __lpython_overloaded_13__complex lpython_builtin [] __lpython_overloaded_13__complex Public), complex@__lpython_overloaded_14__complex: (ExternalSymbol 3 complex@__lpython_overloaded_14__complex 11 __lpython_overloaded_14__complex lpython_builtin [] __lpython_overloaded_14__complex Public), complex@__lpython_overloaded_5__complex: (ExternalSymbol 3 complex@__lpython_overloaded_5__complex 11 __lpython_overloaded_5__complex lpython_builtin [] __lpython_overloaded_5__complex Public), complex@__lpython_overloaded_6__complex: (ExternalSymbol 3 complex@__lpython_overloaded_6__complex 11 __lpython_overloaded_6__complex lpython_builtin [] __lpython_overloaded_6__complex Public), complex@__lpython_overloaded_7__complex: (ExternalSymbol 3 complex@__lpython_overloaded_7__complex 11 __lpython_overloaded_7__complex lpython_builtin [] __lpython_overloaded_7__complex Public), complex@__lpython_overloaded_8__complex: (ExternalSymbol 3 complex@__lpython_overloaded_8__complex 11 __lpython_overloaded_8__complex lpython_builtin [] __lpython_overloaded_8__complex Public), complex@__lpython_overloaded_9__complex: (ExternalSymbol 3 complex@__lpython_overloaded_9__complex 11 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public), eps: (Variable 3 eps [] Local () () Default (Real 8 []) Source Public Required .false.), i1: (Variable 3 i1 [] Local () () Default (Integer 4 []) Source Public Required .false.), i2: (Variable 3 i2 [] Local () () Default (Integer 8 []) Source Public Required .false.), x: (Variable 3 x [] Local () () Default (Complex 8 []) Source Public Required .false.), x2: (Variable 3 x2 [] Local () () Default (Complex 4 []) Source Public Required .false.)}) test_complex (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_13__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_14__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_6__complex abs@__lpython_overloaded_1__abs complex@__lpython_overloaded_7__complex complex@__lpython_overloaded_8__complex complex@__lpython_overloaded_11__complex complex@__lpython_overloaded_9__complex complex@__lpython_overloaded_10__complex complex@__lpython_overloaded_12__complex] [] [(= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_5__complex 3 complex [((RealConstant 4.500000 (Real 8 []))) ((RealConstant 6.700000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 4.500000 6.700000 (Complex 8 [])) ()) ()) (= (Var 3 eps) (RealConstant 0.000000 (Real 8 [])) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 4.500000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 6.700000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_9__complex 3 complex [((IntegerUnaryMinus (IntegerConstant 4 (Integer 4 [])) (Integer 4 []) (IntegerConstant -4 (Integer 4 [])))) ((IntegerConstant 2 (Integer 4 [])))] (Complex 8 []) (ComplexConstant -4.000000 2.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.000000 (Real 8 [])) (Real 8 []) (RealConstant -4.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 2.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_13__complex 3 complex [((IntegerConstant 4 (Integer 4 []))) ((RealConstant 7.890000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 4.000000 7.890000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 4.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 7.890000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_14__complex 3 complex [((RealConstant 5.600000 (Real 8 []))) ((IntegerConstant 0 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 5.600000 0.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 5.600000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 0.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 a) (RealConstant 534.600000 (Real 8 [])) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_5__complex 3 complex [((Var 3 a)) ((RealUnaryMinus (Var 3 a) (Real 8 []) ()))] (Complex 8 []) () ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 534.600000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 534.600000 (Real 8 [])) (Real 8 []) (RealConstant -534.600000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 a2) (RealUnaryMinus (Cast (RealConstant 423.543081 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 423.543081 (Real 4 []))) (Real 4 []) (RealConstant -423.543081 (Real 4 []))) ()) (= (Var 3 a3) (Cast (RealConstant 34.500000 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 34.500000 (Real 4 []))) ()) (= (Var 3 x2) (FunctionCall 3 complex@__lpython_overloaded_6__complex 3 complex [((Var 3 a2)) ((Var 3 a3))] (Complex 4 []) () ()) ()) (Assert (RealCompare (Cast (FunctionCall 3 abs@__lpython_overloaded_1__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x2) (Real 4 []) ()) Sub (Cast (RealConstant 34.500000 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 34.500000 (Real 4 []))) (Real 4 []) ()))] (Real 4 []) () ()) RealToReal (Real 8 []) ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 i1) (IntegerUnaryMinus (IntegerConstant 5 (Integer 4 [])) (Integer 4 []) (IntegerConstant -5 (Integer 4 []))) ()) (= (Var 3 i2) (IntegerUnaryMinus (Cast (IntegerConstant 6 (Integer 4 [])) IntegerToInteger (Integer 8 []) (IntegerConstant 6 (Integer 8 []))) (Integer 8 []) (IntegerConstant -6 (Integer 8 []))) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_7__complex 3 complex [((Var 3 a3)) ((Var 3 a))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_8__complex 3 complex [((Var 3 a)) ((Var 3 a3))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_11__complex 3 complex [((Var 3 i1)) ((Var 3 i2))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_9__complex 3 complex [((Var 3 i1)) ((IntegerUnaryMinus (Var 3 i1) (Integer 4 []) ()))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_10__complex 3 complex [((IntegerUnaryMinus (Var 3 i2) (Integer 8 []) ())) ((IntegerUnaryMinus (Var 3 i2) (Integer 8 []) ()))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_12__complex 3 complex [((Var 3 i2)) ((IntegerUnaryMinus (Var 3 i1) (Integer 4 []) ()))] (Complex 8 []) () ()) ())] () Public .false. .false.), test_complex_abs: (Function (SymbolTable 4 {abs: (ExternalSymbol 4 abs 11 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 4 abs@__lpython_overloaded_0__abs 11 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), abs@__lpython_overloaded_7__abs: (ExternalSymbol 4 abs@__lpython_overloaded_7__abs 11 __lpython_overloaded_7__abs lpython_builtin [] __lpython_overloaded_7__abs Public), abs@__lpython_overloaded_8__abs: (ExternalSymbol 4 abs@__lpython_overloaded_8__abs 11 __lpython_overloaded_8__abs lpython_builtin [] __lpython_overloaded_8__abs Public), complex: (ExternalSymbol 4 complex 11 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_9__complex: (ExternalSymbol 4 complex@__lpython_overloaded_9__complex 11 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public), eps: (Variable 4 eps [] Local () () Default (Real 8 []) Source Public Required .false.), x: (Variable 4 x [] Local () () Default (Complex 4 []) Source Public Required .false.), y: (Variable 4 y [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_complex_abs (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_7__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_8__abs] [] [(= (Var 4 x) (Cast (FunctionCall 4 complex@__lpython_overloaded_9__complex 4 complex [((IntegerConstant 3 (Integer 4 []))) ((IntegerConstant 4 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 3.000000 4.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 3.000000 4.000000 (Complex 4 []))) ()) (= (Var 4 eps) (RealConstant 0.000000 (Real 8 [])) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (Cast (FunctionCall 4 abs@__lpython_overloaded_7__abs 4 abs [((Var 4 x))] (Real 4 []) () ()) RealToReal (Real 8 []) ()) Sub (RealConstant 5.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 4 eps) (Logical 4 []) ()) ()) (= (Var 4 y) (FunctionCall 4 complex@__lpython_overloaded_9__complex 4 complex [((IntegerConstant 6 (Integer 4 []))) ((IntegerConstant 8 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 6.000000 8.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (FunctionCall 4 abs@__lpython_overloaded_8__abs 4 abs [((Var 4 y))] (Real 8 []) () ()) Sub (RealConstant 10.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 4 eps) (Logical 4 []) ()) ())] () Public .false. .false.), test_complex_binop_32: (Function (SymbolTable 5 {x: (Variable 5 x [] Local () () Default (Complex 4 []) Source Public Required .false.), y: (Variable 5 y [] Local () () Default (Complex 4 []) Source Public Required .false.), z: (Variable 5 z [] Local () () Default (Complex 4 []) Source Public Required .false.)}) test_complex_binop_32 (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [] [] [(= (Var 5 x) (Cast (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ComplexToComplex (Complex 4 []) (ComplexConstant 2.000000 3.000000 (Complex 4 []))) ()) (= (Var 5 y) (Cast (ComplexBinOp (Cast (IntegerConstant 4 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 4.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 5.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 []))) ComplexToComplex (Complex 4 []) (ComplexConstant 4.000000 5.000000 (Complex 4 []))) ()) (= (Var 5 z) (ComplexBinOp (Var 5 x) Add (Var 5 y) (Complex 4 []) ()) ()) (= (Var 5 z) (ComplexBinOp (Var 5 x) Sub (Var 5 y) (Complex 4 []) ()) ()) (= (Var 5 z) (ComplexBinOp (Var 5 x) Mul (Var 5 y) (Complex 4 []) ()) ()) (= (Var 5 z) (ComplexBinOp (Var 5 x) Pow (Var 5 y) (Complex 4 []) ()) ())] () Public .false. .false.), test_complex_binop_64: (Function (SymbolTable 6 {x: (Variable 6 x [] Local () () Default (Complex 8 []) Source Public Required .false.), y: (Variable 6 y [] Local () () Default (Complex 8 []) Source Public Required .false.), z: (Variable 6 z [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_complex_binop_64 (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [] [] [(= (Var 6 x) (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ()) (= (Var 6 y) (ComplexBinOp (Cast (IntegerConstant 4 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 4.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 5.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 []))) ()) (= (Var 6 z) (ComplexBinOp (Var 6 x) Add (Var 6 y) (Complex 8 []) ()) ()) (= (Var 6 z) (ComplexBinOp (Var 6 x) Sub (Var 6 y) (Complex 8 []) ()) ()) (= (Var 6 z) (ComplexBinOp (Var 6 x) Mul (Var 6 y) (Complex 8 []) ()) ()) (= (Var 6 z) (ComplexBinOp (Var 6 x) Pow (Var 6 y) (Complex 8 []) ()) ())] () Public .false. .false.), test_complex_not: (Function (SymbolTable 8 {b: (Variable 8 b [] Local () () Default (Logical 4 []) Source Public Required .false.), c: (Variable 8 c [] Local () () Default (Complex 4 []) Source Public Required .false.), c2: (Variable 8 c2 [] Local () () Default (Complex 8 []) Source Public Required .false.), complex: (ExternalSymbol 8 complex 11 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_9__complex: (ExternalSymbol 8 complex@__lpython_overloaded_9__complex 11 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public)}) test_complex_not (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_9__complex complex@__lpython_overloaded_9__complex] [] [(= (Var 8 c) (Cast (FunctionCall 8 complex@__lpython_overloaded_9__complex 8 complex [((IntegerConstant 4 (Integer 4 []))) ((IntegerConstant 5 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 4.000000 5.000000 (Complex 4 []))) ()) (= (Var 8 b) (LogicalNot (Cast (Var 8 c) ComplexToLogical (Logical 4 []) ()) (Logical 4 []) ()) ()) (Assert (LogicalNot (Var 8 b) (Logical 4 []) ()) ()) (= (Var 8 c2) (FunctionCall 8 complex@__lpython_overloaded_9__complex 8 complex [((IntegerConstant 0 (Integer 4 []))) ((IntegerConstant 0 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 0.000000 0.000000 (Complex 8 [])) ()) ()) (= (Var 8 b) (LogicalNot (Cast (Var 8 c2) ComplexToLogical (Logical 4 []) ()) (Logical 4 []) ()) ()) (Assert (Var 8 b) ())] () Public .false. .false.), test_complex_unary_minus: (Function (SymbolTable 7 {_c: (Variable 7 _c [] Local () () Default (Complex 4 []) Source Public Required .false.), abs: (ExternalSymbol 7 abs 11 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 7 abs@__lpython_overloaded_0__abs 11 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), c: (Variable 7 c [] Local () () Default (Complex 4 []) Source Public Required .false.), c2: (Variable 7 c2 [] Local () () Default (Complex 8 []) Source Public Required .false.), complex: (ExternalSymbol 7 complex 11 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_13__complex: (ExternalSymbol 7 complex@__lpython_overloaded_13__complex 11 __lpython_overloaded_13__complex lpython_builtin [] __lpython_overloaded_13__complex Public), complex@__lpython_overloaded_5__complex: (ExternalSymbol 7 complex@__lpython_overloaded_5__complex 11 __lpython_overloaded_5__complex lpython_builtin [] __lpython_overloaded_5__complex Public), complex@__lpython_overloaded_9__complex: (ExternalSymbol 7 complex@__lpython_overloaded_9__complex 11 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public)}) test_complex_unary_minus (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_13__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs] [] [(= (Var 7 c) (Cast (FunctionCall 7 complex@__lpython_overloaded_13__complex 7 complex [((IntegerConstant 3 (Integer 4 []))) ((RealConstant 4.500000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 3.000000 4.500000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 3.000000 4.500000 (Complex 4 []))) ()) (= (Var 7 _c) (ComplexUnaryMinus (Var 7 c) (Complex 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (Cast (ComplexRe (Var 7 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 3.000000 (Real 8 [])) (Real 8 []) (RealConstant -3.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (Cast (ComplexIm (Var 7 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.500000 (Real 8 [])) (Real 8 []) (RealConstant -4.500000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 7 _c) (Cast (FunctionCall 7 complex@__lpython_overloaded_9__complex 7 complex [((IntegerConstant 5 (Integer 4 []))) ((IntegerUnaryMinus (IntegerConstant 78 (Integer 4 [])) (Integer 4 []) (IntegerConstant -78 (Integer 4 []))))] (Complex 8 []) (ComplexConstant 5.000000 -78.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 5.000000 -78.000000 (Complex 4 []))) ()) (= (Var 7 _c) (ComplexUnaryMinus (Var 7 _c) (Complex 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (Cast (ComplexRe (Var 7 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 5.000000 (Real 8 [])) (Real 8 []) (RealConstant -5.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (Cast (ComplexIm (Var 7 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealConstant 78.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 7 c2) (FunctionCall 7 complex@__lpython_overloaded_5__complex 7 complex [((RealUnaryMinus (RealConstant 4.500000 (Real 8 [])) (Real 8 []) (RealConstant -4.500000 (Real 8 [])))) ((RealUnaryMinus (RealConstant 7.800000 (Real 8 [])) (Real 8 []) (RealConstant -7.800000 (Real 8 []))))] (Complex 8 []) (ComplexConstant -4.500000 -7.800000 (Complex 8 [])) ()) ()) (= (Var 7 c2) (ComplexUnaryMinus (Var 7 c2) (Complex 8 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (ComplexRe (Var 7 c2) (Real 8 []) ()) Sub (RealConstant 4.500000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (ComplexIm (Var 7 c2) (Real 8 []) ()) Sub (RealConstant 7.800000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 7 c2) (ComplexBinOp (Cast (IntegerConstant 3 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 3.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 4.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 3.000000 4.000000 (Complex 8 []))) ()) (= (Var 7 c2) (ComplexUnaryMinus (Var 7 c2) (Complex 8 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (ComplexRe (Var 7 c2) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 3.000000 (Real 8 [])) (Real 8 []) (RealConstant -3.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 7 abs@__lpython_overloaded_0__abs 7 abs [((RealBinOp (ComplexIm (Var 7 c2) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.000000 (Real 8 [])) (Real 8 []) (RealConstant -4.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) Lt (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ())] () Public .false. .false.), test_real_imag: (Function (SymbolTable 2 {a: (Variable 2 a [] Local () () Default (Real 8 []) Source Public Required .false.), abs: (ExternalSymbol 2 abs 11 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 2 abs@__lpython_overloaded_0__abs 11 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), b: (Variable 2 b [] Local () () Default (Real 8 []) Source Public Required .false.), eps: (Variable 2 eps [] Local () () Default (Real 8 []) Source Public Required .false.), x: (Variable 2 x [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_real_imag (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs] [] [(= (Var 2 x) (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ()) (= (Var 2 eps) (RealConstant 0.000000 (Real 8 [])) ()) (= (Var 2 a) (ComplexRe (Var 2 x) (Real 8 []) ()) ()) (= (Var 2 b) (ComplexIm (Var 2 x) (Real 8 []) ()) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (Var 2 a) Sub (RealConstant 2.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 2 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (Var 2 b) Sub (RealConstant 3.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 2 eps) (Logical 4 []) ()) ())] () Public .false. .false.)}) []) diff --git a/tests/reference/asr-test_complex_01-a6def58.json b/tests/reference/asr-test_complex_01-a6def58.json new file mode 100644 index 0000000000..1c2d32eeca --- /dev/null +++ b/tests/reference/asr-test_complex_01-a6def58.json @@ -0,0 +1,13 @@ +{ + "basename": "asr-test_complex_01-a6def58", + "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", + "infile": "tests/../integration_tests/test_complex_01.py", + "infile_hash": "9bb8005b8d6c2f5c13d1df7533848eafe15b52f762aa9d889e818ae5", + "outfile": null, + "outfile_hash": null, + "stdout": "asr-test_complex_01-a6def58.stdout", + "stdout_hash": "3fcef1d469f3adec704e871e734661939f8b2859f643f47268962c66", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/asr-test_complex_01-a6def58.stdout b/tests/reference/asr-test_complex_01-a6def58.stdout new file mode 100644 index 0000000000..5e6cad21a7 --- /dev/null +++ b/tests/reference/asr-test_complex_01-a6def58.stdout @@ -0,0 +1 @@ +(TranslationUnit (SymbolTable 1 {_lpython_main_program: (Function (SymbolTable 101 {}) _lpython_main_program (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [check] [] [(SubroutineCall 1 check () [] ())] () Public .false. .false.), check: (Function (SymbolTable 6 {}) check (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [test_real_imag test_complex test_complex_unary_minus test_complex_not] [] [(SubroutineCall 1 test_real_imag () [] ()) (SubroutineCall 1 test_complex () [] ()) (SubroutineCall 1 test_complex_unary_minus () [] ()) (SubroutineCall 1 test_complex_not () [] ())] () Public .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 100 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), test_complex: (Function (SymbolTable 3 {a: (Variable 3 a [] Local () () Default (Real 8 []) Source Public Required .false.), a2: (Variable 3 a2 [] Local () () Default (Real 4 []) Source Public Required .false.), a3: (Variable 3 a3 [] Local () () Default (Real 4 []) Source Public Required .false.), abs: (ExternalSymbol 3 abs 8 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 3 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), abs@__lpython_overloaded_1__abs: (ExternalSymbol 3 abs@__lpython_overloaded_1__abs 8 __lpython_overloaded_1__abs lpython_builtin [] __lpython_overloaded_1__abs Public), complex: (ExternalSymbol 3 complex 8 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_10__complex: (ExternalSymbol 3 complex@__lpython_overloaded_10__complex 8 __lpython_overloaded_10__complex lpython_builtin [] __lpython_overloaded_10__complex Public), complex@__lpython_overloaded_11__complex: (ExternalSymbol 3 complex@__lpython_overloaded_11__complex 8 __lpython_overloaded_11__complex lpython_builtin [] __lpython_overloaded_11__complex Public), complex@__lpython_overloaded_12__complex: (ExternalSymbol 3 complex@__lpython_overloaded_12__complex 8 __lpython_overloaded_12__complex lpython_builtin [] __lpython_overloaded_12__complex Public), complex@__lpython_overloaded_13__complex: (ExternalSymbol 3 complex@__lpython_overloaded_13__complex 8 __lpython_overloaded_13__complex lpython_builtin [] __lpython_overloaded_13__complex Public), complex@__lpython_overloaded_14__complex: (ExternalSymbol 3 complex@__lpython_overloaded_14__complex 8 __lpython_overloaded_14__complex lpython_builtin [] __lpython_overloaded_14__complex Public), complex@__lpython_overloaded_5__complex: (ExternalSymbol 3 complex@__lpython_overloaded_5__complex 8 __lpython_overloaded_5__complex lpython_builtin [] __lpython_overloaded_5__complex Public), complex@__lpython_overloaded_6__complex: (ExternalSymbol 3 complex@__lpython_overloaded_6__complex 8 __lpython_overloaded_6__complex lpython_builtin [] __lpython_overloaded_6__complex Public), complex@__lpython_overloaded_7__complex: (ExternalSymbol 3 complex@__lpython_overloaded_7__complex 8 __lpython_overloaded_7__complex lpython_builtin [] __lpython_overloaded_7__complex Public), complex@__lpython_overloaded_8__complex: (ExternalSymbol 3 complex@__lpython_overloaded_8__complex 8 __lpython_overloaded_8__complex lpython_builtin [] __lpython_overloaded_8__complex Public), complex@__lpython_overloaded_9__complex: (ExternalSymbol 3 complex@__lpython_overloaded_9__complex 8 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public), eps: (Variable 3 eps [] Local () () Default (Real 8 []) Source Public Required .false.), i1: (Variable 3 i1 [] Local () () Default (Integer 4 []) Source Public Required .false.), i2: (Variable 3 i2 [] Local () () Default (Integer 8 []) Source Public Required .false.), x: (Variable 3 x [] Local () () Default (Complex 8 []) Source Public Required .false.), x2: (Variable 3 x2 [] Local () () Default (Complex 4 []) Source Public Required .false.)}) test_complex (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_13__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_14__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_6__complex abs@__lpython_overloaded_1__abs complex@__lpython_overloaded_7__complex complex@__lpython_overloaded_8__complex complex@__lpython_overloaded_11__complex complex@__lpython_overloaded_9__complex complex@__lpython_overloaded_10__complex complex@__lpython_overloaded_12__complex] [] [(= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_5__complex 3 complex [((RealConstant 4.500000 (Real 8 []))) ((RealConstant 6.700000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 4.500000 6.700000 (Complex 8 [])) ()) ()) (= (Var 3 eps) (RealConstant 0.000000 (Real 8 [])) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 4.500000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 6.700000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_9__complex 3 complex [((IntegerUnaryMinus (IntegerConstant 4 (Integer 4 [])) (Integer 4 []) (IntegerConstant -4 (Integer 4 [])))) ((IntegerConstant 2 (Integer 4 [])))] (Complex 8 []) (ComplexConstant -4.000000 2.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.000000 (Real 8 [])) (Real 8 []) (RealConstant -4.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 2.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_13__complex 3 complex [((IntegerConstant 4 (Integer 4 []))) ((RealConstant 7.890000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 4.000000 7.890000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 4.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 7.890000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_14__complex 3 complex [((RealConstant 5.600000 (Real 8 []))) ((IntegerConstant 0 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 5.600000 0.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 5.600000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealConstant 0.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 a) (RealConstant 534.600000 (Real 8 [])) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_5__complex 3 complex [((Var 3 a)) ((RealUnaryMinus (Var 3 a) (Real 8 []) ()))] (Complex 8 []) () ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexRe (Var 3 x) (Real 8 []) ()) Sub (RealConstant 534.600000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 3 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 534.600000 (Real 8 [])) (Real 8 []) (RealConstant -534.600000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 a2) (RealUnaryMinus (Cast (RealConstant 423.543081 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 423.543081 (Real 4 []))) (Real 4 []) (RealConstant -423.543081 (Real 4 []))) ()) (= (Var 3 a3) (Cast (RealConstant 34.500000 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 34.500000 (Real 4 []))) ()) (= (Var 3 x2) (FunctionCall 3 complex@__lpython_overloaded_6__complex 3 complex [((Var 3 a2)) ((Var 3 a3))] (Complex 4 []) () ()) ()) (Assert (RealCompare (Cast (FunctionCall 3 abs@__lpython_overloaded_1__abs 3 abs [((RealBinOp (ComplexIm (Var 3 x2) (Real 4 []) ()) Sub (Cast (RealConstant 34.500000 (Real 8 [])) RealToReal (Real 4 []) (RealConstant 34.500000 (Real 4 []))) (Real 4 []) ()))] (Real 4 []) () ()) RealToReal (Real 8 []) ()) LtE (Var 3 eps) (Logical 4 []) ()) ()) (= (Var 3 i1) (IntegerUnaryMinus (IntegerConstant 5 (Integer 4 [])) (Integer 4 []) (IntegerConstant -5 (Integer 4 []))) ()) (= (Var 3 i2) (IntegerUnaryMinus (Cast (IntegerConstant 6 (Integer 4 [])) IntegerToInteger (Integer 8 []) (IntegerConstant 6 (Integer 8 []))) (Integer 8 []) (IntegerConstant -6 (Integer 8 []))) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_7__complex 3 complex [((Var 3 a3)) ((Var 3 a))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_8__complex 3 complex [((Var 3 a)) ((Var 3 a3))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_11__complex 3 complex [((Var 3 i1)) ((Var 3 i2))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_9__complex 3 complex [((Var 3 i1)) ((IntegerUnaryMinus (Var 3 i1) (Integer 4 []) ()))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_10__complex 3 complex [((IntegerUnaryMinus (Var 3 i2) (Integer 8 []) ())) ((IntegerUnaryMinus (Var 3 i2) (Integer 8 []) ()))] (Complex 8 []) () ()) ()) (= (Var 3 x) (FunctionCall 3 complex@__lpython_overloaded_12__complex 3 complex [((Var 3 i2)) ((IntegerUnaryMinus (Var 3 i1) (Integer 4 []) ()))] (Complex 8 []) () ()) ())] () Public .false. .false.), test_complex_not: (Function (SymbolTable 5 {b: (Variable 5 b [] Local () () Default (Logical 4 []) Source Public Required .false.), c: (Variable 5 c [] Local () () Default (Complex 4 []) Source Public Required .false.), c2: (Variable 5 c2 [] Local () () Default (Complex 8 []) Source Public Required .false.), complex: (ExternalSymbol 5 complex 8 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_9__complex: (ExternalSymbol 5 complex@__lpython_overloaded_9__complex 8 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public)}) test_complex_not (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_9__complex complex@__lpython_overloaded_9__complex] [] [(= (Var 5 c) (Cast (FunctionCall 5 complex@__lpython_overloaded_9__complex 5 complex [((IntegerConstant 4 (Integer 4 []))) ((IntegerConstant 5 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 4.000000 5.000000 (Complex 4 []))) ()) (= (Var 5 b) (LogicalNot (Cast (Var 5 c) ComplexToLogical (Logical 4 []) ()) (Logical 4 []) ()) ()) (Assert (LogicalNot (Var 5 b) (Logical 4 []) ()) ()) (= (Var 5 c2) (FunctionCall 5 complex@__lpython_overloaded_9__complex 5 complex [((IntegerConstant 0 (Integer 4 []))) ((IntegerConstant 0 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 0.000000 0.000000 (Complex 8 [])) ()) ()) (= (Var 5 b) (LogicalNot (Cast (Var 5 c2) ComplexToLogical (Logical 4 []) ()) (Logical 4 []) ()) ()) (Assert (Var 5 b) ())] () Public .false. .false.), test_complex_unary_minus: (Function (SymbolTable 4 {_c: (Variable 4 _c [] Local () () Default (Complex 4 []) Source Public Required .false.), abs: (ExternalSymbol 4 abs 8 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 4 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), c: (Variable 4 c [] Local () () Default (Complex 4 []) Source Public Required .false.), c2: (Variable 4 c2 [] Local () () Default (Complex 8 []) Source Public Required .false.), complex: (ExternalSymbol 4 complex 8 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_13__complex: (ExternalSymbol 4 complex@__lpython_overloaded_13__complex 8 __lpython_overloaded_13__complex lpython_builtin [] __lpython_overloaded_13__complex Public), complex@__lpython_overloaded_5__complex: (ExternalSymbol 4 complex@__lpython_overloaded_5__complex 8 __lpython_overloaded_5__complex lpython_builtin [] __lpython_overloaded_5__complex Public), complex@__lpython_overloaded_9__complex: (ExternalSymbol 4 complex@__lpython_overloaded_9__complex 8 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public)}) test_complex_unary_minus (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_13__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs complex@__lpython_overloaded_5__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs] [] [(= (Var 4 c) (Cast (FunctionCall 4 complex@__lpython_overloaded_13__complex 4 complex [((IntegerConstant 3 (Integer 4 []))) ((RealConstant 4.500000 (Real 8 [])))] (Complex 8 []) (ComplexConstant 3.000000 4.500000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 3.000000 4.500000 (Complex 4 []))) ()) (= (Var 4 _c) (ComplexUnaryMinus (Var 4 c) (Complex 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (Cast (ComplexRe (Var 4 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 3.000000 (Real 8 [])) (Real 8 []) (RealConstant -3.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (Cast (ComplexIm (Var 4 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.500000 (Real 8 [])) (Real 8 []) (RealConstant -4.500000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 4 _c) (Cast (FunctionCall 4 complex@__lpython_overloaded_9__complex 4 complex [((IntegerConstant 5 (Integer 4 []))) ((IntegerUnaryMinus (IntegerConstant 78 (Integer 4 [])) (Integer 4 []) (IntegerConstant -78 (Integer 4 []))))] (Complex 8 []) (ComplexConstant 5.000000 -78.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 5.000000 -78.000000 (Complex 4 []))) ()) (= (Var 4 _c) (ComplexUnaryMinus (Var 4 _c) (Complex 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (Cast (ComplexRe (Var 4 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 5.000000 (Real 8 [])) (Real 8 []) (RealConstant -5.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (Cast (ComplexIm (Var 4 _c) (Real 4 []) ()) RealToReal (Real 8 []) ()) Sub (RealConstant 78.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 4 c2) (FunctionCall 4 complex@__lpython_overloaded_5__complex 4 complex [((RealUnaryMinus (RealConstant 4.500000 (Real 8 [])) (Real 8 []) (RealConstant -4.500000 (Real 8 [])))) ((RealUnaryMinus (RealConstant 7.800000 (Real 8 [])) (Real 8 []) (RealConstant -7.800000 (Real 8 []))))] (Complex 8 []) (ComplexConstant -4.500000 -7.800000 (Complex 8 [])) ()) ()) (= (Var 4 c2) (ComplexUnaryMinus (Var 4 c2) (Complex 8 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (ComplexRe (Var 4 c2) (Real 8 []) ()) Sub (RealConstant 4.500000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (ComplexIm (Var 4 c2) (Real 8 []) ()) Sub (RealConstant 7.800000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 4 c2) (ComplexBinOp (Cast (IntegerConstant 3 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 3.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 4.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 3.000000 4.000000 (Complex 8 []))) ()) (= (Var 4 c2) (ComplexUnaryMinus (Var 4 c2) (Complex 8 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (ComplexRe (Var 4 c2) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 3.000000 (Real 8 [])) (Real 8 []) (RealConstant -3.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 4 abs@__lpython_overloaded_0__abs 4 abs [((RealBinOp (ComplexIm (Var 4 c2) (Real 8 []) ()) Sub (RealUnaryMinus (RealConstant 4.000000 (Real 8 [])) (Real 8 []) (RealConstant -4.000000 (Real 8 []))) (Real 8 []) ()))] (Real 8 []) () ()) LtE (RealConstant 0.000000 (Real 8 [])) (Logical 4 []) ()) ())] () Public .false. .false.), test_real_imag: (Function (SymbolTable 2 {a: (Variable 2 a [] Local () () Default (Real 8 []) Source Public Required .false.), abs: (ExternalSymbol 2 abs 8 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 2 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), b: (Variable 2 b [] Local () () Default (Real 8 []) Source Public Required .false.), eps: (Variable 2 eps [] Local () () Default (Real 8 []) Source Public Required .false.), x: (Variable 2 x [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_real_imag (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_0__abs] [] [(= (Var 2 x) (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ()) (= (Var 2 eps) (RealConstant 0.000000 (Real 8 [])) ()) (= (Var 2 a) (ComplexRe (Var 2 x) (Real 8 []) ()) ()) (= (Var 2 b) (ComplexIm (Var 2 x) (Real 8 []) ()) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (Var 2 a) Sub (RealConstant 2.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 2 eps) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (Var 2 b) Sub (RealConstant 3.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) LtE (Var 2 eps) (Logical 4 []) ()) ())] () Public .false. .false.)}) []) diff --git a/tests/reference/asr-test_complex_02-782ba2d.json b/tests/reference/asr-test_complex_02-782ba2d.json new file mode 100644 index 0000000000..2a360285ab --- /dev/null +++ b/tests/reference/asr-test_complex_02-782ba2d.json @@ -0,0 +1,13 @@ +{ + "basename": "asr-test_complex_02-782ba2d", + "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", + "infile": "tests/../integration_tests/test_complex_02.py", + "infile_hash": "f89daec2225e1da65f791cac35d151886e4889a3793489271e10fad4", + "outfile": null, + "outfile_hash": null, + "stdout": "asr-test_complex_02-782ba2d.stdout", + "stdout_hash": "e74c9a243ad50629ba564d0cec32b9e7e7ec0daf771f3ea30408ab82", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/asr-test_complex_02-782ba2d.stdout b/tests/reference/asr-test_complex_02-782ba2d.stdout new file mode 100644 index 0000000000..4ddf9b5758 --- /dev/null +++ b/tests/reference/asr-test_complex_02-782ba2d.stdout @@ -0,0 +1 @@ +(TranslationUnit (SymbolTable 1 {_lpython_main_program: (Function (SymbolTable 100 {}) _lpython_main_program (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [check] [] [(SubroutineCall 1 check () [] ())] () Public .false. .false.), check: (Function (SymbolTable 5 {}) check (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [test_complex_abs test_complex_binop_32 test_complex_binop_64] [] [(SubroutineCall 1 test_complex_abs () [] ()) (SubroutineCall 1 test_complex_binop_32 () [] ()) (SubroutineCall 1 test_complex_binop_64 () [] ())] () Public .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 99 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), test_complex_abs: (Function (SymbolTable 2 {abs: (ExternalSymbol 2 abs 7 abs lpython_builtin [] abs Private), abs@__lpython_overloaded_0__abs: (ExternalSymbol 2 abs@__lpython_overloaded_0__abs 7 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), abs@__lpython_overloaded_7__abs: (ExternalSymbol 2 abs@__lpython_overloaded_7__abs 7 __lpython_overloaded_7__abs lpython_builtin [] __lpython_overloaded_7__abs Public), abs@__lpython_overloaded_8__abs: (ExternalSymbol 2 abs@__lpython_overloaded_8__abs 7 __lpython_overloaded_8__abs lpython_builtin [] __lpython_overloaded_8__abs Public), complex: (ExternalSymbol 2 complex 7 complex lpython_builtin [] complex Private), complex@__lpython_overloaded_9__complex: (ExternalSymbol 2 complex@__lpython_overloaded_9__complex 7 __lpython_overloaded_9__complex lpython_builtin [] __lpython_overloaded_9__complex Public), eps: (Variable 2 eps [] Local () () Default (Real 8 []) Source Public Required .false.), x: (Variable 2 x [] Local () () Default (Complex 4 []) Source Public Required .false.), y: (Variable 2 y [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_complex_abs (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_7__abs complex@__lpython_overloaded_9__complex abs@__lpython_overloaded_0__abs abs@__lpython_overloaded_8__abs] [] [(= (Var 2 x) (Cast (FunctionCall 2 complex@__lpython_overloaded_9__complex 2 complex [((IntegerConstant 3 (Integer 4 []))) ((IntegerConstant 4 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 3.000000 4.000000 (Complex 8 [])) ()) ComplexToComplex (Complex 4 []) (ComplexConstant 3.000000 4.000000 (Complex 4 []))) ()) (= (Var 2 eps) (RealConstant 0.000000 (Real 8 [])) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (Cast (FunctionCall 2 abs@__lpython_overloaded_7__abs 2 abs [((Var 2 x))] (Real 4 []) () ()) RealToReal (Real 8 []) ()) Sub (RealConstant 5.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 2 eps) (Logical 4 []) ()) ()) (= (Var 2 y) (FunctionCall 2 complex@__lpython_overloaded_9__complex 2 complex [((IntegerConstant 6 (Integer 4 []))) ((IntegerConstant 8 (Integer 4 [])))] (Complex 8 []) (ComplexConstant 6.000000 8.000000 (Complex 8 [])) ()) ()) (Assert (RealCompare (FunctionCall 2 abs@__lpython_overloaded_0__abs 2 abs [((RealBinOp (FunctionCall 2 abs@__lpython_overloaded_8__abs 2 abs [((Var 2 y))] (Real 8 []) () ()) Sub (RealConstant 10.000000 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 2 eps) (Logical 4 []) ()) ())] () Public .false. .false.), test_complex_binop_32: (Function (SymbolTable 3 {x: (Variable 3 x [] Local () () Default (Complex 4 []) Source Public Required .false.), y: (Variable 3 y [] Local () () Default (Complex 4 []) Source Public Required .false.), z: (Variable 3 z [] Local () () Default (Complex 4 []) Source Public Required .false.)}) test_complex_binop_32 (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [] [] [(= (Var 3 x) (Cast (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ComplexToComplex (Complex 4 []) (ComplexConstant 2.000000 3.000000 (Complex 4 []))) ()) (= (Var 3 y) (Cast (ComplexBinOp (Cast (IntegerConstant 4 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 4.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 5.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 []))) ComplexToComplex (Complex 4 []) (ComplexConstant 4.000000 5.000000 (Complex 4 []))) ()) (= (Var 3 z) (ComplexBinOp (Var 3 x) Add (Var 3 y) (Complex 4 []) ()) ()) (= (Var 3 z) (ComplexBinOp (Var 3 x) Sub (Var 3 y) (Complex 4 []) ()) ()) (= (Var 3 z) (ComplexBinOp (Var 3 x) Mul (Var 3 y) (Complex 4 []) ()) ()) (= (Var 3 z) (ComplexBinOp (Var 3 x) Pow (Var 3 y) (Complex 4 []) ()) ())] () Public .false. .false.), test_complex_binop_64: (Function (SymbolTable 4 {x: (Variable 4 x [] Local () () Default (Complex 8 []) Source Public Required .false.), y: (Variable 4 y [] Local () () Default (Complex 8 []) Source Public Required .false.), z: (Variable 4 z [] Local () () Default (Complex 8 []) Source Public Required .false.)}) test_complex_binop_64 (FunctionType [] () Source Implementation () .false. .false. .false. .false. .false. [] [] .false.) [] [] [(= (Var 4 x) (ComplexBinOp (Cast (IntegerConstant 2 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 2.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 3.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 2.000000 3.000000 (Complex 8 []))) ()) (= (Var 4 y) (ComplexBinOp (Cast (IntegerConstant 4 (Integer 4 [])) IntegerToComplex (Complex 8 []) (ComplexConstant 4.000000 0.000000 (Complex 8 []))) Add (ComplexConstant 0.000000 5.000000 (Complex 8 [])) (Complex 8 []) (ComplexConstant 4.000000 5.000000 (Complex 8 []))) ()) (= (Var 4 z) (ComplexBinOp (Var 4 x) Add (Var 4 y) (Complex 8 []) ()) ()) (= (Var 4 z) (ComplexBinOp (Var 4 x) Sub (Var 4 y) (Complex 8 []) ()) ()) (= (Var 4 z) (ComplexBinOp (Var 4 x) Mul (Var 4 y) (Complex 8 []) ()) ()) (= (Var 4 z) (ComplexBinOp (Var 4 x) Pow (Var 4 y) (Complex 8 []) ()) ())] () Public .false. .false.)}) []) diff --git a/tests/reference/wat-bool1-234bcd1.json b/tests/reference/wat-bool1-234bcd1.json index 8f09553bb6..8db0d84f91 100644 --- a/tests/reference/wat-bool1-234bcd1.json +++ b/tests/reference/wat-bool1-234bcd1.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-bool1-234bcd1.stdout", - "stdout_hash": "9509a512bd279e27e1c1a4573a344b98e984e93521cef089eb3bb334", + "stdout_hash": "4242c61474348c2a5f3f56b1ecc82284002826a13771b542875d6727", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-bool1-234bcd1.stdout b/tests/reference/wat-bool1-234bcd1.stdout index 5819b7337f..a90348f85a 100644 --- a/tests/reference/wat-bool1-234bcd1.stdout +++ b/tests/reference/wat-bool1-234bcd1.stdout @@ -1,22 +1,79 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) + (type (;2;) (func (param) (result))) + (type (;3;) (func (param) (result))) (type (;4;) (func (param) (result))) - (type (;5;) (func (param) (result))) - (type (;6;) (func (param) (result))) + (type (;5;) (func (param i64) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) + (local) + call 3 + return + ) + (func $3 (type 3) (param) (result) + (local i32) + i32.const 1 + i64.extend_i32_s + call 5 + i32.const 1 + i32.const 16 + i32.const 1 + i32.const 0 + call 1 + drop + i32.const 0 + i64.extend_i32_s + call 5 + i32.const 1 + i32.const 16 + i32.const 1 + i32.const 0 + call 1 + drop + i32.const 1 + local.set 0 + local.get 0 + i64.extend_i32_s + call 5 + i32.const 1 + i32.const 16 + i32.const 1 + i32.const 0 + call 1 + drop + i32.const 0 + local.set 0 + local.get 0 + i64.extend_i32_s + call 5 + i32.const 1 + i32.const 16 + i32.const 1 + i32.const 0 + call 1 + drop + return + ) + (func $4 (type 4) (param) (result) + (local) + call 2 + i32.const 0 + call 0 + return + ) + (func $5 (type 5) (param i64) (result) (local i64 i64 i64 i64) local.get 0 i64.const 0 i64.eq if i32.const 1 - i32.const 52 + i32.const 88 i32.const 1 i32.const 0 call 1 @@ -98,7 +155,7 @@ i64.rem_s i64.const 12 i64.mul - i64.const 52 + i64.const 88 i64.add local.set 0 i32.const 1 @@ -114,152 +171,12 @@ end return ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) - (local) - call 5 - return - ) - (func $5 (type 5) (param) (result) - (local i32) - i32.const 1 - i64.extend_i32_s - call 2 - i32.const 1 - i32.const 16 - i32.const 1 - i32.const 0 - call 1 - drop - i32.const 0 - i64.extend_i32_s - call 2 - i32.const 1 - i32.const 16 - i32.const 1 - i32.const 0 - call 1 - drop - i32.const 1 - local.set 0 - local.get 0 - i64.extend_i32_s - call 2 - i32.const 1 - i32.const 16 - i32.const 1 - i32.const 0 - call 1 - drop - i32.const 0 - local.set 0 - local.get 0 - i64.extend_i32_s - call 2 - i32.const 1 - i32.const 16 - i32.const 1 - i32.const 0 - call 1 - drop - return - ) - (func $6 (type 6) (param) (result) - (local) - call 4 - i32.const 0 - call 0 - return - ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "_lpython_main_program" (func 4)) - (export "test_bool" (func 5)) - (export "_start" (func 6)) + (export "_lpython_main_program" (func 2)) + (export "test_bool" (func 3)) + (export "_start" (func 4)) + (export "print_i64" (func 5)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -269,23 +186,29 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") ) diff --git a/tests/reference/wat-expr14-5e0cb96.json b/tests/reference/wat-expr14-5e0cb96.json index f752110448..740c0fb0b2 100644 --- a/tests/reference/wat-expr14-5e0cb96.json +++ b/tests/reference/wat-expr14-5e0cb96.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-expr14-5e0cb96.stdout", - "stdout_hash": "96f90f190be31d02b145de3fe293bc74b4a79a3a8aa4c8ebb236a4e9", + "stdout_hash": "95bfdfb006fa1e8d273e861935d577d05178fcb4d57958b72489476d", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-expr14-5e0cb96.stdout b/tests/reference/wat-expr14-5e0cb96.stdout index d9a929c963..c14cbccf77 100644 --- a/tests/reference/wat-expr14-5e0cb96.stdout +++ b/tests/reference/wat-expr14-5e0cb96.stdout @@ -1,202 +1,13 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) - (type (;4;) (func (param) (result))) - (type (;5;) (func (param) (result))) + (type (;2;) (func (param) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) - (local i64 i64 i64 i64) - local.get 0 - i64.const 0 - i64.eq - if - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - return - else - end - local.get 0 - i64.const 0 - i64.lt_s - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - i64.const -1 - i64.mul - local.set 0 - else - end - local.get 0 - local.set 4 - i64.const 0 - local.set 1 - loop - local.get 0 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 0 - i64.const 10 - i64.div_s - local.set 0 - br 1 - else - end - end - loop - local.get 1 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.sub - local.set 1 - i64.const 1 - local.set 2 - i64.const 0 - local.set 3 - loop - local.get 3 - local.get 1 - i64.lt_s - if - local.get 3 - i64.const 1 - i64.add - local.set 3 - local.get 2 - i64.const 10 - i64.mul - local.set 2 - br 1 - else - end - end - local.get 4 - local.get 2 - i64.div_s - i64.const 10 - i64.rem_s - i64.const 12 - i64.mul - i64.const 52 - i64.add - local.set 0 - i32.const 1 - local.get 0 - i32.wrap_i64 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - return - ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) (local i32 i32 i32) i32.const 1 local.set 0 @@ -226,18 +37,9 @@ local.set 0 return ) - (func $5 (type 5) (param) (result) - (local) - i32.const 0 - call 0 - return - ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "test_boolean_comparison" (func 4)) - (export "_start" (func 5)) + (export "test_boolean_comparison" (func 2)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -247,23 +49,29 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") ) diff --git a/tests/reference/wat-expr2-8b17723.json b/tests/reference/wat-expr2-8b17723.json index d4dedeb06d..ddaed0898f 100644 --- a/tests/reference/wat-expr2-8b17723.json +++ b/tests/reference/wat-expr2-8b17723.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-expr2-8b17723.stdout", - "stdout_hash": "a38ec604027092a7cd322473580201a022de5e7ea948c3b63a8ab798", + "stdout_hash": "b62ef7eaec557c1ff9de775d59e525aa458c4e08550886cf02bddc94", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-expr2-8b17723.stdout b/tests/reference/wat-expr2-8b17723.stdout index 76ef89ccdd..69624d7a21 100644 --- a/tests/reference/wat-expr2-8b17723.stdout +++ b/tests/reference/wat-expr2-8b17723.stdout @@ -1,202 +1,13 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) - (type (;4;) (func (param) (result))) - (type (;5;) (func (param) (result))) + (type (;2;) (func (param) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) - (local i64 i64 i64 i64) - local.get 0 - i64.const 0 - i64.eq - if - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - return - else - end - local.get 0 - i64.const 0 - i64.lt_s - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - i64.const -1 - i64.mul - local.set 0 - else - end - local.get 0 - local.set 4 - i64.const 0 - local.set 1 - loop - local.get 0 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 0 - i64.const 10 - i64.div_s - local.set 0 - br 1 - else - end - end - loop - local.get 1 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.sub - local.set 1 - i64.const 1 - local.set 2 - i64.const 0 - local.set 3 - loop - local.get 3 - local.get 1 - i64.lt_s - if - local.get 3 - i64.const 1 - i64.add - local.set 3 - local.get 2 - i64.const 10 - i64.mul - local.set 2 - br 1 - else - end - end - local.get 4 - local.get 2 - i64.div_s - i64.const 10 - i64.rem_s - i64.const 12 - i64.mul - i64.const 52 - i64.add - local.set 0 - i32.const 1 - local.get 0 - i32.wrap_i64 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - return - ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) (local i32 i32) i32.const 0 local.set 0 @@ -232,18 +43,9 @@ local.set 0 return ) - (func $5 (type 5) (param) (result) - (local) - i32.const 0 - call 0 - return - ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "test_boolOp" (func 4)) - (export "_start" (func 5)) + (export "test_boolOp" (func 2)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -253,23 +55,29 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") ) diff --git a/tests/reference/wat-expr9-f73afd1.json b/tests/reference/wat-expr9-f73afd1.json index 6718a7b064..87d0f256a4 100644 --- a/tests/reference/wat-expr9-f73afd1.json +++ b/tests/reference/wat-expr9-f73afd1.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-expr9-f73afd1.stdout", - "stdout_hash": "d1618163ab287b71613fd75147ae7362a7955ebc6e9f32810b21b824", + "stdout_hash": "4e4ced8afad1806ee0f6af7cf74883e0731953cb8e3d0c1b7ae65e2a", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-expr9-f73afd1.stdout b/tests/reference/wat-expr9-f73afd1.stdout index d6abccca65..4aca44fa5e 100644 --- a/tests/reference/wat-expr9-f73afd1.stdout +++ b/tests/reference/wat-expr9-f73afd1.stdout @@ -1,227 +1,39 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) - (type (;4;) (func (param) (result))) - (type (;5;) (func (param) (result))) + (type (;2;) (func (param) (result))) + (type (;3;) (func (param) (result))) + (type (;4;) (func (param i32) (result i32))) + (type (;5;) (func (param i32) (result i32))) (type (;6;) (func (param i32) (result i32))) - (type (;7;) (func (param i32) (result i32))) - (type (;8;) (func (param i32) (result i32))) - (type (;9;) (func (param i32) (result))) - (type (;10;) (func (param) (result))) + (type (;7;) (func (param i32) (result))) + (type (;8;) (func (param) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) - (local i64 i64 i64 i64) - local.get 0 - i64.const 0 - i64.eq - if - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - return - else - end - local.get 0 - i64.const 0 - i64.lt_s - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - i64.const -1 - i64.mul - local.set 0 - else - end - local.get 0 - local.set 4 - i64.const 0 - local.set 1 - loop - local.get 0 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 0 - i64.const 10 - i64.div_s - local.set 0 - br 1 - else - end - end - loop - local.get 1 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.sub - local.set 1 - i64.const 1 - local.set 2 - i64.const 0 - local.set 3 - loop - local.get 3 - local.get 1 - i64.lt_s - if - local.get 3 - i64.const 1 - i64.add - local.set 3 - local.get 2 - i64.const 10 - i64.mul - local.set 2 - br 1 - else - end - end - local.get 4 - local.get 2 - i64.div_s - i64.const 10 - i64.rem_s - i64.const 12 - i64.mul - i64.const 52 - i64.add - local.set 0 - i32.const 1 - local.get 0 - i32.wrap_i64 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - return - ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) (local) - call 5 + call 3 return ) - (func $5 (type 5) (param) (result) + (func $3 (type 3) (param) (result) (local i32 i32) i32.const 4 - call 6 + call 4 local.set 0 i32.const 4 - call 7 + call 5 local.set 1 i32.const 4 - call 8 + call 6 local.set 0 i32.const 4 - call 9 + call 7 return ) - (func $6 (type 6) (param i32) (result i32) + (func $4 (type 4) (param i32) (result i32) (local i32 i32) i32.const 5 local.set 2 @@ -230,16 +42,16 @@ local.get 1 return ) - (func $7 (type 7) (param i32) (result i32) + (func $5 (type 5) (param i32) (result i32) (local i32 i32) - i32.const 172 + i32.const 208 local.set 2 local.get 2 local.set 1 local.get 1 return ) - (func $8 (type 8) (param i32) (result i32) + (func $6 (type 6) (param i32) (result i32) (local i32) i32.const 3 local.set 0 @@ -248,30 +60,28 @@ local.get 1 return ) - (func $9 (type 9) (param i32) (result) + (func $7 (type 7) (param i32) (result) (local) i32.const 1 local.set 0 return ) - (func $10 (type 10) (param) (result) + (func $8 (type 8) (param) (result) (local) - call 4 + call 2 i32.const 0 call 0 return ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "_lpython_main_program" (func 4)) - (export "main0" (func 5)) - (export "test_return_1" (func 6)) - (export "test_return_2" (func 7)) - (export "test_return_3" (func 8)) - (export "test_return_4" (func 9)) - (export "_start" (func 10)) + (export "_lpython_main_program" (func 2)) + (export "main0" (func 3)) + (export "test_return_1" (func 4)) + (export "test_return_2" (func 5)) + (export "test_return_3" (func 6)) + (export "test_return_4" (func 7)) + (export "_start" (func 8)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -281,25 +91,31 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") - (data (;28;) (i32.const 172) "\b4\00\00\00\04\00\00\00") - (data (;29;) (i32.const 180) "test") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") + (data (;34;) (i32.const 208) "\d8\00\00\00\04\00\00\00") + (data (;35;) (i32.const 216) "test") ) diff --git a/tests/reference/wat-loop1-e0046d4.json b/tests/reference/wat-loop1-e0046d4.json index 7f40501269..6208b29eb3 100644 --- a/tests/reference/wat-loop1-e0046d4.json +++ b/tests/reference/wat-loop1-e0046d4.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-loop1-e0046d4.stdout", - "stdout_hash": "07cd13d55836deabb991c7762567db212b10e869075d06a6b34476a2", + "stdout_hash": "fffdd5e8fec36d87423d61052cc9fefdcce6bd7a6ad36be43b583dac", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-loop1-e0046d4.stdout b/tests/reference/wat-loop1-e0046d4.stdout index 99cbf50118..6780743050 100644 --- a/tests/reference/wat-loop1-e0046d4.stdout +++ b/tests/reference/wat-loop1-e0046d4.stdout @@ -1,224 +1,36 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) - (type (;4;) (func (param) (result))) - (type (;5;) (func (param) (result))) - (type (;6;) (func (param i32) (result i32))) - (type (;7;) (func (param i32) (result i32))) - (type (;8;) (func (param i32) (result i64))) - (type (;9;) (func (param) (result))) + (type (;2;) (func (param) (result))) + (type (;3;) (func (param) (result))) + (type (;4;) (func (param i32) (result i32))) + (type (;5;) (func (param i32) (result i32))) + (type (;6;) (func (param i32) (result i64))) + (type (;7;) (func (param) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) - (local i64 i64 i64 i64) - local.get 0 - i64.const 0 - i64.eq - if - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - return - else - end - local.get 0 - i64.const 0 - i64.lt_s - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - i64.const -1 - i64.mul - local.set 0 - else - end - local.get 0 - local.set 4 - i64.const 0 - local.set 1 - loop - local.get 0 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 0 - i64.const 10 - i64.div_s - local.set 0 - br 1 - else - end - end - loop - local.get 1 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.sub - local.set 1 - i64.const 1 - local.set 2 - i64.const 0 - local.set 3 - loop - local.get 3 - local.get 1 - i64.lt_s - if - local.get 3 - i64.const 1 - i64.add - local.set 3 - local.get 2 - i64.const 10 - i64.mul - local.set 2 - br 1 - else - end - end - local.get 4 - local.get 2 - i64.div_s - i64.const 10 - i64.rem_s - i64.const 12 - i64.mul - i64.const 52 - i64.add - local.set 0 - i32.const 1 - local.get 0 - i32.wrap_i64 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - return - ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) (local) - call 5 + call 3 return ) - (func $5 (type 5) (param) (result) + (func $3 (type 3) (param) (result) (local i32 i64) i32.const 4 - call 6 + call 4 local.set 0 i32.const 4 - call 7 + call 5 local.set 0 i32.const 5 - call 8 + call 6 local.set 1 return ) - (func $6 (type 6) (param i32) (result i32) + (func $4 (type 4) (param i32) (result i32) (local i32 i32) local.get 0 i32.const 0 @@ -254,7 +66,7 @@ local.get 1 return ) - (func $7 (type 7) (param i32) (result i32) + (func $5 (type 5) (param i32) (result i32) (local i32 i32 i32) i32.const 1 local.set 3 @@ -290,7 +102,7 @@ local.get 1 return ) - (func $8 (type 8) (param i32) (result i64) + (func $6 (type 6) (param i32) (result i64) (local i64 i64) i64.const 0 local.set 2 @@ -329,23 +141,21 @@ local.get 1 return ) - (func $9 (type 9) (param) (result) + (func $7 (type 7) (param) (result) (local) - call 4 + call 2 i32.const 0 call 0 return ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "_lpython_main_program" (func 4)) - (export "main0" (func 5)) - (export "test_factorial_1" (func 6)) - (export "test_factorial_2" (func 7)) - (export "test_factorial_3" (func 8)) - (export "_start" (func 9)) + (export "_lpython_main_program" (func 2)) + (export "main0" (func 3)) + (export "test_factorial_1" (func 4)) + (export "test_factorial_2" (func 5)) + (export "test_factorial_3" (func 6)) + (export "_start" (func 7)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -355,23 +165,29 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") ) diff --git a/tests/reference/wat-print_str-385e953.json b/tests/reference/wat-print_str-385e953.json index 7ba2987dbf..842699b47f 100644 --- a/tests/reference/wat-print_str-385e953.json +++ b/tests/reference/wat-print_str-385e953.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "wat-print_str-385e953.stdout", - "stdout_hash": "5c741b7c4d2def2a49b189d20e307eba2c157d714d278fc3cc924d7f", + "stdout_hash": "ee6eba6afb6649829e7fcb6fa46118d74384af5ecd2fe287de41e26e", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/wat-print_str-385e953.stdout b/tests/reference/wat-print_str-385e953.stdout index b626d5d4d7..19247bc00c 100644 --- a/tests/reference/wat-print_str-385e953.stdout +++ b/tests/reference/wat-print_str-385e953.stdout @@ -1,217 +1,29 @@ (module (type (;0;) (func (param i32) (result))) (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (type (;2;) (func (param i64) (result))) - (type (;3;) (func (param f64) (result))) + (type (;2;) (func (param) (result))) + (type (;3;) (func (param) (result))) (type (;4;) (func (param) (result))) (type (;5;) (func (param) (result))) - (type (;6;) (func (param) (result))) - (type (;7;) (func (param) (result))) (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0))) (import "wasi_snapshot_preview1" "fd_write" (func (;1;) (type 1))) - (global $0 i32 (i32.const 0)) - (func $2 (type 2) (param i64) (result) - (local i64 i64 i64 i64) - local.get 0 - i64.const 0 - i64.eq - if - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - return - else - end - local.get 0 - i64.const 0 - i64.lt_s - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - i64.const -1 - i64.mul - local.set 0 - else - end - local.get 0 - local.set 4 - i64.const 0 - local.set 1 - loop - local.get 0 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 0 - i64.const 10 - i64.div_s - local.set 0 - br 1 - else - end - end - loop - local.get 1 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.sub - local.set 1 - i64.const 1 - local.set 2 - i64.const 0 - local.set 3 - loop - local.get 3 - local.get 1 - i64.lt_s - if - local.get 3 - i64.const 1 - i64.add - local.set 3 - local.get 2 - i64.const 10 - i64.mul - local.set 2 - br 1 - else - end - end - local.get 4 - local.get 2 - i64.div_s - i64.const 10 - i64.rem_s - i64.const 12 - i64.mul - i64.const 52 - i64.add - local.set 0 - i32.const 1 - local.get 0 - i32.wrap_i64 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - return - ) - (func $3 (type 3) (param f64) (result) - (local i64 i64 i64) - local.get 0 - f64.const 0.000000 - f64.lt - if - i32.const 1 - i32.const 28 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - f64.const -1.000000 - f64.mul - local.set 0 - else - end - local.get 0 - i64.trunc_f64_s - call 2 - i32.const 1 - i32.const 40 - i32.const 1 - i32.const 0 - call 1 - drop - local.get 0 - local.get 0 - i64.trunc_f64_s - f64.convert_i64_s - f64.sub - f64.const 100000000.000000 - f64.mul - i64.trunc_f64_s - local.set 2 - local.get 2 - local.set 3 - i64.const 0 - local.set 1 - loop - local.get 2 - i64.const 0 - i64.gt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - local.get 2 - f64.convert_i64_s - i64.const 10 - f64.convert_i64_s - f64.div - i64.trunc_f64_s - local.set 2 - br 1 - else - end - end - loop - local.get 1 - i64.const 8 - i64.lt_s - if - local.get 1 - i64.const 1 - i64.add - local.set 1 - i32.const 1 - i32.const 52 - i32.const 1 - i32.const 0 - call 1 - drop - br 1 - else - end - end - local.get 3 - call 2 - return - ) - (func $4 (type 4) (param) (result) + (global $0 (mut i32) (i32.const 0)) + (global $1 (mut f32) (f32.const 0.000000)) + (global $2 (mut f64) (f64.const 0.000000)) + (func $2 (type 2) (param) (result) (local) - call 5 + call 3 return ) - (func $5 (type 5) (param) (result) + (func $3 (type 3) (param) (result) (local) - call 6 + call 4 return ) - (func $6 (type 6) (param) (result) + (func $4 (type 4) (param) (result) (local) i32.const 1 - i32.const 172 + i32.const 208 i32.const 1 i32.const 0 call 1 @@ -223,7 +35,7 @@ call 1 drop i32.const 1 - i32.const 188 + i32.const 224 i32.const 1 i32.const 0 call 1 @@ -235,7 +47,7 @@ call 1 drop i32.const 1 - i32.const 204 + i32.const 240 i32.const 1 i32.const 0 call 1 @@ -247,7 +59,7 @@ call 1 drop i32.const 1 - i32.const 220 + i32.const 256 i32.const 1 i32.const 0 call 1 @@ -259,7 +71,7 @@ call 1 drop i32.const 1 - i32.const 236 + i32.const 272 i32.const 1 i32.const 0 call 1 @@ -271,7 +83,7 @@ call 1 drop i32.const 1 - i32.const 252 + i32.const 288 i32.const 1 i32.const 0 call 1 @@ -284,21 +96,19 @@ drop return ) - (func $7 (type 7) (param) (result) + (func $5 (type 5) (param) (result) (local) - call 4 + call 2 i32.const 0 call 0 return ) (memory (;0;) 100 100) (export "memory" (memory 0)) - (export "print_i64" (func 2)) - (export "print_f64" (func 3)) - (export "_lpython_main_program" (func 4)) - (export "main0" (func 5)) - (export "printCompOperations" (func 6)) - (export "_start" (func 7)) + (export "_lpython_main_program" (func 2)) + (export "main0" (func 3)) + (export "printCompOperations" (func 4)) + (export "_start" (func 5)) (data (;0;) (i32.const 4) "\0c\00\00\00\01\00\00\00") (data (;1;) (i32.const 12) " ") (data (;2;) (i32.const 16) "\18\00\00\00\01\00\00\00") @@ -308,35 +118,41 @@ (data (;6;) (i32.const 40) "\30\00\00\00\01\00\00\00") (data (;7;) (i32.const 48) ". ") (data (;8;) (i32.const 52) "\3c\00\00\00\01\00\00\00") - (data (;9;) (i32.const 60) "0 ") + (data (;9;) (i32.const 60) "( ") (data (;10;) (i32.const 64) "\48\00\00\00\01\00\00\00") - (data (;11;) (i32.const 72) "1 ") + (data (;11;) (i32.const 72) ") ") (data (;12;) (i32.const 76) "\54\00\00\00\01\00\00\00") - (data (;13;) (i32.const 84) "2 ") + (data (;13;) (i32.const 84) ", ") (data (;14;) (i32.const 88) "\60\00\00\00\01\00\00\00") - (data (;15;) (i32.const 96) "3 ") + (data (;15;) (i32.const 96) "0 ") (data (;16;) (i32.const 100) "\6c\00\00\00\01\00\00\00") - (data (;17;) (i32.const 108) "4 ") + (data (;17;) (i32.const 108) "1 ") (data (;18;) (i32.const 112) "\78\00\00\00\01\00\00\00") - (data (;19;) (i32.const 120) "5 ") + (data (;19;) (i32.const 120) "2 ") (data (;20;) (i32.const 124) "\84\00\00\00\01\00\00\00") - (data (;21;) (i32.const 132) "6 ") + (data (;21;) (i32.const 132) "3 ") (data (;22;) (i32.const 136) "\90\00\00\00\01\00\00\00") - (data (;23;) (i32.const 144) "7 ") + (data (;23;) (i32.const 144) "4 ") (data (;24;) (i32.const 148) "\9c\00\00\00\01\00\00\00") - (data (;25;) (i32.const 156) "8 ") + (data (;25;) (i32.const 156) "5 ") (data (;26;) (i32.const 160) "\a8\00\00\00\01\00\00\00") - (data (;27;) (i32.const 168) "9 ") - (data (;28;) (i32.const 172) "\b4\00\00\00\05\00\00\00") - (data (;29;) (i32.const 180) "x < y ") - (data (;30;) (i32.const 188) "\c4\00\00\00\06\00\00\00") - (data (;31;) (i32.const 196) "x !< y ") - (data (;32;) (i32.const 204) "\d4\00\00\00\05\00\00\00") - (data (;33;) (i32.const 212) "x > y ") - (data (;34;) (i32.const 220) "\e4\00\00\00\06\00\00\00") - (data (;35;) (i32.const 228) "x !> y ") - (data (;36;) (i32.const 236) "\f4\00\00\00\06\00\00\00") - (data (;37;) (i32.const 244) "x == y ") - (data (;38;) (i32.const 252) "\04\01\00\00\06\00\00\00") - (data (;39;) (i32.const 260) "x != y ") + (data (;27;) (i32.const 168) "6 ") + (data (;28;) (i32.const 172) "\b4\00\00\00\01\00\00\00") + (data (;29;) (i32.const 180) "7 ") + (data (;30;) (i32.const 184) "\c0\00\00\00\01\00\00\00") + (data (;31;) (i32.const 192) "8 ") + (data (;32;) (i32.const 196) "\cc\00\00\00\01\00\00\00") + (data (;33;) (i32.const 204) "9 ") + (data (;34;) (i32.const 208) "\d8\00\00\00\05\00\00\00") + (data (;35;) (i32.const 216) "x < y ") + (data (;36;) (i32.const 224) "\e8\00\00\00\06\00\00\00") + (data (;37;) (i32.const 232) "x !< y ") + (data (;38;) (i32.const 240) "\f8\00\00\00\05\00\00\00") + (data (;39;) (i32.const 248) "x > y ") + (data (;40;) (i32.const 256) "\08\01\00\00\06\00\00\00") + (data (;41;) (i32.const 264) "x !> y ") + (data (;42;) (i32.const 272) "\18\01\00\00\06\00\00\00") + (data (;43;) (i32.const 280) "x == y ") + (data (;44;) (i32.const 288) "\28\01\00\00\06\00\00\00") + (data (;45;) (i32.const 296) "x != y ") ) diff --git a/tests/tests.toml b/tests/tests.toml index 5c8ca16ae2..0a33623faa 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -294,7 +294,11 @@ filename = "../integration_tests/test_builtin.py" asr = true [[test]] -filename = "../integration_tests/test_complex.py" +filename = "../integration_tests/test_complex_01.py" +asr = true + +[[test]] +filename = "../integration_tests/test_complex_02.py" asr = true [[test]]