Skip to content

Instantly share code, notes, and snippets.

@FreeMasen
Last active October 13, 2023 20:29
Show Gist options
  • Save FreeMasen/a8b53fc148c71c70d6512fb695cb7a37 to your computer and use it in GitHub Desktop.
Save FreeMasen/a8b53fc148c71c70d6512fb695cb7a37 to your computer and use it in GitHub Desktop.
; 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