Last active
October 13, 2023 20:29
-
-
Save FreeMasen/a8b53fc148c71c70d6512fb695cb7a37 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = 'std::tvalue' | |
source_filename = "std::tvalue" | |
%"std::tvalue::TValue" = type { i8, [23 x i8] } | |
%"std::tvalue::TValue::Number" = type { [12 x i8], float } | |
define void @"std::tvalue::new_num"(ptr sret(%"std::tvalue::TValue") %0, float %1) { | |
entry: | |
%tag_ptr = getelementptr inbounds %"std::tvalue::TValue", ptr %0, i32 0, i32 0 | |
store i8 2, ptr %tag_ptr, align 1 | |
%data_ptr = getelementptr inbounds %"std::tvalue::TValue::Number", ptr %0, i32 0, i32 1 | |
store float %1, ptr %data_ptr, align 4 | |
ret void | |
} | |
define i8 @"std::tvalue::get_tag"(ptr %tagged_value) { | |
entry: | |
%is_null = icmp eq ptr %tagged_value, null | |
br i1 %is_null, label %null_block, label %not_null | |
null_block: ; preds = %entry | |
ret i8 0 | |
not_null: ; preds = %entry | |
%tag_ptr = getelementptr inbounds %"std::tvalue::TValue", ptr %tagged_value, i32 0, i32 0 | |
%tag_val = load i8, ptr %tag_ptr, align 1 | |
ret i8 %tag_val | |
} | |
define i1 @"std::tvalue::is_number"(ptr %0) { | |
entry: | |
%tag = call i8 @"std::tvalue::get_tag"(ptr %0) | |
%cmp = icmp eq i8 %tag, 2 | |
ret i1 %cmp | |
} | |
define i1 @"std::tvalue::is_two_numbers"(ptr %lhs, ptr %rhs) { | |
entry: | |
%lhs_is_num = call i1 @"std::tvalue::is_number"(ptr %lhs) | |
br i1 %lhs_is_num, label %lhs_ian, label %nan | |
nan: ; preds = %lhs_ian, %entry | |
ret i1 false | |
lhs_ian: ; preds = %entry | |
%rhs_is_num = call i1 @"std::tvalue::is_number"(ptr %rhs) | |
br i1 %rhs_is_num, label %rhs_ian, label %nan | |
rhs_ian: ; preds = %lhs_ian | |
ret i1 true | |
} | |
define float @"std::tvalue::get_value_number"(ptr %0) { | |
entry: | |
%is_num = call i1 @"std::tvalue::is_number"(ptr %0) | |
br i1 %is_num, label %ian, label %nan | |
ian: ; preds = %entry | |
%value_ptr = getelementptr inbounds %"std::tvalue::TValue::Number", ptr %0, i32 0, i32 1 | |
%value = load float, ptr %value_ptr, align 4 | |
ret float %value | |
nan: ; preds = %entry | |
ret float 0x7FF8000000000000 | |
} | |
define i1 @"std::tvalue::sub"(ptr %out, ptr %lhs, ptr %rhs) { | |
entry: | |
%are_nums = call i1 @"std::tvalue::is_two_numbers"(ptr %lhs, ptr %rhs) | |
br i1 %are_nums, label %ian, label %nan | |
ian: ; preds = %entry | |
%lhs_value = call float @"std::tvalue::get_value_number"(ptr %lhs) | |
%rhs_value = call float @"std::tvalue::get_value_number"(ptr %rhs) | |
%out_value = fsub float %lhs_value, %rhs_value | |
call void @"std::tvalue::new_num"(ptr %out, float %out_value) | |
ret i1 true | |
nan: ; preds = %entry | |
ret i1 false | |
} | |
define float @test_happy_sub(float %0, float %1) { | |
entry: | |
%lhs = alloca %"std::tvalue::TValue::Number", align 8 | |
call void @"std::tvalue::new_num"(ptr %lhs, float %0) | |
%rhs = alloca %"std::tvalue::TValue::Number", align 8 | |
call void @"std::tvalue::new_num"(ptr %rhs, float %1) | |
%ret = alloca %"std::tvalue::TValue::Number", align 8 | |
call void @"std::tvalue::new_num"(ptr %ret, float 0x7FF8000000000000) | |
%ret1 = call i1 @"std::tvalue::sub"(ptr %lhs, ptr %rhs, ptr %ret) | |
%ret2 = call float @"std::tvalue::get_value_number"(ptr %ret) | |
ret float %ret2 | |
} | |
define i32 @main() { | |
call float @test_happy_sub(float 10.0, float 5.0) | |
ret i32 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment