@@ -716,3 +716,60 @@ define void @test_variadic_call_2(ptr %addr_ptr, ptr %val_ptr) {
716
716
call void (ptr , ...) @variadic_callee (ptr %addr , double %val )
717
717
ret void
718
718
}
719
+
720
+ ; Return value is in memory unless subtarget is AVX or higher.
721
+ define <32 x float > @test_return_v32f32 () {
722
+ ; X86-LABEL: name: test_return_v32f32
723
+ ; X86: bb.1 (%ir-block.0):
724
+ ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
725
+ ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.0, align 16)
726
+ ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00
727
+ ; X86-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<32 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
728
+ ; X86-NEXT: G_STORE [[BUILD_VECTOR]](<32 x s32>), [[LOAD]](p0) :: (store (<32 x s32>))
729
+ ; X86-NEXT: $eax = COPY [[LOAD]](p0)
730
+ ; X86-NEXT: RET 0
731
+ ; X64-LABEL: name: test_return_v32f32
732
+ ; X64: bb.1 (%ir-block.0):
733
+ ; X64-NEXT: liveins: $rdi
734
+ ; X64-NEXT: {{ $}}
735
+ ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi
736
+ ; X64-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00
737
+ ; X64-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<32 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
738
+ ; X64-NEXT: G_STORE [[BUILD_VECTOR]](<32 x s32>), [[COPY]](p0) :: (store (<32 x s32>))
739
+ ; X64-NEXT: $rax = COPY [[COPY]](p0)
740
+ ; X64-NEXT: RET 0
741
+ ret <32 x float > zeroinitializer
742
+ }
743
+
744
+ define float @test_call_v32f32 () {
745
+ ; X86-LABEL: name: test_call_v32f32
746
+ ; X86: bb.1 (%ir-block.0):
747
+ ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
748
+ ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0
749
+ ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
750
+ ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp
751
+ ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
752
+ ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C1]](s32)
753
+ ; X86-NEXT: G_STORE [[FRAME_INDEX]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 1)
754
+ ; X86-NEXT: CALLpcrel32 @test_return_v32f32, csr_32, implicit $esp, implicit $ssp
755
+ ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
756
+ ; X86-NEXT: [[LOAD:%[0-9]+]]:_(<32 x s32>) = G_LOAD [[FRAME_INDEX]](p0) :: (load (<32 x s32>) from %stack.0)
757
+ ; X86-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[LOAD]](<32 x s32>), [[C]](s32)
758
+ ; X86-NEXT: $fp0 = COPY [[EVEC]](s32)
759
+ ; X86-NEXT: RET 0, implicit $fp0
760
+ ; X64-LABEL: name: test_call_v32f32
761
+ ; X64: bb.1 (%ir-block.0):
762
+ ; X64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 7
763
+ ; X64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0
764
+ ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp
765
+ ; X64-NEXT: $rdi = COPY [[FRAME_INDEX]](p0)
766
+ ; X64-NEXT: CALL64pcrel32 @test_return_v32f32, csr_64, implicit $rsp, implicit $ssp, implicit $rdi
767
+ ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp
768
+ ; X64-NEXT: [[LOAD:%[0-9]+]]:_(<32 x s32>) = G_LOAD [[FRAME_INDEX]](p0) :: (load (<32 x s32>) from %stack.0)
769
+ ; X64-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[LOAD]](<32 x s32>), [[C]](s64)
770
+ ; X64-NEXT: $xmm0 = COPY [[EVEC]](s32)
771
+ ; X64-NEXT: RET 0, implicit $xmm0
772
+ %vect = call <32 x float > @test_return_v32f32 ()
773
+ %elt = extractelement <32 x float > %vect , i32 7
774
+ ret float %elt
775
+ }
0 commit comments