| // RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir | %FileCheck %s --check-prefix=CHECK-%target-cpu -check-prefix CHECK-%target-abi-%target-cpu -check-prefix CHECK-%target-sdk-name-%target-cpu |
| |
| sil_stage canonical |
| import c_layout |
| import Builtin |
| import Swift |
| |
| // TODO: Provide tests for other architectures |
| |
| // CHECK-x86_64: %TSo11BitfieldOneV = type <{ %Ts6UInt32V, %TSo6NestedV, [4 x i8], [4 x i8], %TSf, [1 x i8], [7 x i8], %Ts6UInt64V, %Ts6UInt32V, [4 x i8] }> |
| // CHECK-x86_64: %TSo6NestedV = type <{ %TSf, [3 x i8], [1 x i8] }> |
| |
| // CHECK-SYSV-x86_64: %TSo26BitfieldSeparatorReferenceV = type [[BITFIELD_SEP_TYPE:<{ %Ts5UInt8V, \[3 x i8\], %Ts5UInt8V }>]] |
| // CHECK-WIN-x86_64: %TSo26BitfieldSeparatorReferenceV = type [[BITFIELD_SEP_TYPE:<{ %Ts5UInt8V, %Ts5UInt8V }>]] |
| // CHECK-x86_64: %TSo25BitfieldSeparatorSameNameV = type [[BITFIELD_SEP_TYPE]] |
| // CHECK-x86_64: %TSo36BitfieldSeparatorDifferentNameStructV = type [[BITFIELD_SEP_TYPE]] |
| // CHECK-x86_64: %TSo21BitfieldSeparatorAnona = type [[BITFIELD_SEP_TYPE]] |
| |
| sil public_external @createBitfieldOne : $@convention(c) () -> BitfieldOne |
| sil public_external @consumeBitfieldOne : $@convention(c) (BitfieldOne) -> () |
| |
| sil @test0 : $() -> () { |
| bb0: |
| %0 = function_ref @createBitfieldOne : $@convention(c) () -> BitfieldOne |
| %1 = apply %0() : $@convention(c) () -> BitfieldOne |
| %2 = function_ref @consumeBitfieldOne : $@convention(c) (BitfieldOne) -> () |
| apply %2(%1) : $@convention(c) (BitfieldOne) -> () |
| %r = tuple () |
| return %r : $() |
| } |
| // CHECK-x86_64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test0() |
| // CHECK-x86_64: [[RESULT:%.*]] = alloca %TSo11BitfieldOneV, align 8 |
| // CHECK-x86_64: [[ARG:%.*]] = alloca %TSo11BitfieldOneV, align 8 |
| // Make the first call and pull all the values out of the indirect result. |
| // CHECK-x86_64: call void @createBitfieldOne(%TSo11BitfieldOneV* noalias nocapture sret [[RESULT]]) |
| // CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 0 |
| // CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_A]], i32 0, i32 0 |
| // CHECK-x86_64: [[A:%.*]] = load i32, i32* [[ADDR_A_V]], align 8 |
| // CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 1 |
| // CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 0 |
| // CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_B_X]], i32 0, i32 0 |
| // CHECK-x86_64: [[B_X:%.*]] = load float, float* [[ADDR_B_X_V]], align 4 |
| // CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 1 |
| // CHECK-x86_64: [[ADDR_B_YZ_1:%.*]] = bitcast [3 x i8]* [[ADDR_B_YZ]] to i24* |
| // CHECK-x86_64: [[B_YZ:%.*]] = load i24, i24* [[ADDR_B_YZ_1]], align 4 |
| // CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 2 |
| // CHECK-x86_64: [[ADDR_CDE_1:%.*]] = bitcast [4 x i8]* [[ADDR_CDE]] to i32* |
| // CHECK-x86_64: [[CDE:%.*]] = load i32, i32* [[ADDR_CDE_1]], align 4 |
| // CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 3 |
| // CHECK-x86_64: [[ADDR_FGH_1:%.*]] = bitcast [4 x i8]* [[ADDR_FGH]] to i32* |
| // CHECK-x86_64: [[FGH:%.*]] = load i32, i32* [[ADDR_FGH_1]], align 8 |
| // CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 4 |
| // CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_I]], i32 0, i32 0 |
| // CHECK-x86_64: [[I:%.*]] = load float, float* [[ADDR_I_V]], align 4 |
| // CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 5 |
| // CHECK-x86_64: [[ADDR_JK_1:%.*]] = bitcast [1 x i8]* [[ADDR_JK]] to i8* |
| // CHECK-x86_64: [[JK:%.*]] = load i8, i8* [[ADDR_JK_1]], align 8 |
| // CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 7 |
| // CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, %Ts6UInt64V* [[ADDR_L]], i32 0, i32 0 |
| // CHECK-x86_64: [[L:%.*]] = load i64, i64* [[ADDR_L_V]], align 8 |
| // CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 8 |
| // CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_M]], i32 0, i32 0 |
| // CHECK-x86_64: [[M:%.*]] = load i32, i32* [[ADDR_M_V]], align 8 |
| // Put all of the values into the indirect argument and make the second call. |
| // CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 0 |
| // CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_A]], i32 0, i32 0 |
| // CHECK-x86_64: store i32 [[A]], i32* [[ADDR_A_V]], align 8 |
| // CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 1 |
| // CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 0 |
| // CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_B_X]], i32 0, i32 0 |
| // CHECK-x86_64: store float [[B_X]], float* [[ADDR_B_X_V]], align 4 |
| // CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 1 |
| // CHECK-x86_64: [[ADDR_B_YZ_1:%.*]] = bitcast [3 x i8]* [[ADDR_B_YZ]] to i24* |
| // CHECK-x86_64: store i24 [[B_YZ]], i24* [[ADDR_B_YZ_1]], align 4 |
| // CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 2 |
| // CHECK-x86_64: [[ADDR_CDE_1:%.*]] = bitcast [4 x i8]* [[ADDR_CDE]] to i32* |
| // CHECK-x86_64: store i32 [[CDE]], i32* [[ADDR_CDE_1]], align 4 |
| // CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 3 |
| // CHECK-x86_64: [[ADDR_FGH_1:%.*]] = bitcast [4 x i8]* [[ADDR_FGH]] to i32* |
| // CHECK-x86_64: store i32 [[FGH]], i32* [[ADDR_FGH_1]], align 8 |
| // CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 4 |
| // CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_I]], i32 0, i32 0 |
| // CHECK-x86_64: store float [[I]], float* [[ADDR_I_V]], align 4 |
| // CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 5 |
| // CHECK-x86_64: [[ADDR_JK_1:%.*]] = bitcast [1 x i8]* [[ADDR_JK]] to i8* |
| // CHECK-x86_64: store i8 [[JK]], i8* [[ADDR_JK_1]], align 8 |
| // CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 7 |
| // CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, %Ts6UInt64V* [[ADDR_L]], i32 0, i32 0 |
| // CHECK-x86_64: store i64 [[L]], i64* [[ADDR_L_V]], align 8 |
| // CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 8 |
| // CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_M]], i32 0, i32 0 |
| // CHECK-x86_64: store i32 [[M]], i32* [[ADDR_M_V]], align 8 |
| // CHECK-SYSV-x86_64: call void @consumeBitfieldOne(%TSo11BitfieldOneV* byval align 8 [[ARG]]) |
| // CHECK-WIN-x86_64: call void @consumeBitfieldOne(%TSo11BitfieldOneV* [[ARG]]) |
| // CHECK-x86_64: ret void |
| |
| |
| sil public_external @testBitfields : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) |
| |
| sil @testTypedefs : $() -> () { |
| bb0: |
| %0 = function_ref @testBitfields : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) |
| %1 = apply %0() : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) |
| %r = tuple () |
| return %r : $() |
| } |
| |
| sil public_external @createSIMDStruct : $@convention(c) () -> SIMDStruct |
| sil public_external @consumeSIMDStruct : $@convention(c) (SIMDStruct) -> () |
| |
| // CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testSIMDStruct() |
| // CHECK-SYSV-x86_64: call <3 x float> @createSIMDStruct |
| // CHECK-WIN-x86_64: call void @createSIMDStruct(%TSo10SIMDStructV* noalias nocapture sret % |
| // CHECK-SYSV-x86_64: call void @consumeSIMDStruct(<3 x float> |
| // CHECK-WIN-x86_64: call void @consumeSIMDStruct(%TSo10SIMDStructV* % |
| sil @testSIMDStruct : $() -> () { |
| bb0: |
| %f = function_ref @createSIMDStruct : $@convention(c) () -> SIMDStruct |
| %x = apply %f() : $@convention(c) () -> SIMDStruct |
| %g = function_ref @consumeSIMDStruct : $@convention(c) (SIMDStruct) -> () |
| %z = apply %g(%x) : $@convention(c) (SIMDStruct) -> () |
| return undef : $() |
| } |
| |
| sil @testRecursive : $@convention(thin) () -> Builtin.Word { |
| bb0: |
| %m = metatype $@thin HasRecursivePointers.Type |
| %s = builtin "sizeof"<HasRecursivePointers>(%m : $@thin HasRecursivePointers.Type) : $Builtin.Word |
| return %s : $Builtin.Word |
| } |
| |
| // CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-SYSV-x86_64: call signext i8 @chareth(i8 signext |
| // CHECK-WIN-x86_64: call i8 @chareth(i8 |
| // CHECK-SYSV-x86_64: call signext i8 @signedChareth(i8 signext |
| // CHECK-WIN-x86_64: call i8 @signedChareth(i8 |
| // CHECK-SYSV-x86_64: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-WIN-x86_64: call i8 @unsignedChareth(i8 |
| // CHECK-SYSV-x86_64: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-WIN-x86_64: call i16 @eatMyShorts(i16 |
| // CHECK-SYSV-x86_64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-WIN-x86_64: call i16 @eatMyUnsignedShorts(i16 |
| // CHECK-x86_64: call i32 @ints(i32 %5) |
| // CHECK-x86_64: call i32 @unsigneds(i32 %6) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @chareth(i8) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @signedChareth(i8) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @unsignedChareth(i8) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i16 @eatMyShorts(i16) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i16 @eatMyUnsignedShorts(i16) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-i386: call signext i8 @chareth(i8 signext |
| // CHECK-i386: call signext i8 @signedChareth(i8 signext |
| // CHECK-i386: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-i386: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-i386: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-i386: call i32 @ints(i32 %5) |
| // CHECK-i386: call i32 @unsigneds(i32 %6) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-i386-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-armv7-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-ios-armv7: call signext i8 @chareth(i8 signext |
| // CHECK-ios-armv7: call signext i8 @signedChareth(i8 signext |
| // CHECK-android-armv7: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-android-armv7: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-linux-armv7: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-linux-armv7: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-windows-armv7: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-windows-armv7: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-armv7: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-armv7: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-armv7: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-armv7: call i32 @ints(i32 %5) |
| // CHECK-armv7: call i32 @unsigneds(i32 %6) |
| // CHECK-ios-armv7-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-ios-armv7-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-android-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-android-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-linux-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-linux-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-windows-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-windows-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-armv7-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-armv7-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-armv7-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-armv7-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-armv7s-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-armv7s: call signext i8 @chareth(i8 signext |
| // CHECK-armv7s: call signext i8 @signedChareth(i8 signext |
| // CHECK-armv7s: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-armv7s: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-armv7s: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-armv7s: call i32 @ints(i32 %5) |
| // CHECK-armv7s: call i32 @unsigneds(i32 %6) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-armv7s-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-armv7k-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-armv7k: call signext i8 @chareth(i8 signext |
| // CHECK-armv7k: call signext i8 @signedChareth(i8 signext |
| // CHECK-armv7k: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-armv7k: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-armv7k: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-armv7k: call i32 @ints(i32 %5) |
| // CHECK-armv7k: call i32 @unsigneds(i32 %6) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-armv7k-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-arm64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-arm64: call signext i8 @chareth(i8 signext |
| // CHECK-arm64: call signext i8 @signedChareth(i8 signext |
| // CHECK-arm64: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-arm64: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-arm64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-arm64: call i32 @ints(i32 %5) |
| // CHECK-arm64: call i32 @unsigneds(i32 %6) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-arm64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-arm64e-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-arm64e: call signext i8 @chareth(i8 signext |
| // CHECK-arm64e: call signext i8 @signedChareth(i8 signext |
| // CHECK-arm64e: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-arm64e: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-arm64e: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-arm64e: call i32 @ints(i32 %5) |
| // CHECK-arm64e: call i32 @unsigneds(i32 %6) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-arm64e-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-aarch64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-aarch64: call i8 @chareth(i8 %0) |
| // CHECK-aarch64: call i8 @signedChareth(i8 %1) |
| // CHECK-aarch64: call i8 @unsignedChareth(i8 %2) |
| // CHECK-aarch64: call i16 @eatMyShorts(i16 %3) |
| // CHECK-aarch64: call i16 @eatMyUnsignedShorts(i16 %4) |
| // CHECK-aarch64: call i32 @ints(i32 %5) |
| // CHECK-aarch64: call i32 @unsigneds(i32 %6) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @chareth(i8) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @signedChareth(i8) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @unsignedChareth(i8) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i16 @eatMyShorts(i16) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i16 @eatMyUnsignedShorts(i16) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) |
| // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) |
| |
| // CHECK-powerpc64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-powerpc64: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-powerpc64: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-powerpc64: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-powerpc64: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-powerpc64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-powerpc64: call signext i32 @ints(i32 signext %5) |
| // CHECK-powerpc64: call zeroext i32 @unsigneds(i32 zeroext %6) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) |
| // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) |
| |
| // CHECK-powerpc64le-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-powerpc64le: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-powerpc64le: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-powerpc64le: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-powerpc64le: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-powerpc64le: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-powerpc64le: call signext i32 @ints(i32 signext %5) |
| // CHECK-powerpc64le: call zeroext i32 @unsigneds(i32 zeroext %6) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) |
| // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) |
| |
| // CHECK-s390x-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension |
| // CHECK-s390x: call zeroext i8 @chareth(i8 zeroext |
| // CHECK-s390x: call zeroext i8 @signedChareth(i8 zeroext |
| // CHECK-s390x: call zeroext i8 @unsignedChareth(i8 zeroext |
| // CHECK-s390x: call signext i16 @eatMyShorts(i16 signext |
| // CHECK-s390x: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext |
| // CHECK-s390x: call signext i32 @ints(i32 signext %5) |
| // CHECK-s390x: call zeroext i32 @unsigneds(i32 zeroext %6) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) |
| // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) |
| |
| sil @testIntegerExtension : $@convention(thin) (CChar, CSignedChar, CUnsignedChar, CShort, CUnsignedShort, CInt, CUnsignedInt) -> () { |
| entry(%a : $CChar, %b : $CSignedChar, %c : $CUnsignedChar, %d : $CShort, %e : $CUnsignedShort, %f : $CInt, %g : $CUnsignedInt): |
| %h = function_ref @chareth : $@convention(c) (CChar) -> CChar |
| %i = apply %h(%a) : $@convention(c) (CChar) -> CChar |
| |
| %j = function_ref @signedChareth : $@convention(c) (CSignedChar) -> CSignedChar |
| %k = apply %j(%b) : $@convention(c) (CSignedChar) -> CSignedChar |
| |
| %l = function_ref @unsignedChareth : $@convention(c) (CUnsignedChar) -> CUnsignedChar |
| %m = apply %l(%c) : $@convention(c) (CUnsignedChar) -> CUnsignedChar |
| |
| %n = function_ref @eatMyShorts : $@convention(c) (CShort) -> CShort |
| %o = apply %n(%d) : $@convention(c) (CShort) -> CShort |
| |
| %p = function_ref @eatMyUnsignedShorts : $@convention(c) (CUnsignedShort) -> CUnsignedShort |
| %q = apply %p(%e) : $@convention(c) (CUnsignedShort) -> CUnsignedShort |
| |
| %r = function_ref @ints : $@convention(c) (CInt) -> CInt |
| %s = apply %r(%f) : $@convention(c) (CInt) -> CInt |
| |
| %t = function_ref @unsigneds : $@convention(c) (CUnsignedInt) -> CUnsignedInt |
| %u = apply %t(%g) : $@convention(c) (CUnsignedInt) -> CUnsignedInt |
| |
| return undef : $() |
| } |
| |
| // CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @testIntegerExtensionInBlock(%objc_block* %0, i8 %1) |
| sil @testIntegerExtensionInBlock : $@convention(thin) (@owned @convention(block) (CChar) -> CChar, CChar) -> CChar { |
| entry(%b : $@convention(block) (CChar) -> CChar, %c : $CChar): |
| // CHECK-SYSV-x86_64: call signext i8 {{%.*}}(%objc_block* {{%.*}}, i8 signext {{%.*}}) |
| // CHECK-WIN-x86_64: call i8 {{%.*}}(%objc_block* {{%.*}}, i8 {{%.*}}) |
| %r = apply %b(%c) : $@convention(block) (CChar) -> CChar |
| return %r : $CChar |
| } |
| |
| // CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testBitfieldInBlock |
| // CHECK-SYSV-x86_64: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* byval align 8 {{%.*}}) |
| // CHECK-WIN-x86_64: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* {{%.*}}) |
| sil @testBitfieldInBlock : $@convention(thin) (@owned @convention(block) (BitfieldOne) -> BitfieldOne, BitfieldOne) -> BitfieldOne { |
| entry(%b : $@convention(block) (BitfieldOne) -> BitfieldOne, %x : $BitfieldOne): |
| %r = apply %b(%x) : $@convention(block) (BitfieldOne) -> BitfieldOne |
| return %r : $BitfieldOne |
| } |
| |
| sil public_external @chareth : $@convention(c) (CChar) -> CChar |
| sil public_external @signedChareth : $@convention(c) (CSignedChar) -> CSignedChar |
| sil public_external @unsignedChareth : $@convention(c) (CUnsignedChar) -> CUnsignedChar |
| sil public_external @eatMyShorts : $@convention(c) (CShort) -> CShort |
| sil public_external @eatMyUnsignedShorts : $@convention(c) (CUnsignedShort) -> CUnsignedShort |
| sil public_external @ints : $@convention(c) (CInt) -> CInt |
| sil public_external @unsigneds : $@convention(c) (CUnsignedInt) -> CUnsignedInt |
| |