@@ -1033,6 +1033,155 @@ exit:
10331033 ret void
10341034}
10351035
1036+ define void @try_catch_shared_za_callee_zt0_saved (ptr %callee ) "aarch64_inout_za" "aarch64_in_zt0" personality ptr @__gxx_personality_v0 {
1037+ ; CHECK-LABEL: try_catch_shared_za_callee_zt0_saved:
1038+ ; CHECK: .Lfunc_begin8:
1039+ ; CHECK-NEXT: .cfi_startproc
1040+ ; CHECK-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
1041+ ; CHECK-NEXT: .cfi_lsda 28, .Lexception8
1042+ ; CHECK-NEXT: // %bb.0:
1043+ ; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill
1044+ ; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
1045+ ; CHECK-NEXT: mov x29, sp
1046+ ; CHECK-NEXT: sub sp, sp, #80
1047+ ; CHECK-NEXT: .cfi_def_cfa w29, 32
1048+ ; CHECK-NEXT: .cfi_offset w19, -8
1049+ ; CHECK-NEXT: .cfi_offset w20, -16
1050+ ; CHECK-NEXT: .cfi_offset w30, -24
1051+ ; CHECK-NEXT: .cfi_offset w29, -32
1052+ ; CHECK-NEXT: rdsvl x8, #1
1053+ ; CHECK-NEXT: mov x9, sp
1054+ ; CHECK-NEXT: msub x9, x8, x8, x9
1055+ ; CHECK-NEXT: mov sp, x9
1056+ ; CHECK-NEXT: mov x19, x0
1057+ ; CHECK-NEXT: stp x9, x8, [x29, #-80]
1058+ ; CHECK-NEXT: .Ltmp24: // EH_LABEL
1059+ ; CHECK-NEXT: sub x20, x29, #64
1060+ ; CHECK-NEXT: sub x8, x29, #80
1061+ ; CHECK-NEXT: str zt0, [x20]
1062+ ; CHECK-NEXT: msr TPIDR2_EL0, x8
1063+ ; CHECK-NEXT: bl may_throw
1064+ ; CHECK-NEXT: .Ltmp25: // EH_LABEL
1065+ ; CHECK-NEXT: smstart za
1066+ ; CHECK-NEXT: mrs x8, TPIDR2_EL0
1067+ ; CHECK-NEXT: sub x0, x29, #80
1068+ ; CHECK-NEXT: cbnz x8, .LBB8_2
1069+ ; CHECK-NEXT: // %bb.1:
1070+ ; CHECK-NEXT: bl __arm_tpidr2_restore
1071+ ; CHECK-NEXT: .LBB8_2:
1072+ ; CHECK-NEXT: msr TPIDR2_EL0, xzr
1073+ ; CHECK-NEXT: ldr zt0, [x20]
1074+ ; CHECK-NEXT: // %bb.3: // %return_normally
1075+ ; CHECK-NEXT: mov sp, x29
1076+ ; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
1077+ ; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload
1078+ ; CHECK-NEXT: ret
1079+ ; CHECK-NEXT: .LBB8_4: // %unwind_dtors
1080+ ; CHECK-NEXT: .Ltmp26: // EH_LABEL
1081+ ; CHECK-NEXT: mov x20, x0
1082+ ; CHECK-NEXT: smstart za
1083+ ; CHECK-NEXT: mrs x8, TPIDR2_EL0
1084+ ; CHECK-NEXT: sub x0, x29, #80
1085+ ; CHECK-NEXT: cbnz x8, .LBB8_6
1086+ ; CHECK-NEXT: // %bb.5: // %unwind_dtors
1087+ ; CHECK-NEXT: bl __arm_tpidr2_restore
1088+ ; CHECK-NEXT: .LBB8_6: // %unwind_dtors
1089+ ; CHECK-NEXT: msr TPIDR2_EL0, xzr
1090+ ; CHECK-NEXT: blr x19
1091+ ; CHECK-NEXT: sub x8, x29, #80
1092+ ; CHECK-NEXT: mov x0, x20
1093+ ; CHECK-NEXT: msr TPIDR2_EL0, x8
1094+ ; CHECK-NEXT: bl _Unwind_Resume
1095+ ;
1096+ ; CHECK-SDAG-LABEL: try_catch_shared_za_callee_zt0_saved:
1097+ ; CHECK-SDAG: .Lfunc_begin8:
1098+ ; CHECK-SDAG-NEXT: .cfi_startproc
1099+ ; CHECK-SDAG-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
1100+ ; CHECK-SDAG-NEXT: .cfi_lsda 28, .Lexception8
1101+ ; CHECK-SDAG-NEXT: // %bb.0:
1102+ ; CHECK-SDAG-NEXT: stp x29, x30, [sp, #-48]! // 16-byte Folded Spill
1103+ ; CHECK-SDAG-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill
1104+ ; CHECK-SDAG-NEXT: mov x29, sp
1105+ ; CHECK-SDAG-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
1106+ ; CHECK-SDAG-NEXT: sub sp, sp, #80
1107+ ; CHECK-SDAG-NEXT: .cfi_def_cfa w29, 48
1108+ ; CHECK-SDAG-NEXT: .cfi_offset w19, -8
1109+ ; CHECK-SDAG-NEXT: .cfi_offset w20, -16
1110+ ; CHECK-SDAG-NEXT: .cfi_offset w21, -24
1111+ ; CHECK-SDAG-NEXT: .cfi_offset w22, -32
1112+ ; CHECK-SDAG-NEXT: .cfi_offset w30, -40
1113+ ; CHECK-SDAG-NEXT: .cfi_offset w29, -48
1114+ ; CHECK-SDAG-NEXT: rdsvl x8, #1
1115+ ; CHECK-SDAG-NEXT: mov x9, sp
1116+ ; CHECK-SDAG-NEXT: mov x19, x0
1117+ ; CHECK-SDAG-NEXT: msub x9, x8, x8, x9
1118+ ; CHECK-SDAG-NEXT: mov sp, x9
1119+ ; CHECK-SDAG-NEXT: stp x9, x8, [x29, #-16]
1120+ ; CHECK-SDAG-NEXT: .Ltmp24: // EH_LABEL
1121+ ; CHECK-SDAG-NEXT: sub x8, x29, #16
1122+ ; CHECK-SDAG-NEXT: sub x20, x29, #80
1123+ ; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x8
1124+ ; CHECK-SDAG-NEXT: str zt0, [x20]
1125+ ; CHECK-SDAG-NEXT: bl may_throw
1126+ ; CHECK-SDAG-NEXT: smstart za
1127+ ; CHECK-SDAG-NEXT: ldr zt0, [x20]
1128+ ; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1129+ ; CHECK-SDAG-NEXT: sub x0, x29, #16
1130+ ; CHECK-SDAG-NEXT: cbnz x8, .LBB8_2
1131+ ; CHECK-SDAG-NEXT: // %bb.1:
1132+ ; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1133+ ; CHECK-SDAG-NEXT: .LBB8_2:
1134+ ; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1135+ ; CHECK-SDAG-NEXT: .Ltmp25: // EH_LABEL
1136+ ; CHECK-SDAG-NEXT: // %bb.3: // %return_normally
1137+ ; CHECK-SDAG-NEXT: mov sp, x29
1138+ ; CHECK-SDAG-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1139+ ; CHECK-SDAG-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload
1140+ ; CHECK-SDAG-NEXT: ldp x29, x30, [sp], #48 // 16-byte Folded Reload
1141+ ; CHECK-SDAG-NEXT: ret
1142+ ; CHECK-SDAG-NEXT: .LBB8_4: // %unwind_dtors
1143+ ; CHECK-SDAG-NEXT: .Ltmp26: // EH_LABEL
1144+ ; CHECK-SDAG-NEXT: sub x21, x29, #80
1145+ ; CHECK-SDAG-NEXT: sub x22, x29, #16
1146+ ; CHECK-SDAG-NEXT: mov x20, x0
1147+ ; CHECK-SDAG-NEXT: smstart za
1148+ ; CHECK-SDAG-NEXT: ldr zt0, [x21]
1149+ ; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1150+ ; CHECK-SDAG-NEXT: sub x0, x29, #16
1151+ ; CHECK-SDAG-NEXT: cbnz x8, .LBB8_6
1152+ ; CHECK-SDAG-NEXT: // %bb.5: // %unwind_dtors
1153+ ; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1154+ ; CHECK-SDAG-NEXT: .LBB8_6: // %unwind_dtors
1155+ ; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1156+ ; CHECK-SDAG-NEXT: str zt0, [x21]
1157+ ; CHECK-SDAG-NEXT: blr x19
1158+ ; CHECK-SDAG-NEXT: ldr zt0, [x21]
1159+ ; CHECK-SDAG-NEXT: mov x0, x20
1160+ ; CHECK-SDAG-NEXT: msr TPIDR2_EL0, x22
1161+ ; CHECK-SDAG-NEXT: str zt0, [x21]
1162+ ; CHECK-SDAG-NEXT: bl _Unwind_Resume
1163+ ; CHECK-SDAG-NEXT: smstart za
1164+ ; CHECK-SDAG-NEXT: ldr zt0, [x21]
1165+ ; CHECK-SDAG-NEXT: mrs x8, TPIDR2_EL0
1166+ ; CHECK-SDAG-NEXT: sub x0, x29, #16
1167+ ; CHECK-SDAG-NEXT: cbnz x8, .LBB8_8
1168+ ; CHECK-SDAG-NEXT: // %bb.7: // %unwind_dtors
1169+ ; CHECK-SDAG-NEXT: bl __arm_tpidr2_restore
1170+ ; CHECK-SDAG-NEXT: .LBB8_8: // %unwind_dtors
1171+ ; CHECK-SDAG-NEXT: msr TPIDR2_EL0, xzr
1172+ invoke void @may_throw ()
1173+ to label %return_normally unwind label %unwind_dtors
1174+
1175+ unwind_dtors:
1176+ %5 = landingpad { ptr , i32 }
1177+ cleanup
1178+ call void %callee () "aarch64_inout_za"
1179+ resume { ptr , i32 } %5
1180+
1181+ return_normally:
1182+ ret void
1183+ }
1184+
10361185declare ptr @__cxa_allocate_exception (i64 )
10371186declare void @__cxa_throw (ptr , ptr , ptr )
10381187declare ptr @__cxa_begin_catch (ptr )
0 commit comments