Home | History | Annotate | Download | only in R600
      1 ; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
      2 
      3 
      4 ; FUNC-LABEL: @scalar_to_vector_v2i32
      5 ; SI: BUFFER_LOAD_DWORD [[VAL:v[0-9]+]],
      6 ; SI: V_LSHRREV_B32_e32 [[RESULT:v[0-9]+]], 16, [[VAL]]
      7 ; SI: BUFFER_STORE_SHORT [[RESULT]]
      8 ; SI: BUFFER_STORE_SHORT [[RESULT]]
      9 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     10 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     11 ; SI: S_ENDPGM
     12 define void @scalar_to_vector_v2i32(<4 x i16> addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
     13   %tmp1 = load i32 addrspace(1)* %in, align 4
     14   %bc = bitcast i32 %tmp1 to <2 x i16>
     15   %tmp2 = shufflevector <2 x i16> %bc, <2 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
     16   store <4 x i16> %tmp2, <4 x i16> addrspace(1)* %out, align 8
     17   ret void
     18 }
     19 
     20 ; FUNC-LABEL: @scalar_to_vector_v2f32
     21 ; SI: BUFFER_LOAD_DWORD [[VAL:v[0-9]+]],
     22 ; SI: V_LSHRREV_B32_e32 [[RESULT:v[0-9]+]], 16, [[VAL]]
     23 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     24 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     25 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     26 ; SI: BUFFER_STORE_SHORT [[RESULT]]
     27 ; SI: S_ENDPGM
     28 define void @scalar_to_vector_v2f32(<4 x i16> addrspace(1)* %out, float addrspace(1)* %in) nounwind {
     29   %tmp1 = load float addrspace(1)* %in, align 4
     30   %bc = bitcast float %tmp1 to <2 x i16>
     31   %tmp2 = shufflevector <2 x i16> %bc, <2 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
     32   store <4 x i16> %tmp2, <4 x i16> addrspace(1)* %out, align 8
     33   ret void
     34 }
     35 
     36 ; Getting a SCALAR_TO_VECTOR seems to be tricky. These cases managed
     37 ; to produce one, but for some reason never made it to selection.
     38 
     39 
     40 ; define void @scalar_to_vector_test2(<8 x i8> addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
     41 ;   %tmp1 = load i32 addrspace(1)* %in, align 4
     42 ;   %bc = bitcast i32 %tmp1 to <4 x i8>
     43 
     44 ;   %tmp2 = shufflevector <4 x i8> %bc, <4 x i8> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
     45 ;   store <8 x i8> %tmp2, <8 x i8> addrspace(1)* %out, align 4
     46 ;   ret void
     47 ; }
     48 
     49 ; define void @scalar_to_vector_test3(<4 x i32> addrspace(1)* %out) nounwind {
     50 ;   %newvec0 = insertelement <2 x i64> undef, i64 12345, i32 0
     51 ;   %newvec1 = insertelement <2 x i64> %newvec0, i64 undef, i32 1
     52 ;   %bc = bitcast <2 x i64> %newvec1 to <4 x i32>
     53 ;   %add = add <4 x i32> %bc, <i32 1, i32 2, i32 3, i32 4>
     54 ;   store <4 x i32> %add, <4 x i32> addrspace(1)* %out, align 16
     55 ;   ret void
     56 ; }
     57 
     58 ; define void @scalar_to_vector_test4(<8 x i16> addrspace(1)* %out) nounwind {
     59 ;   %newvec0 = insertelement <4 x i32> undef, i32 12345, i32 0
     60 ;   %bc = bitcast <4 x i32> %newvec0 to <8 x i16>
     61 ;   %add = add <8 x i16> %bc, <i16 1, i16 2, i16 3, i16 4, i16 1, i16 2, i16 3, i16 4>
     62 ;   store <8 x i16> %add, <8 x i16> addrspace(1)* %out, align 16
     63 ;   ret void
     64 ; }
     65 
     66 ; define void @scalar_to_vector_test5(<4 x i16> addrspace(1)* %out) nounwind {
     67 ;   %newvec0 = insertelement <2 x i32> undef, i32 12345, i32 0
     68 ;   %bc = bitcast <2 x i32> %newvec0 to <4 x i16>
     69 ;   %add = add <4 x i16> %bc, <i16 1, i16 2, i16 3, i16 4>
     70 ;   store <4 x i16> %add, <4 x i16> addrspace(1)* %out, align 16
     71 ;   ret void
     72 ; }
     73 
     74 ; define void @scalar_to_vector_test6(<4 x i16> addrspace(1)* %out) nounwind {
     75 ;   %newvec0 = insertelement <2 x i32> undef, i32 12345, i32 0
     76 ;   %bc = bitcast <2 x i32> %newvec0 to <4 x i16>
     77 ;   %add = add <4 x i16> %bc, <i16 1, i16 2, i16 3, i16 4>
     78 ;   store <4 x i16> %add, <4 x i16> addrspace(1)* %out, align 16
     79 ;   ret void
     80 ; }
     81