blob: 53bfd967f0a8f551da0bfc3853c8add609ffce7c [file] [edit]
; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r5 -mattr=+fp64,+msa < %s | FileCheck %s --check-prefix=MIPS32
; RUN: llc -mtriple=mips64el-unknown-linux-gnuabi64 -mcpu=mips64r5 -mattr=+fp64,+msa < %s | FileCheck %s --check-prefix=MIPS64
; Test that f16 vectors can be built from scalar f16 values without crashing.
; This is a regression test for a crash in soft-promotion of BUILD_VECTOR
; operands.
define <8 x half> @build_v8f16(half %a, half %b, half %c, half %d, half %e, half %f, half %g, half %h) nounwind {
; MIPS32-LABEL: build_v8f16:
; MIPS32: # %bb.0:
; MIPS32-NEXT: insert.h $w0[0], $5
; MIPS32-NEXT: insert.h $w0[1], $6
; MIPS32-NEXT: insert.h $w0[2], $7
; MIPS32-NEXT: lhu $1, 16($sp)
; MIPS32-NEXT: insert.h $w0[3], $1
; MIPS32-NEXT: lhu $1, 20($sp)
; MIPS32-NEXT: insert.h $w0[4], $1
; MIPS32-NEXT: lhu $1, 24($sp)
; MIPS32-NEXT: insert.h $w0[5], $1
; MIPS32-NEXT: lhu $1, 28($sp)
; MIPS32-NEXT: insert.h $w0[6], $1
; MIPS32-NEXT: lhu $1, 32($sp)
; MIPS32-NEXT: insert.h $w0[7], $1
; MIPS32-NEXT: jr $ra
; MIPS32-NEXT: st.h $w0, 0($4)
;
; MIPS64-LABEL: build_v8f16:
; MIPS64: # %bb.0:
; MIPS64-NEXT: sll $1, $5, 0
; MIPS64-NEXT: sll $2, $4, 0
; MIPS64-NEXT: insert.h $w0[0], $2
; MIPS64-NEXT: insert.h $w0[1], $1
; MIPS64-NEXT: sll $1, $6, 0
; MIPS64-NEXT: insert.h $w0[2], $1
; MIPS64-NEXT: sll $1, $7, 0
; MIPS64-NEXT: insert.h $w0[3], $1
; MIPS64-NEXT: sll $1, $8, 0
; MIPS64-NEXT: insert.h $w0[4], $1
; MIPS64-NEXT: sll $1, $9, 0
; MIPS64-NEXT: insert.h $w0[5], $1
; MIPS64-NEXT: sll $1, $11, 0
; MIPS64-NEXT: sll $2, $10, 0
; MIPS64-NEXT: insert.h $w0[6], $2
; MIPS64-NEXT: insert.h $w0[7], $1
; MIPS64-NEXT: copy_s.d $2, $w0[0]
; MIPS64-NEXT: jr $ra
; MIPS64-NEXT: copy_s.d $3, $w0[1]
%v0 = insertelement <8 x half> poison, half %a, i32 0
%v1 = insertelement <8 x half> %v0, half %b, i32 1
%v2 = insertelement <8 x half> %v1, half %c, i32 2
%v3 = insertelement <8 x half> %v2, half %d, i32 3
%v4 = insertelement <8 x half> %v3, half %e, i32 4
%v5 = insertelement <8 x half> %v4, half %f, i32 5
%v6 = insertelement <8 x half> %v5, half %g, i32 6
%v7 = insertelement <8 x half> %v6, half %h, i32 7
ret <8 x half> %v7
}
define <4 x half> @build_v4f16(half %a, half %b, half %c, half %d) nounwind {
; MIPS32-LABEL: build_v4f16:
; MIPS32: # %bb.0:
; MIPS32-NEXT: addiu $sp, $sp, -32
; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
; MIPS32-NEXT: sw $fp, 24($sp) # 4-byte Folded Spill
; MIPS32-NEXT: move $fp, $sp
; MIPS32-NEXT: addiu $1, $zero, -16
; MIPS32-NEXT: and $sp, $sp, $1
; MIPS32-NEXT: lhu $1, 48($fp)
; MIPS32-NEXT: sh $1, 6($sp)
; MIPS32-NEXT: sh $7, 4($sp)
; MIPS32-NEXT: sh $6, 2($sp)
; MIPS32-NEXT: sh $5, 0($sp)
; MIPS32-NEXT: ld.w $w0, 0($sp)
; MIPS32-NEXT: copy_s.w $1, $w0[0]
; MIPS32-NEXT: copy_s.w $2, $w0[1]
; MIPS32-NEXT: sw $2, 4($4)
; MIPS32-NEXT: sw $1, 0($4)
; MIPS32-NEXT: move $sp, $fp
; MIPS32-NEXT: lw $fp, 24($sp) # 4-byte Folded Reload
; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
; MIPS32-NEXT: jr $ra
; MIPS32-NEXT: addiu $sp, $sp, 32
;
; MIPS64-LABEL: build_v4f16:
; MIPS64: # %bb.0:
; MIPS64-NEXT: daddiu $sp, $sp, -16
; MIPS64-NEXT: sh $7, 6($sp)
; MIPS64-NEXT: sh $6, 4($sp)
; MIPS64-NEXT: sh $5, 2($sp)
; MIPS64-NEXT: sh $4, 0($sp)
; MIPS64-NEXT: ld.d $w0, 0($sp)
; MIPS64-NEXT: copy_s.d $2, $w0[0]
; MIPS64-NEXT: jr $ra
; MIPS64-NEXT: daddiu $sp, $sp, 16
%v0 = insertelement <4 x half> poison, half %a, i32 0
%v1 = insertelement <4 x half> %v0, half %b, i32 1
%v2 = insertelement <4 x half> %v1, half %c, i32 2
%v3 = insertelement <4 x half> %v2, half %d, i32 3
ret <4 x half> %v3
}
define <2 x half> @build_v2f16(half %a, half %b) nounwind {
; MIPS32-LABEL: build_v2f16:
; MIPS32: # %bb.0:
; MIPS32-NEXT: addiu $sp, $sp, -32
; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
; MIPS32-NEXT: sw $fp, 24($sp) # 4-byte Folded Spill
; MIPS32-NEXT: move $fp, $sp
; MIPS32-NEXT: addiu $1, $zero, -16
; MIPS32-NEXT: and $sp, $sp, $1
; MIPS32-NEXT: sh $6, 2($sp)
; MIPS32-NEXT: sh $5, 0($sp)
; MIPS32-NEXT: ld.w $w0, 0($sp)
; MIPS32-NEXT: copy_s.w $1, $w0[0]
; MIPS32-NEXT: sw $1, 0($4)
; MIPS32-NEXT: move $sp, $fp
; MIPS32-NEXT: lw $fp, 24($sp) # 4-byte Folded Reload
; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
; MIPS32-NEXT: jr $ra
; MIPS32-NEXT: addiu $sp, $sp, 32
;
; MIPS64-LABEL: build_v2f16:
; MIPS64: # %bb.0:
; MIPS64-NEXT: daddiu $sp, $sp, -16
; MIPS64-NEXT: sh $6, 2($sp)
; MIPS64-NEXT: sh $5, 0($sp)
; MIPS64-NEXT: ld.w $w0, 0($sp)
; MIPS64-NEXT: copy_s.w $1, $w0[0]
; MIPS64-NEXT: sw $1, 0($4)
; MIPS64-NEXT: jr $ra
; MIPS64-NEXT: daddiu $sp, $sp, 16
%v0 = insertelement <2 x half> poison, half %a, i32 0
%v1 = insertelement <2 x half> %v0, half %b, i32 1
ret <2 x half> %v1
}