Skip to content

Commit 2c8434a

Browse files
committed
upd
1 parent ba1eb9a commit 2c8434a

11 files changed

+323
-10
lines changed

src/libasr/ASR.asdl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ stmt
4747
| Print(expr* values, expr? separator, expr? end)
4848
| FileOpen(int label, expr? newunit, expr? filename, expr? status, expr? form)
4949
| FileClose(int label, expr? unit, expr? iostat, expr? iomsg, expr? err, expr? status)
50-
| FileRead(int label, expr? unit, expr? fmt, expr? iomsg, expr? iostat, expr? id, expr* values, stmt? overloaded)
50+
| FileRead(int label, expr? unit, expr? fmt, expr? iomsg, expr? iostat, expr? size, expr? id, expr* values, stmt? overloaded)
5151
| FileBackspace(int label, expr? unit, expr? iostat, expr? err)
5252
| FileRewind(int label, expr? unit, expr? iostat, expr? err)
5353
| FileInquire(int label, expr? unit, expr? file, expr? iostat, expr? err, expr? exist, expr? opened, expr? number, expr? named, expr? name, expr? access, expr? sequential, expr? direct, expr? form, expr? formatted, expr? unformatted, expr? recl, expr? nextrec, expr? blank, expr? position, expr? action, expr? read, expr? write, expr? readwrite, expr? delim, expr? pad, expr? flen, expr? blocksize, expr? convert, expr? carriagecontrol, expr? iolength)

