@@ -1341,3 +1341,109 @@ entry:
13411341 %call = call float %fptr (i32 poison) #7
13421342 ret float %call
13431343}
1344+
1345+ define float @float_return_undef_float_arg (ptr nocapture %fptr ) #6 {
1346+ ; CHECK-8M-LABEL: float_return_undef_float_arg:
1347+ ; CHECK-8M: @ %bb.0: @ %entry
1348+ ; CHECK-8M-NEXT: push {r7, lr}
1349+ ; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1350+ ; CHECK-8M-NEXT: bic r0, r0, #1
1351+ ; CHECK-8M-NEXT: sub sp, #136
1352+ ; CHECK-8M-NEXT: vmov r12, s0
1353+ ; CHECK-8M-NEXT: vlstm sp, {d0 - d15}
1354+ ; CHECK-8M-NEXT: vmov s0, r12
1355+ ; CHECK-8M-NEXT: ldr r1, [sp, #64]
1356+ ; CHECK-8M-NEXT: bic r1, r1, #159
1357+ ; CHECK-8M-NEXT: bic r1, r1, #4026531840
1358+ ; CHECK-8M-NEXT: vmsr fpscr, r1
1359+ ; CHECK-8M-NEXT: mov r1, r0
1360+ ; CHECK-8M-NEXT: mov r2, r0
1361+ ; CHECK-8M-NEXT: mov r3, r0
1362+ ; CHECK-8M-NEXT: mov r4, r0
1363+ ; CHECK-8M-NEXT: mov r5, r0
1364+ ; CHECK-8M-NEXT: mov r6, r0
1365+ ; CHECK-8M-NEXT: mov r7, r0
1366+ ; CHECK-8M-NEXT: mov r8, r0
1367+ ; CHECK-8M-NEXT: mov r9, r0
1368+ ; CHECK-8M-NEXT: mov r10, r0
1369+ ; CHECK-8M-NEXT: mov r11, r0
1370+ ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0
1371+ ; CHECK-8M-NEXT: blxns r0
1372+ ; CHECK-8M-NEXT: vmov r12, s0
1373+ ; CHECK-8M-NEXT: vlldm sp, {d0 - d15}
1374+ ; CHECK-8M-NEXT: vmov s0, r12
1375+ ; CHECK-8M-NEXT: add sp, #136
1376+ ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1377+ ; CHECK-8M-NEXT: pop {r7, pc}
1378+ ;
1379+ ; CHECK-81M-LABEL: float_return_undef_float_arg:
1380+ ; CHECK-81M: @ %bb.0: @ %entry
1381+ ; CHECK-81M-NEXT: push {r7, lr}
1382+ ; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1383+ ; CHECK-81M-NEXT: bic r0, r0, #1
1384+ ; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1385+ ; CHECK-81M-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1386+ ; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]!
1387+ ; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1388+ ; CHECK-81M-NEXT: blxns r0
1389+ ; CHECK-81M-NEXT: vldr fpcxts, [sp], #8
1390+ ; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1391+ ; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1392+ ; CHECK-81M-NEXT: pop {r7, pc}
1393+ entry:
1394+ %call = call float %fptr (float undef ) #7
1395+ ret float %call
1396+ }
1397+
1398+ define float @float_return_poison_float_arg (ptr nocapture %fptr ) #6 {
1399+ ; CHECK-8M-LABEL: float_return_poison_float_arg:
1400+ ; CHECK-8M: @ %bb.0: @ %entry
1401+ ; CHECK-8M-NEXT: push {r7, lr}
1402+ ; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1403+ ; CHECK-8M-NEXT: bic r0, r0, #1
1404+ ; CHECK-8M-NEXT: sub sp, #136
1405+ ; CHECK-8M-NEXT: vmov r12, s0
1406+ ; CHECK-8M-NEXT: vlstm sp, {d0 - d15}
1407+ ; CHECK-8M-NEXT: vmov s0, r12
1408+ ; CHECK-8M-NEXT: ldr r1, [sp, #64]
1409+ ; CHECK-8M-NEXT: bic r1, r1, #159
1410+ ; CHECK-8M-NEXT: bic r1, r1, #4026531840
1411+ ; CHECK-8M-NEXT: vmsr fpscr, r1
1412+ ; CHECK-8M-NEXT: mov r1, r0
1413+ ; CHECK-8M-NEXT: mov r2, r0
1414+ ; CHECK-8M-NEXT: mov r3, r0
1415+ ; CHECK-8M-NEXT: mov r4, r0
1416+ ; CHECK-8M-NEXT: mov r5, r0
1417+ ; CHECK-8M-NEXT: mov r6, r0
1418+ ; CHECK-8M-NEXT: mov r7, r0
1419+ ; CHECK-8M-NEXT: mov r8, r0
1420+ ; CHECK-8M-NEXT: mov r9, r0
1421+ ; CHECK-8M-NEXT: mov r10, r0
1422+ ; CHECK-8M-NEXT: mov r11, r0
1423+ ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0
1424+ ; CHECK-8M-NEXT: blxns r0
1425+ ; CHECK-8M-NEXT: vmov r12, s0
1426+ ; CHECK-8M-NEXT: vlldm sp, {d0 - d15}
1427+ ; CHECK-8M-NEXT: vmov s0, r12
1428+ ; CHECK-8M-NEXT: add sp, #136
1429+ ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1430+ ; CHECK-8M-NEXT: pop {r7, pc}
1431+ ;
1432+ ; CHECK-81M-LABEL: float_return_poison_float_arg:
1433+ ; CHECK-81M: @ %bb.0: @ %entry
1434+ ; CHECK-81M-NEXT: push {r7, lr}
1435+ ; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1436+ ; CHECK-81M-NEXT: bic r0, r0, #1
1437+ ; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1438+ ; CHECK-81M-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1439+ ; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]!
1440+ ; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1441+ ; CHECK-81M-NEXT: blxns r0
1442+ ; CHECK-81M-NEXT: vldr fpcxts, [sp], #8
1443+ ; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1444+ ; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1445+ ; CHECK-81M-NEXT: pop {r7, pc}
1446+ entry:
1447+ %call = call float %fptr (float poison) #7
1448+ ret float %call
1449+ }
0 commit comments