Skip to content

Instantly share code, notes, and snippets.

@Azoy
Created January 21, 2019 08:20
Show Gist options
  • Save Azoy/12c131dd50b9d3610ac98e290123f8a8 to your computer and use it in GitHub Desktop.
Save Azoy/12c131dd50b9d3610ac98e290123f8a8 to your computer and use it in GitHub Desktop.
Float16(Float80(value))
sil_stage canonical
import Builtin
import Swift
import SwiftShims
func x()
// main
sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 {
bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>):
%2 = integer_literal $Builtin.Int32, 0 // user: %3
%3 = struct $Int32 (%2 : $Builtin.Int32) // user: %4
return %3 : $Int32 // id: %4
} // end sil function 'main'
// x()
sil hidden @$s4main1xyyF : $@convention(thin) () -> () {
bb0:
%0 = alloc_stack $Float16, var, name "x" // users: %49, %50
%1 = float_literal $Builtin.FPIEEE80, 0x3FFF8000000000000000 // 1 // user: %14
%2 = float_literal $Builtin.FPIEEE32, 0x3F800000 // 1 // users: %3, %4, %12
%3 = struct $Float (%2 : $Builtin.FPIEEE32) // users: %17, %31
%4 = builtin "bitcast_FPIEEE32_Int32"(%2 : $Builtin.FPIEEE32) : $Builtin.Int32 // users: %26, %20, %6
%5 = integer_literal $Builtin.Int32, 23 // user: %6
%6 = builtin "lshr_Int32"(%4 : $Builtin.Int32, %5 : $Builtin.Int32) : $Builtin.Int32 // user: %7
%7 = builtin "zextOrBitCast_Int32_Int64"(%6 : $Builtin.Int32) : $Builtin.Int64 // user: %9
%8 = integer_literal $Builtin.Int64, 255 // users: %10, %9
%9 = builtin "and_Int64"(%7 : $Builtin.Int64, %8 : $Builtin.Int64) : $Builtin.Int64 // user: %10
%10 = builtin "cmp_ult_Int64"(%9 : $Builtin.Int64, %8 : $Builtin.Int64) : $Builtin.Int1 // user: %11
cond_br %10, bb1, bb2 // id: %11
bb1: // Preds: bb0
%12 = builtin "fpext_FPIEEE32_FPIEEE80"(%2 : $Builtin.FPIEEE32) : $Builtin.FPIEEE80 // user: %13
%13 = builtin "int_fabs_FPIEEE80"(%12 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // user: %15
%14 = builtin "int_fabs_FPIEEE80"(%1 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // users: %36, %15
%15 = builtin "fcmp_olt_FPIEEE80"(%14 : $Builtin.FPIEEE80, %13 : $Builtin.FPIEEE80) : $Builtin.Int1 // user: %16
cond_br %15, bb3, bb4 // id: %16
bb2: // Preds: bb0
br bb8(%3 : $Float) // id: %17
bb3: // Preds: bb1
%18 = integer_literal $Builtin.Int32, 0 // user: %20
%19 = integer_literal $Builtin.Int1, 0 // users: %26, %23, %20
%20 = builtin "usub_with_overflow_Int32"(%18 : $Builtin.Int32, %4 : $Builtin.Int32, %19 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %21
%21 = tuple_extract %20 : $(Builtin.Int32, Builtin.Int1), 0 // user: %23
%22 = integer_literal $Builtin.Int32, 1 // users: %25, %23
%23 = builtin "usub_with_overflow_Int32"(%21 : $Builtin.Int32, %22 : $Builtin.Int32, %19 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %24
%24 = tuple_extract %23 : $(Builtin.Int32, Builtin.Int1), 0 // user: %25
%25 = builtin "and_Int32"(%24 : $Builtin.Int32, %22 : $Builtin.Int32) : $Builtin.Int32 // user: %26
%26 = builtin "usub_with_overflow_Int32"(%4 : $Builtin.Int32, %25 : $Builtin.Int32, %19 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %27
%27 = tuple_extract %26 : $(Builtin.Int32, Builtin.Int1), 0 // user: %28
%28 = builtin "bitcast_Int32_FPIEEE32"(%27 : $Builtin.Int32) : $Builtin.FPIEEE32 // user: %29
%29 = struct $Float (%28 : $Builtin.FPIEEE32) // user: %30
br bb5(%29 : $Float) // id: %30
bb4: // Preds: bb1
br bb5(%3 : $Float) // id: %31
// %32 // users: %44, %33
bb5(%32 : $Float): // Preds: bb4 bb3
%33 = struct_extract %32 : $Float, #Float._value // users: %38, %34
%34 = builtin "fpext_FPIEEE32_FPIEEE80"(%33 : $Builtin.FPIEEE32) : $Builtin.FPIEEE80 // user: %35
%35 = builtin "int_fabs_FPIEEE80"(%34 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // user: %36
%36 = builtin "fcmp_olt_FPIEEE80"(%35 : $Builtin.FPIEEE80, %14 : $Builtin.FPIEEE80) : $Builtin.Int1 // user: %37
cond_br %36, bb6, bb7 // id: %37
bb6: // Preds: bb5
%38 = builtin "bitcast_FPIEEE32_Int32"(%33 : $Builtin.FPIEEE32) : $Builtin.Int32 // user: %40
%39 = integer_literal $Builtin.Int32, 1 // user: %40
%40 = builtin "or_Int32"(%38 : $Builtin.Int32, %39 : $Builtin.Int32) : $Builtin.Int32 // user: %41
%41 = builtin "bitcast_Int32_FPIEEE32"(%40 : $Builtin.Int32) : $Builtin.FPIEEE32 // user: %42
%42 = struct $Float (%41 : $Builtin.FPIEEE32) // user: %43
br bb8(%42 : $Float) // id: %43
bb7: // Preds: bb5
br bb8(%32 : $Float) // id: %44
// %45 // user: %46
bb8(%45 : $Float): // Preds: bb2 bb7 bb6
%46 = struct_extract %45 : $Float, #Float._value // user: %47
%47 = builtin "fptrunc_FPIEEE32_FPIEEE16"(%46 : $Builtin.FPIEEE32) : $Builtin.FPIEEE16 // user: %48
%48 = struct $Float16 (%47 : $Builtin.FPIEEE16) // user: %49
store %48 to %0 : $*Float16 // id: %49
dealloc_stack %0 : $*Float16 // id: %50
%51 = tuple () // user: %52
return %51 : $() // id: %52
} // end sil function '$s4main1xyyF'
// Float16.init(_builtinFloatLiteral:)
sil public_external [transparent] [serialized] @$ss7Float16V20_builtinFloatLiteralABBf80__tcfC : $@convention(method) (Builtin.FPIEEE80, @thin Float16.Type) -> Float16 {
// %0 // users: %15, %2
bb0(%0 : $Builtin.FPIEEE80, %1 : $@thin Float16.Type):
%2 = builtin "fptrunc_FPIEEE80_FPIEEE32"(%0 : $Builtin.FPIEEE80) : $Builtin.FPIEEE32 // users: %13, %4, %3
%3 = struct $Float (%2 : $Builtin.FPIEEE32) // users: %18, %12
%4 = builtin "bitcast_FPIEEE32_Int32"(%2 : $Builtin.FPIEEE32) : $Builtin.Int32 // users: %27, %21, %6
%5 = integer_literal $Builtin.Int32, 23 // user: %6
%6 = builtin "lshr_Int32"(%4 : $Builtin.Int32, %5 : $Builtin.Int32) : $Builtin.Int32 // user: %7
%7 = builtin "zextOrBitCast_Int32_Int64"(%6 : $Builtin.Int32) : $Builtin.Int64 // user: %9
%8 = integer_literal $Builtin.Int64, 255 // users: %10, %9
%9 = builtin "and_Int64"(%7 : $Builtin.Int64, %8 : $Builtin.Int64) : $Builtin.Int64 // user: %10
%10 = builtin "cmp_ult_Int64"(%9 : $Builtin.Int64, %8 : $Builtin.Int64) : $Builtin.Int1 // user: %11
cond_br %10, bb2, bb1 // id: %11
bb1: // Preds: bb0
br bb8(%3 : $Float) // id: %12
bb2: // Preds: bb0
%13 = builtin "fpext_FPIEEE32_FPIEEE80"(%2 : $Builtin.FPIEEE32) : $Builtin.FPIEEE80 // user: %14
%14 = builtin "int_fabs_FPIEEE80"(%13 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // user: %16
%15 = builtin "int_fabs_FPIEEE80"(%0 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // users: %36, %16
%16 = builtin "fcmp_olt_FPIEEE80"(%15 : $Builtin.FPIEEE80, %14 : $Builtin.FPIEEE80) : $Builtin.Int1 // user: %17
cond_br %16, bb4, bb3 // id: %17
bb3: // Preds: bb2
br bb5(%3 : $Float) // id: %18
bb4: // Preds: bb2
%19 = integer_literal $Builtin.Int32, 0 // user: %21
%20 = integer_literal $Builtin.Int1, 0 // users: %27, %24, %21
%21 = builtin "usub_with_overflow_Int32"(%19 : $Builtin.Int32, %4 : $Builtin.Int32, %20 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %22
%22 = tuple_extract %21 : $(Builtin.Int32, Builtin.Int1), 0 // user: %24
%23 = integer_literal $Builtin.Int32, 1 // users: %26, %24
%24 = builtin "usub_with_overflow_Int32"(%22 : $Builtin.Int32, %23 : $Builtin.Int32, %20 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %25
%25 = tuple_extract %24 : $(Builtin.Int32, Builtin.Int1), 0 // user: %26
%26 = builtin "and_Int32"(%25 : $Builtin.Int32, %23 : $Builtin.Int32) : $Builtin.Int32 // user: %27
%27 = builtin "usub_with_overflow_Int32"(%4 : $Builtin.Int32, %26 : $Builtin.Int32, %20 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) // user: %28
%28 = tuple_extract %27 : $(Builtin.Int32, Builtin.Int1), 0 // user: %29
%29 = builtin "bitcast_Int32_FPIEEE32"(%28 : $Builtin.Int32) : $Builtin.FPIEEE32 // user: %30
%30 = struct $Float (%29 : $Builtin.FPIEEE32) // user: %31
br bb5(%30 : $Float) // id: %31
// %32 // users: %38, %33
bb5(%32 : $Float): // Preds: bb4 bb3
%33 = struct_extract %32 : $Float, #Float._value // users: %39, %34
%34 = builtin "fpext_FPIEEE32_FPIEEE80"(%33 : $Builtin.FPIEEE32) : $Builtin.FPIEEE80 // user: %35
%35 = builtin "int_fabs_FPIEEE80"(%34 : $Builtin.FPIEEE80) : $Builtin.FPIEEE80 // user: %36
%36 = builtin "fcmp_olt_FPIEEE80"(%35 : $Builtin.FPIEEE80, %15 : $Builtin.FPIEEE80) : $Builtin.Int1 // user: %37
cond_br %36, bb7, bb6 // id: %37
bb6: // Preds: bb5
br bb8(%32 : $Float) // id: %38
bb7: // Preds: bb5
%39 = builtin "bitcast_FPIEEE32_Int32"(%33 : $Builtin.FPIEEE32) : $Builtin.Int32 // user: %41
%40 = integer_literal $Builtin.Int32, 1 // user: %41
%41 = builtin "or_Int32"(%39 : $Builtin.Int32, %40 : $Builtin.Int32) : $Builtin.Int32 // user: %42
%42 = builtin "bitcast_Int32_FPIEEE32"(%41 : $Builtin.Int32) : $Builtin.FPIEEE32 // user: %43
%43 = struct $Float (%42 : $Builtin.FPIEEE32) // user: %44
br bb8(%43 : $Float) // id: %44
// %45 // user: %46
bb8(%45 : $Float): // Preds: bb7 bb6 bb1
%46 = struct_extract %45 : $Float, #Float._value // user: %47
%47 = builtin "fptrunc_FPIEEE32_FPIEEE16"(%46 : $Builtin.FPIEEE32) : $Builtin.FPIEEE16 // user: %48
%48 = struct $Float16 (%47 : $Builtin.FPIEEE16) // user: %49
return %48 : $Float16 // id: %49
} // end sil function '$ss7Float16V20_builtinFloatLiteralABBf80__tcfC'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment