From c356d4d7db80a91b85904e8e471e387bb2face09 Mon Sep 17 00:00:00 2001 From: Ron Nuriel Date: Mon, 29 Aug 2022 14:56:37 +0300 Subject: [PATCH 1/3] Fixing & for C backend Signed-off-by: Ron Nuriel --- src/libasr/codegen/asr_to_c_cpp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index a9d87cf598..08e3599246 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -823,6 +823,7 @@ R"(#include case (ASR::binopType::Sub) : { last_expr_precedence = 6; break; } case (ASR::binopType::Mul) : { last_expr_precedence = 5; break; } case (ASR::binopType::Div) : { last_expr_precedence = 5; break; } + case (ASR::binopType::BitAnd) : { last_expr_precedence = 5; break; } case (ASR::binopType::Pow) : { src = "pow(" + left + ", " + right + ")"; if (is_c) { From 92c71c4367f9bb8d020ddd7c76fc0cd62f93d59a Mon Sep 17 00:00:00 2001 From: Ron Nuriel Date: Mon, 29 Aug 2022 15:30:45 +0300 Subject: [PATCH 2/3] Added test for & op Signed-off-by: Ron Nuriel --- integration_tests/expr_01.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/integration_tests/expr_01.py b/integration_tests/expr_01.py index 78363dc3e5..4baa148c68 100644 --- a/integration_tests/expr_01.py +++ b/integration_tests/expr_01.py @@ -4,13 +4,23 @@ def add(x: i32, y: i32) -> i32: return x + y +@inline +def and_op(x: i32, y: i32) -> i32: + return x & y + def main0(): - x: i32; y: i32 + x: i32 + y: i32 + z: i32 x = (2+3)*5 y = add(x, 2)*2 assert x == 25 assert y == 54 + z = and_op(x, y) + assert z == 16 + + main0() # Not implemented yet in LPython: From 693ed9ffeb3fa7b22455c66bb814110ee4313869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Mon, 29 Aug 2022 14:47:46 +0200 Subject: [PATCH 3/3] Update reference tests --- tests/reference/asr-expr_01-a0d4829.json | 4 ++-- tests/reference/asr-expr_01-a0d4829.stdout | 2 +- tests/reference/c-expr_01-28f449f.json | 4 ++-- tests/reference/c-expr_01-28f449f.stdout | 11 +++++++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tests/reference/asr-expr_01-a0d4829.json b/tests/reference/asr-expr_01-a0d4829.json index dc2ee45e74..fc9ff5bff0 100644 --- a/tests/reference/asr-expr_01-a0d4829.json +++ b/tests/reference/asr-expr_01-a0d4829.json @@ -2,11 +2,11 @@ "basename": "asr-expr_01-a0d4829", "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", "infile": "tests/../integration_tests/expr_01.py", - "infile_hash": "d9a85a1c6bc50a17c74af218dcd9ee87047b4c3f3bc54f699810d339", + "infile_hash": "c391a2740682aec6070efdfb508697052e45950589fdabd9728127a4", "outfile": null, "outfile_hash": null, "stdout": "asr-expr_01-a0d4829.stdout", - "stdout_hash": "3b7c5a7a71d5398c67c630cb06af463e785676b02a2cfb077e290500", + "stdout_hash": "c07cae48da2ca27369c507eacdd4b8635ffc2af555ae48bc7614874c", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr-expr_01-a0d4829.stdout b/tests/reference/asr-expr_01-a0d4829.stdout index af1e5e525b..6cde82c4a8 100644 --- a/tests/reference/asr-expr_01-a0d4829.stdout +++ b/tests/reference/asr-expr_01-a0d4829.stdout @@ -1 +1 @@ -(TranslationUnit (SymbolTable 1 {_lpython_main_program: (Function (SymbolTable 5 {}) _lpython_main_program [] [] [(SubroutineCall 1 main0 () [] ())] () Source Public Implementation () .false. .false. .false. .false.), add: (Function (SymbolTable 2 {_lpython_return_variable: (Variable 2 _lpython_return_variable ReturnVar () () Default (Integer 4 []) Source Public Required .false.), x: (Variable 2 x In () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y In () () Default (Integer 4 []) Source Public Required .false.)}) add [(Var 2 x) (Var 2 y)] [] [(= (Var 2 _lpython_return_variable) (IntegerBinOp (Var 2 x) Add (Var 2 y) (Integer 4 []) ()) ()) (Return)] (Var 2 _lpython_return_variable) Source Public Implementation () .false. .false. .false. .true.), main0: (Function (SymbolTable 3 {x: (Variable 3 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 3 y Local () () Default (Integer 4 []) Source Public Required .false.)}) main0 [] [] [(= (Var 3 x) (IntegerBinOp (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant 5 (Integer 4 []))) Mul (IntegerConstant 5 (Integer 4 [])) (Integer 4 []) (IntegerConstant 25 (Integer 4 []))) ()) (= (Var 3 y) (IntegerBinOp (FunctionCall 1 add () [((Var 3 x)) ((IntegerConstant 2 (Integer 4 [])))] (Integer 4 []) () ()) Mul (IntegerConstant 2 (Integer 4 [])) (Integer 4 []) ()) ()) (Assert (IntegerCompare (Var 3 x) Eq (IntegerConstant 25 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (IntegerCompare (Var 3 y) Eq (IntegerConstant 54 (Integer 4 [])) (Logical 4 []) ()) ())] () Source Public Implementation () .false. .false. .false. .false.), main_program: (Program (SymbolTable 4 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())])}) []) +(TranslationUnit (SymbolTable 1 {_lpython_main_program: (Function (SymbolTable 6 {}) _lpython_main_program [] [] [(SubroutineCall 1 main0 () [] ())] () Source Public Implementation () .false. .false. .false. .false.), add: (Function (SymbolTable 2 {_lpython_return_variable: (Variable 2 _lpython_return_variable ReturnVar () () Default (Integer 4 []) Source Public Required .false.), x: (Variable 2 x In () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y In () () Default (Integer 4 []) Source Public Required .false.)}) add [(Var 2 x) (Var 2 y)] [] [(= (Var 2 _lpython_return_variable) (IntegerBinOp (Var 2 x) Add (Var 2 y) (Integer 4 []) ()) ()) (Return)] (Var 2 _lpython_return_variable) Source Public Implementation () .false. .false. .false. .true.), and_op: (Function (SymbolTable 3 {_lpython_return_variable: (Variable 3 _lpython_return_variable ReturnVar () () Default (Integer 4 []) Source Public Required .false.), x: (Variable 3 x In () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 3 y In () () Default (Integer 4 []) Source Public Required .false.)}) and_op [(Var 3 x) (Var 3 y)] [] [(= (Var 3 _lpython_return_variable) (IntegerBinOp (Var 3 x) BitAnd (Var 3 y) (Integer 4 []) ()) ()) (Return)] (Var 3 _lpython_return_variable) Source Public Implementation () .false. .false. .false. .true.), main0: (Function (SymbolTable 4 {x: (Variable 4 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 4 y Local () () Default (Integer 4 []) Source Public Required .false.), z: (Variable 4 z Local () () Default (Integer 4 []) Source Public Required .false.)}) main0 [] [] [(= (Var 4 x) (IntegerBinOp (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant 5 (Integer 4 []))) Mul (IntegerConstant 5 (Integer 4 [])) (Integer 4 []) (IntegerConstant 25 (Integer 4 []))) ()) (= (Var 4 y) (IntegerBinOp (FunctionCall 1 add () [((Var 4 x)) ((IntegerConstant 2 (Integer 4 [])))] (Integer 4 []) () ()) Mul (IntegerConstant 2 (Integer 4 [])) (Integer 4 []) ()) ()) (Assert (IntegerCompare (Var 4 x) Eq (IntegerConstant 25 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (IntegerCompare (Var 4 y) Eq (IntegerConstant 54 (Integer 4 [])) (Logical 4 []) ()) ()) (= (Var 4 z) (FunctionCall 1 and_op () [((Var 4 x)) ((Var 4 y))] (Integer 4 []) () ()) ()) (Assert (IntegerCompare (Var 4 z) Eq (IntegerConstant 16 (Integer 4 [])) (Logical 4 []) ()) ())] () Source Public Implementation () .false. .false. .false. .false.), main_program: (Program (SymbolTable 5 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())])}) []) diff --git a/tests/reference/c-expr_01-28f449f.json b/tests/reference/c-expr_01-28f449f.json index de399724d5..3c0bf90aec 100644 --- a/tests/reference/c-expr_01-28f449f.json +++ b/tests/reference/c-expr_01-28f449f.json @@ -2,11 +2,11 @@ "basename": "c-expr_01-28f449f", "cmd": "lpython --no-color --show-c {infile}", "infile": "tests/../integration_tests/expr_01.py", - "infile_hash": "d9a85a1c6bc50a17c74af218dcd9ee87047b4c3f3bc54f699810d339", + "infile_hash": "c391a2740682aec6070efdfb508697052e45950589fdabd9728127a4", "outfile": null, "outfile_hash": null, "stdout": "c-expr_01-28f449f.stdout", - "stdout_hash": "a6972cc7e2bcbfe51adf6a85e7ced9a87f630b63e0e13db7520866f1", + "stdout_hash": "5a99318a6ea27779a9b7e2608adc497a92f1033ac2fe51365d2dc151", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/c-expr_01-28f449f.stdout b/tests/reference/c-expr_01-28f449f.stdout index 5236bf2ad6..1dab5b5899 100644 --- a/tests/reference/c-expr_01-28f449f.stdout +++ b/tests/reference/c-expr_01-28f449f.stdout @@ -37,6 +37,7 @@ struct dimension_descriptor // Forward declarations void _lpython_main_program(); inline __attribute__((always_inline)) int32_t add(int32_t x, int32_t y); +inline __attribute__((always_inline)) int32_t and_op(int32_t x, int32_t y); void main0(); // Implementations @@ -52,14 +53,24 @@ inline __attribute__((always_inline)) int32_t add(int32_t x, int32_t y) return _lpython_return_variable; } +inline __attribute__((always_inline)) int32_t and_op(int32_t x, int32_t y) +{ + int32_t _lpython_return_variable; + _lpython_return_variable = x&y; + return _lpython_return_variable; +} + void main0() { int32_t x; int32_t y; + int32_t z; x = (2 + 3)*5; y = add(x, 2)*2; ASSERT(x == 25); ASSERT(y == 54); + z = and_op(x, y); + ASSERT(z == 16); } int main(int argc, char* argv[])