@@ -544,6 +544,59 @@ define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) {
544544 ret <2 x i32 > %result.1
545545}
546546
547+ define { fp128 , i32 } @test_frexp_f128_i32 (fp128 %a ) nounwind {
548+ ; CHECK-LABEL: test_frexp_f128_i32:
549+ ; CHECK: @ %bb.0:
550+ ; CHECK-NEXT: push {r4, lr}
551+ ; CHECK-NEXT: sub sp, #8
552+ ; CHECK-NEXT: mov r12, r3
553+ ; CHECK-NEXT: ldr r3, [sp, #16]
554+ ; CHECK-NEXT: mov r4, r0
555+ ; CHECK-NEXT: add r0, sp, #4
556+ ; CHECK-NEXT: str r0, [sp]
557+ ; CHECK-NEXT: mov r0, r1
558+ ; CHECK-NEXT: mov r1, r2
559+ ; CHECK-NEXT: mov r2, r12
560+ ; CHECK-NEXT: bl frexpl
561+ ; CHECK-NEXT: ldr.w r12, [sp, #4]
562+ ; CHECK-NEXT: stm.w r4, {r0, r1, r2, r3, r12}
563+ ; CHECK-NEXT: add sp, #8
564+ ; CHECK-NEXT: pop {r4, pc}
565+ %result = call { fp128 , i32 } @llvm.frexp.f128.i32 (fp128 %a )
566+ ret { fp128 , i32 } %result
567+ }
568+
569+ define fp128 @test_frexp_f128_i32_only_use_fract (fp128 %a ) nounwind {
570+ ; CHECK-LABEL: test_frexp_f128_i32_only_use_fract:
571+ ; CHECK: @ %bb.0:
572+ ; CHECK-NEXT: push {r7, lr}
573+ ; CHECK-NEXT: sub sp, #8
574+ ; CHECK-NEXT: add.w r12, sp, #4
575+ ; CHECK-NEXT: str.w r12, [sp]
576+ ; CHECK-NEXT: bl frexpl
577+ ; CHECK-NEXT: add sp, #8
578+ ; CHECK-NEXT: pop {r7, pc}
579+ %result = call { fp128 , i32 } @llvm.frexp.f128.i32 (fp128 %a )
580+ %result.0 = extractvalue { fp128 , i32 } %result , 0
581+ ret fp128 %result.0
582+ }
583+
584+ define i32 @test_frexp_f128_i32_only_use_exp (fp128 %a ) nounwind {
585+ ; CHECK-LABEL: test_frexp_f128_i32_only_use_exp:
586+ ; CHECK: @ %bb.0:
587+ ; CHECK-NEXT: push {r7, lr}
588+ ; CHECK-NEXT: sub sp, #8
589+ ; CHECK-NEXT: add.w r12, sp, #4
590+ ; CHECK-NEXT: str.w r12, [sp]
591+ ; CHECK-NEXT: bl frexpl
592+ ; CHECK-NEXT: ldr r0, [sp, #4]
593+ ; CHECK-NEXT: add sp, #8
594+ ; CHECK-NEXT: pop {r7, pc}
595+ %result = call { fp128 , i32 } @llvm.frexp.f128.i32 (fp128 %a )
596+ %result.0 = extractvalue { fp128 , i32 } %result , 1
597+ ret i32 %result.0
598+ }
599+
547600declare { float , i32 } @llvm.frexp.f32.i32 (float ) #0
548601declare { <2 x float >, <2 x i32 > } @llvm.frexp.v2f32.v2i32 (<2 x float >) #0
549602declare { <4 x float >, <4 x i32 > } @llvm.frexp.v4f32.v4i32 (<4 x float >) #0
0 commit comments