; RUN: llc -mtriple armv7-apple-ios -relocation-model=pic -o - %s | FileCheck %s -check-prefix=ARM-PIC -check-prefix=ARM ; RUN: llc -mtriple armv7-apple-ios -relocation-model=static -o - %s | FileCheck %s -check-prefix=ARM-NOPIC -check-prefix=ARM ; RUN: llc -mtriple armv7-apple-ios -relocation-model=dynamic-no-pic -o - %s | FileCheck %s -check-prefix=ARM-NOPIC -check-prefix=ARM ; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=pic -o - %s | FileCheck %s -check-prefix=THUMB1-PIC -check-prefix=THUMB1 ; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=static -o - %s | FileCheck %s -check-prefix=THUMB1-NOPIC -check-prefix=THUMB1 ; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=dynamic-no-pic -o - %s | FileCheck %s -check-prefix=THUMB1-NOPIC -check-prefix=THUMB1 @_ZTIi = external constant ptr define i32 @main() #0 personality ptr @__gxx_personality_sj0 { entry: %exception = tail call ptr @__cxa_allocate_exception(i32 4) #1 store i32 1, ptr %exception, align 4 invoke void @__cxa_throw(ptr %exception, ptr @_ZTIi, ptr null) #2 to label %unreachable unwind label %lpad lpad: ; preds = %entry %0 = landingpad { ptr, i32 } catch ptr null %1 = extractvalue { ptr, i32 } %0, 0 %2 = tail call ptr @__cxa_begin_catch(ptr %1) #1 tail call void @__cxa_end_catch() ret i32 0 unreachable: ; preds = %entry unreachable } declare ptr @__cxa_allocate_exception(i32) declare void @__cxa_throw(ptr, ptr, ptr) declare ptr @__cxa_begin_catch(ptr) declare void @__cxa_end_catch() declare i32 @__gxx_personality_sj0(...) attributes #0 = { ssp } attributes #1 = { nounwind } attributes #2 = { noreturn } ; ARM: vst1.64 ; ARM: vst1.64 ; ARM-PIC: cxa_throw ; ARM-PIC: trap ; ARM-PIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] ; ARM-PIC: ldr [[REG0:r[0-9]+]], [r{{[0-9]+}}, [[REG1]]] ; ARM-PIC: add pc, [[REG0]], [[REG1]] ; ARM-PIC: [[LJTI]] ; ARM-PIC: .data_region jt32 ; ARM-PIC: .long [[LABEL:LBB0_[0-9]]]-[[LJTI]] ; ARM-PIC: .end_data_region ; ARM-PIC: [[LABEL]] ; ARM-NOPIC: cxa_throw ; ARM-NOPIC: trap ; ARM-NOPIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] ; ARM-NOPIC: ldr [[REG0:r[0-9]+]], [r{{[0-9]+}}, [[REG1]]] ; ARM-NOPIC: mov pc, [[REG0]] ; ARM-NOPIC: [[LJTI]] ; ARM-NOPIC: .data_region jt32 ; ARM-NOPIC: .long [[LABEL:LBB0_[0-9]]] ; ARM-NOPIC: .end_data_region ; ARM-NOPIC: [[LABEL]] ; ARM: vld1.64 ; ARM: vld1.64 ; On Thumb1 targets, we have no way to preserve the floating-point registers. ; If all other code is built for Thumb1 or is built soft-float, this is not a ; problem as the FP regs don't need saving. However, if this code is linked ; against ARM code that uses the FP regs, they won't be restored correctly. We ; don't support this use-case, but have no way to prevent it in the compiler. ; THUMB1: push {{[^d]*$}} ; THUMB1-NOT: vst ; THUMB1-PIC: cxa_throw ; THUMB1-PIC: trap ; THUMB1-PIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] ; THUMB1-PIC: adds [[REG0:r[0-9]+]], [[REG0]], [[REG1]] ; THUMB1-PIC: ldr [[REG0]] ; THUMB1-PIC: adds [[REG0]], [[REG0]], [[REG1]] ; THUMB1-PIC: mov pc, [[REG0]] ; THUMB1-PIC: [[LJTI]] ; THUMB1-PIC: .data_region jt32 ; THUMB1-PIC: .long [[LABEL:LBB0_[0-9]]]-[[LJTI]] ; THUMB1-PIC: .end_data_region ; THUMB1-PIC: [[LABEL]] ; THUMB1-NOPIC: cxa_throw ; THUMB1-NOPIC: trap ; THUMB1-NOPIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] ; THUMB1-NOPIC: adds [[REG0:r[0-9]+]], [[REG0]], [[REG1]] ; THUMB1-NOPIC: ldr [[REG0]] ; THUMB1-NOPIC: mov pc, [[REG0]] ; THUMB1-NOPIC: [[LJTI]] ; THUMB1-NOPIC: .data_region jt32 ; THUMB1-NOPIC: .long [[LABEL:LBB0_[0-9]]]+1 ; THUMB1-NOPIC: .end_data_region ; THUMB1-NOPIC: [[LABEL]] ; THUMB1-NOT: vld ; THUMB1: pop {{[^d]*$}}