src/libasr/asr_utils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2797,8 +2797,8 @@ inline int extract_kind(ASR::expr_t* kind_expr, const Location& loc) {
27972797
case ASR::exprType::IntrinsicElementalFunction: {
27982798
ASR::IntrinsicElementalFunction_t* kind_isf =
27992799
ASR::down_cast<ASR::IntrinsicElementalFunction_t>(kind_expr);
2800-
if (kind_isf->m_intrinsic_id == 0 && kind_isf->m_value) {
2801-
// m_intrinsic_id: 0 -> kind intrinsic
2800+
if (kind_isf->m_intrinsic_id == 1 && kind_isf->m_value) {
2801+
// m_intrinsic_id: 1 -> kind intrinsic
28022802
LCOMPILERS_ASSERT( ASR::is_a<ASR::IntegerConstant_t>(*kind_isf->m_value) );
28032803
ASR::IntegerConstant_t* kind_ic =
28042804
ASR::down_cast<ASR::IntegerConstant_t>(kind_isf->m_value);

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7384,7 +7384,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
73847384
return ;
73857385
}
73867386

7387-
llvm::Value *unit_val, *iostat;
7387+
llvm::Value *unit_val, *iostat, *read_size;
73887388
bool is_string = false;
73897389
if (x.m_unit == nullptr) {
73907390
// Read from stdin
@@ -7407,10 +7407,22 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
74077407
llvm::Type::getInt32Ty(context), nullptr);
74087408
}
74097409

7410+
if (x.m_size) {
7411+
int ptr_copy = ptr_loads;
7412+
ptr_loads = 0;
7413+
this->visit_expr_wrapper(x.m_size, false);
7414+
ptr_loads = ptr_copy;
7415+
read_size = tmp;
7416+
} else {
7417+
read_size = builder->CreateAlloca(
7418+
llvm::Type::getInt32Ty(context), nullptr);
7419+
}
7420+
74107421
if (x.m_fmt) {
74117422
std::vector<llvm::Value*> args;
74127423
args.push_back(unit_val);
74137424
args.push_back(iostat);
7425+
args.push_back(read_size);
74147426
this->visit_expr_wrapper(x.m_fmt, true);
74157427
args.push_back(tmp);
74167428
args.push_back(llvm::ConstantInt::get(context, llvm::APInt(32, x.n_values)));
@@ -7428,6 +7440,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
74287440
llvm::Type::getVoidTy(context), {
74297441
llvm::Type::getInt32Ty(context),
74307442
llvm::Type::getInt32Ty(context)->getPointerTo(),
7443+
llvm::Type::getInt32Ty(context)->getPointerTo(),
74317444
character_type,
74327445
llvm::Type::getInt32Ty(context)
74337446
}, true);

src/libasr/intrinsic_func_registry_util_gen.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@
5050
"ret_type_arg_idx": 0
5151
},
5252
],
53+
"BesselY0": [
54+
{
55+
"args": [("real",)],
56+
"ret_type_arg_idx": 0
57+
},
58+
],
5359
"Mvbits": [
5460
{
5561
"args": [("int", "int", "int", "int", "int")],

src/libasr/pass/intrinsic_function_registry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ inline std::string get_intrinsic_name(int x) {
5454
INTRINSIC_NAME_CASE(Trailz)
5555
INTRINSIC_NAME_CASE(BesselJ0)
5656
INTRINSIC_NAME_CASE(BesselJ1)
57+
INTRINSIC_NAME_CASE(BesselY0)
5758
INTRINSIC_NAME_CASE(Mvbits)
5859
INTRINSIC_NAME_CASE(Shiftr)
5960
INTRINSIC_NAME_CASE(Rshift)
@@ -231,6 +232,8 @@ namespace IntrinsicElementalFunctionRegistry {
231232
{&BesselJ0::instantiate_BesselJ0, &BesselJ0::verify_args}},
232233
{static_cast<int64_t>(IntrinsicElementalFunctions::BesselJ1),
233234
{&BesselJ1::instantiate_BesselJ1, &BesselJ1::verify_args}},
235+
{static_cast<int64_t>(IntrinsicElementalFunctions::BesselY0),
236+
{&BesselY0::instantiate_BesselY0, &BesselY0::verify_args}},
234237
{static_cast<int64_t>(IntrinsicElementalFunctions::Mvbits),
235238
{&Mvbits::instantiate_Mvbits, &Mvbits::verify_args}},
236239
{static_cast<int64_t>(IntrinsicElementalFunctions::Shiftr),
@@ -512,6 +515,8 @@ namespace IntrinsicElementalFunctionRegistry {
512515
"trailz"},
513516
{static_cast<int64_t>(IntrinsicElementalFunctions::BesselJ0),
514517
"bessel_j0"},
518+
{static_cast<int64_t>(IntrinsicElementalFunctions::BesselY0),
519+
"bessel_y0"},
515520
{static_cast<int64_t>(IntrinsicElementalFunctions::Mvbits),
516521
"mvbits"},
517522
{static_cast<int64_t>(IntrinsicElementalFunctions::Shiftr),
@@ -761,6 +766,7 @@ namespace IntrinsicElementalFunctionRegistry {
761766
{"trailz", {&Trailz::create_Trailz, &Trailz::eval_Trailz}},
762767
{"bessel_j0", {&BesselJ0::create_BesselJ0, &BesselJ0::eval_BesselJ0}},
763768
{"bessel_j1", {&BesselJ1::create_BesselJ1, &BesselJ1::eval_BesselJ1}},
769+
{"bessel_y0", {&BesselY0::create_BesselY0, &BesselY0::eval_BesselY0}},
764770
{"mvbits", {&Mvbits::create_Mvbits, &Mvbits::eval_Mvbits}},
765771
{"shiftr", {&Shiftr::create_Shiftr, &Shiftr::eval_Shiftr}},
766772
{"rshift", {&Rshift::create_Rshift, &Rshift::eval_Rshift}},

src/libasr/pass/intrinsic_function_registry_util.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,47 @@ namespace BesselJ1 {
353353
}
354354
}
355355

356+
namespace BesselY0 {
357+
358+
static inline void verify_args(const ASR::IntrinsicElementalFunction_t& x, diag::Diagnostics& diagnostics) {
359+
if (x.n_args == 1) {
360+
ASRUtils::require_impl(x.m_overload_id == 0, "Overload Id for BesselY0 expected to be 0, found " + std::to_string(x.m_overload_id), x.base.base.loc, diagnostics);
361+
ASR::ttype_t *arg_type0 = ASRUtils::type_get_past_const(ASRUtils::expr_type(x.m_args[0]));
362+
ASRUtils::require_impl((is_real(*arg_type0)), "Unexpected args, BesselY0 expects (real) as arguments", x.base.base.loc, diagnostics);
363+
}
364+
else {
365+
ASRUtils::require_impl(false, "Unexpected number of args, BesselY0 takes 1 arguments, found " + std::to_string(x.n_args), x.base.base.loc, diagnostics);
366+
}
367+
}
368+
369+
static inline ASR::asr_t* create_BesselY0(Allocator& al, const Location& loc, Vec<ASR::expr_t*>& args, diag::Diagnostics& diag) {
370+
if (args.size() == 1) {
371+
ASR::ttype_t *arg_type0 = ASRUtils::type_get_past_const(ASRUtils::expr_type(args[0]));
372+
if(!((is_real(*arg_type0)))) {
373+
append_error(diag, "Unexpected args, BesselY0 expects (real) as arguments", loc);
374+
return nullptr;
375+
}
376+
}
377+
else {
378+
append_error(diag, "Unexpected number of args, BesselY0 takes 1 arguments, found " + std::to_string(args.size()), loc);
379+
return nullptr;
380+
}
381+
ASRUtils::ExprStmtDuplicator expr_duplicator(al);
382+
expr_duplicator.allow_procedure_calls = true;
383+
ASR::ttype_t* type_ = expr_duplicator.duplicate_ttype(expr_type(args[0]));
384+
ASR::ttype_t *return_type = type_;
385+
ASR::expr_t *m_value = nullptr;
386+
Vec<ASR::expr_t*> m_args; m_args.reserve(al, 1);
387+
m_args.push_back(al, args[0]);
388+
if (all_args_evaluated(m_args)) {
389+
Vec<ASR::expr_t*> args_values; args_values.reserve(al, 1);
390+
args_values.push_back(al, expr_value(m_args[0]));
391+
m_value = eval_BesselY0(al, loc, return_type, args_values, diag);
392+
}
393+
return ASR::make_IntrinsicElementalFunction_t(al, loc, static_cast<int64_t>(IntrinsicElementalFunctions::BesselY0), m_args.p, m_args.n, 0, return_type, m_value);
394+
}
395+
}
396+
356397
namespace Mvbits {
357398

358399
static inline void verify_args(const ASR::IntrinsicElementalFunction_t& x, diag::Diagnostics& diagnostics) {

src/libasr/pass/intrinsic_functions.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ enum class IntrinsicElementalFunctions : int64_t {
5353
Trailz,
5454
BesselJ0,
5555
BesselJ1,
56+
BesselY0,
5657
Mvbits,
5758
Shiftr,
5859
Rshift,
@@ -2978,6 +2979,62 @@ namespace BesselJ1 {
29782979

29792980
} // namespace BesselJ1
29802981

2982+
namespace BesselY0 {
2983+
2984+
static ASR::expr_t *eval_BesselY0(Allocator &/*al*/, const Location &/*loc*/,
2985+
ASR::ttype_t* /*t1*/, Vec<ASR::expr_t*> &/*args*/, diag::Diagnostics& /*diag*/) {
2986+
return nullptr;
2987+
}
2988+
2989+
static inline ASR::expr_t* instantiate_BesselY0(Allocator &al, const Location &loc,
2990+
SymbolTable *scope, Vec<ASR::ttype_t*>& arg_types, ASR::ttype_t *return_type,
2991+
Vec<ASR::call_arg_t>& new_args, int64_t /*overload_id*/) {
2992+
std::string c_func_name;
2993+
if (ASRUtils::extract_kind_from_ttype_t(arg_types[0]) == 4) {
2994+
c_func_name = "_lfortran_sbessely0";
2995+
} else {
2996+
c_func_name = "_lfortran_dbessely0";
2997+
}
2998+
std::string new_name = "_lcompilers_bessel_y0_"+ type_to_str_python(arg_types[0]);
2999+
3000+
declare_basic_variables(new_name);
3001+
if (scope->get_symbol(new_name)) {
3002+
ASR::symbol_t *s = scope->get_symbol(new_name);
3003+
ASR::Function_t *f = ASR::down_cast<ASR::Function_t>(s);
3004+
return b.Call(s, new_args, expr_type(f->m_return_var));
3005+
}
3006+
fill_func_arg("x", arg_types[0]);
3007+
auto result = declare(new_name, return_type, ReturnVar);
3008+
{
3009+
SymbolTable *fn_symtab_1 = al.make_new<SymbolTable>(fn_symtab);
3010+
Vec<ASR::expr_t*> args_1;
3011+
{
3012+
args_1.reserve(al, 1);
3013+
ASR::expr_t *arg = b.Variable(fn_symtab_1, "x", arg_types[0],
3014+
ASR::intentType::In, ASR::abiType::BindC, true);
3015+
args_1.push_back(al, arg);
3016+
}
3017+
3018+
ASR::expr_t *return_var_1 = b.Variable(fn_symtab_1, c_func_name,
3019+
return_type, ASRUtils::intent_return_var, ASR::abiType::BindC, false);
3020+
3021+
SetChar dep_1; dep_1.reserve(al, 1);
3022+
Vec<ASR::stmt_t*> body_1; body_1.reserve(al, 1);
3023+
ASR::symbol_t *s = make_ASR_Function_t(c_func_name, fn_symtab_1, dep_1, args_1,
3024+
body_1, return_var_1, ASR::abiType::BindC, ASR::deftypeType::Interface, s2c(al, c_func_name));
3025+
fn_symtab->add_symbol(c_func_name, s);
3026+
dep.push_back(al, s2c(al, c_func_name));
3027+
body.push_back(al, b.Assignment(result, b.Call(s, args, return_type)));
3028+
}
3029+
3030+
ASR::symbol_t *new_symbol = make_ASR_Function_t(fn_name, fn_symtab, dep, args,
3031+
body, result, ASR::abiType::Source, ASR::deftypeType::Implementation, nullptr);
3032+
scope->add_symbol(fn_name, new_symbol);
3033+
return b.Call(new_symbol, new_args, return_type);
3034+
}
3035+
3036+
} // namespace BesselY0
3037+
29813038
namespace Poppar {
29823039

29833040
static ASR::expr_t *eval_Poppar(Allocator &al, const Location &loc,

src/libasr/pass/print_arr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,7 @@ class PrintArrVisitor : public PassUtils::PassVisitor<PrintArrVisitor>
359359
// DIVERGENCE between LFortran and LPython
360360
// If a pointer array variable is provided
361361
// then it will be printed as a normal array.
362-
if (!ASR::is_a<ASR::Pointer_t>(*ASRUtils::expr_type(x.m_values[i])) &&
363-
PassUtils::is_array(x.m_values[i])) {
362+
if (PassUtils::is_array(x.m_values[i])) {
364363
if (write_body.size() > 0) {
365364
print_args_apart_from_arrays(write_body, x);
366365
pass_result.push_back(al, empty_file_write_endl);

0 commit comments

Comments
 (0)