Skip to content

Commit 60c7c39

Browse files
authored
Merge pull request #1889 from Smit-create/i-1867
Support real <-> unsigned integer cast
2 parents 6c917f0 + 18625f6 commit 60c7c39

File tree

5 files changed

+41
-1
lines changed

5 files changed

+41
-1
lines changed

integration_tests/expr_01u.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from lpython import inline, u32
1+
from lpython import inline, u32, u64, i64
22

33
@inline
44
def uadd(x: u32, y: u32) -> u32:
@@ -20,6 +20,14 @@ def main1():
2020
z = uand_op(x, y)
2121
assert z == u32(16)
2222

23+
# test issue 1867
24+
cycles_count: u64
25+
end_cycle: i64 = i64(100)
26+
start_cycle: i64 = i64(4)
27+
num_iters: i64 = i64(4)
28+
cycles_count = u64((end_cycle - start_cycle) / num_iters)
29+
assert cycles_count == u64(24)
30+
2331

2432
main1()
2533

src/libasr/ASR.asdl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,9 @@ cast_kind
425425
| IntegerToCharacter
426426
| LogicalToCharacter
427427
| UnsignedIntegerToInteger
428+
| UnsignedIntegerToReal
428429
| IntegerToUnsignedInteger
430+
| RealToUnsignedInteger
429431
| CPtrToUnsignedInteger
430432
| UnsignedIntegerToCPtr
431433

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1491,12 +1491,28 @@ R"(#include <stdio.h>
14911491
last_expr_precedence = 2;
14921492
break;
14931493
}
1494+
case (ASR::cast_kindType::RealToUnsignedInteger) : {
1495+
int dest_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
1496+
src = "(uint" + std::to_string(dest_kind * 8) + "_t)(" + src + ")";
1497+
last_expr_precedence = 2;
1498+
break;
1499+
}
14941500
case (ASR::cast_kindType::UnsignedIntegerToInteger) : {
14951501
int dest_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
14961502
src = "(int" + std::to_string(dest_kind * 8) + "_t)(" + src + ")";
14971503
last_expr_precedence = 2;
14981504
break;
14991505
}
1506+
case (ASR::cast_kindType::UnsignedIntegerToReal) : {
1507+
int dest_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
1508+
switch (dest_kind) {
1509+
case 4: src = "(float)(" + src + ")"; break;
1510+
case 8: src = "(double)(" + src + ")"; break;
1511+
default: throw CodeGenError("Cast IntegerToReal: Unsupported Kind " + std::to_string(dest_kind));
1512+
}
1513+
last_expr_precedence = 2;
1514+
break;
1515+
}
15001516
case (ASR::cast_kindType::ComplexToComplex) : {
15011517
break;
15021518
}

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6585,6 +6585,11 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
65856585
tmp = builder->CreateSIToFP(tmp, getFPType(a_kind, false));
65866586
break;
65876587
}
6588+
case (ASR::cast_kindType::UnsignedIntegerToReal) : {
6589+
int a_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
6590+
tmp = builder->CreateSIToFP(tmp, getFPType(a_kind, false));
6591+
break;
6592+
}
65886593
case (ASR::cast_kindType::LogicalToReal) : {
65896594
int a_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
65906595
tmp = builder->CreateUIToFP(tmp, getFPType(a_kind, false));
@@ -6597,6 +6602,13 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
65976602
tmp = builder->CreateFPToSI(tmp, target_type);
65986603
break;
65996604
}
6605+
case (ASR::cast_kindType::RealToUnsignedInteger) : {
6606+
llvm::Type *target_type;
6607+
int a_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
6608+
target_type = getIntType(a_kind);
6609+
tmp = builder->CreateFPToSI(tmp, target_type);
6610+
break;
6611+
}
66006612
case (ASR::cast_kindType::RealToComplex) : {
66016613
llvm::Type *target_type;
66026614
llvm::Value *zero;

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@ namespace CastingUtil {
5555
{std::make_pair(ASR::ttypeType::Real, ASR::ttypeType::Complex), ASR::cast_kindType::RealToComplex},
5656
{std::make_pair(ASR::ttypeType::Real, ASR::ttypeType::Integer), ASR::cast_kindType::RealToInteger},
5757
{std::make_pair(ASR::ttypeType::Real, ASR::ttypeType::Logical), ASR::cast_kindType::RealToLogical},
58+
{std::make_pair(ASR::ttypeType::Real, ASR::ttypeType::UnsignedInteger), ASR::cast_kindType::RealToUnsignedInteger},
5859
{std::make_pair(ASR::ttypeType::Integer, ASR::ttypeType::Complex), ASR::cast_kindType::IntegerToComplex},
5960
{std::make_pair(ASR::ttypeType::Integer, ASR::ttypeType::Real), ASR::cast_kindType::IntegerToReal},
6061
{std::make_pair(ASR::ttypeType::Integer, ASR::ttypeType::Logical), ASR::cast_kindType::IntegerToLogical},
6162
{std::make_pair(ASR::ttypeType::Integer, ASR::ttypeType::UnsignedInteger), ASR::cast_kindType::IntegerToUnsignedInteger},
6263
{std::make_pair(ASR::ttypeType::Logical, ASR::ttypeType::Real), ASR::cast_kindType::LogicalToReal},
6364
{std::make_pair(ASR::ttypeType::Logical, ASR::ttypeType::Integer), ASR::cast_kindType::LogicalToInteger},
6465
{std::make_pair(ASR::ttypeType::UnsignedInteger, ASR::ttypeType::Integer), ASR::cast_kindType::UnsignedIntegerToInteger},
66+
{std::make_pair(ASR::ttypeType::UnsignedInteger, ASR::ttypeType::Real), ASR::cast_kindType::UnsignedIntegerToReal}
6567
};
6668

6769
// Data structure which contains casting rules for equal intrinsic

0 commit comments

Comments
 (0)