Home | History | Annotate | Download | only in CellSPU
      1 ; RUN: llc < %s -march=cellspu > %t1.s
      2 ; RUN: grep {stqd.*0(\$3)}      %t1.s | count 4
      3 ; RUN: grep {stqd.*16(\$3)}     %t1.s | count 4
      4 ; RUN: grep 16256               %t1.s | count 2
      5 ; RUN: grep 16384               %t1.s | count 1
      6 ; RUN: grep 771                 %t1.s | count 4
      7 ; RUN: grep 515                 %t1.s | count 2
      8 ; RUN: grep 1799                %t1.s | count 2
      9 ; RUN: grep 1543                %t1.s | count 5
     10 ; RUN: grep 1029                %t1.s | count 3
     11 ; RUN: grep {shli.*, 4}         %t1.s | count 4
     12 ; RUN: grep stqx                %t1.s | count 4
     13 ; RUN: grep ilhu                %t1.s | count 11
     14 ; RUN: grep iohl                %t1.s | count 8
     15 ; RUN: grep shufb               %t1.s | count 15
     16 ; RUN: grep frds                %t1.s | count 1
     17 ; RUN: llc < %s -march=cellspu | FileCheck %s
     18 
     19 ; ModuleID = 'stores.bc'
     20 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128"
     21 target triple = "spu"
     22 
     23 define void @store_v16i8_1(<16 x i8>* %a) nounwind {
     24 entry:
     25 	store <16 x i8> < i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1 >, <16 x i8>* %a
     26 	ret void
     27 }
     28 
     29 define void @store_v16i8_2(<16 x i8>* %a) nounwind {
     30 entry:
     31 	%arrayidx = getelementptr <16 x i8>* %a, i32 1
     32 	store <16 x i8> < i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2 >, <16 x i8>* %arrayidx
     33 	ret void
     34 }
     35 
     36 define void @store_v16i8_3(<16 x i8>* %a, i32 %i) nounwind {
     37 entry:
     38         %arrayidx = getelementptr <16 x i8>* %a, i32 %i
     39 	store <16 x i8> < i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1 >, <16 x i8>* %arrayidx
     40         ret void
     41 }
     42 
     43 define void @store_v8i16_1(<8 x i16>* %a) nounwind {
     44 entry:
     45 	store <8 x i16> < i16 1, i16 2, i16 1, i16 1, i16 1, i16 2, i16 1, i16 1 >, <8 x i16>* %a
     46 	ret void
     47 }
     48 
     49 define void @store_v8i16_2(<8 x i16>* %a) nounwind {
     50 entry:
     51 	%arrayidx = getelementptr <8 x i16>* %a, i16 1
     52 	store <8 x i16> < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2 >, <8 x i16>* %arrayidx
     53 	ret void
     54 }
     55 
     56 define void @store_v8i16_3(<8 x i16>* %a, i32 %i) nounwind {
     57 entry:
     58         %arrayidx = getelementptr <8 x i16>* %a, i32 %i
     59 	store <8 x i16> < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1 >, <8 x i16>* %arrayidx
     60         ret void
     61 }
     62 
     63 define void @store_v4i32_1(<4 x i32>* %a) nounwind {
     64 entry:
     65 	store <4 x i32> < i32 1, i32 2, i32 1, i32 1 >, <4 x i32>* %a
     66 	ret void
     67 }
     68 
     69 define void @store_v4i32_2(<4 x i32>* %a) nounwind {
     70 entry:
     71 	%arrayidx = getelementptr <4 x i32>* %a, i32 1
     72 	store <4 x i32> < i32 2, i32 2, i32 2, i32 2 >, <4 x i32>* %arrayidx
     73 	ret void
     74 }
     75 
     76 define void @store_v4i32_3(<4 x i32>* %a, i32 %i) nounwind {
     77 entry:
     78         %arrayidx = getelementptr <4 x i32>* %a, i32 %i
     79         store <4 x i32> < i32 1, i32 1, i32 1, i32 1 >, <4 x i32>* %arrayidx
     80         ret void
     81 }
     82 
     83 define void @store_v4f32_1(<4 x float>* %a) nounwind {
     84 entry:
     85 	store <4 x float> < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >, <4 x float>* %a
     86 	ret void
     87 }
     88 
     89 define void @store_v4f32_2(<4 x float>* %a) nounwind {
     90 entry:
     91 	%arrayidx = getelementptr <4 x float>* %a, i32 1
     92 	store <4 x float> < float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00 >, <4 x float>* %arrayidx
     93 	ret void
     94 }
     95 
     96 define void @store_v4f32_3(<4 x float>* %a, i32 %i) nounwind {
     97 entry:
     98         %arrayidx = getelementptr <4 x float>* %a, i32 %i
     99         store <4 x float> < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >, <4 x float>* %arrayidx
    100         ret void
    101 }
    102 
    103 ; Test truncating stores:
    104 
    105 define zeroext i8 @tstore_i16_i8(i16 signext %val, i8* %dest) nounwind {
    106 entry:
    107 	%conv = trunc i16 %val to i8
    108 	store i8 %conv, i8* %dest
    109 	ret i8 %conv
    110 }
    111 
    112 define zeroext i8 @tstore_i32_i8(i32 %val, i8* %dest) nounwind {
    113 entry:
    114 	%conv = trunc i32 %val to i8
    115 	store i8 %conv, i8* %dest
    116 	ret i8 %conv
    117 }
    118 
    119 define signext i16 @tstore_i32_i16(i32 %val, i16* %dest) nounwind {
    120 entry:
    121 	%conv = trunc i32 %val to i16
    122 	store i16 %conv, i16* %dest
    123 	ret i16 %conv
    124 }
    125 
    126 define zeroext i8 @tstore_i64_i8(i64 %val, i8* %dest) nounwind {
    127 entry:
    128 	%conv = trunc i64 %val to i8
    129 	store i8 %conv, i8* %dest
    130 	ret i8 %conv
    131 }
    132 
    133 define signext i16 @tstore_i64_i16(i64 %val, i16* %dest) nounwind {
    134 entry:
    135 	%conv = trunc i64 %val to i16
    136 	store i16 %conv, i16* %dest
    137 	ret i16 %conv
    138 }
    139 
    140 define i32 @tstore_i64_i32(i64 %val, i32* %dest) nounwind {
    141 entry:
    142 	%conv = trunc i64 %val to i32
    143 	store i32 %conv, i32* %dest
    144 	ret i32 %conv
    145 }
    146 
    147 define float @tstore_f64_f32(double %val, float* %dest) nounwind {
    148 entry:
    149 	%conv = fptrunc double %val to float
    150 	store float %conv, float* %dest
    151 	ret float %conv
    152 }
    153 
    154 ;Check stores that might span two 16 byte memory blocks
    155 define void @store_misaligned( i32 %val, i32* %ptr) {	
    156 ;CHECK: store_misaligned
    157 ;CHECK: lqd
    158 ;CHECK: lqd
    159 ;CHECK: stqd
    160 ;CHECK: stqd
    161 ;CHECK: bi $lr
    162 	store i32 %val, i32*%ptr, align 2
    163 	ret void
    164 }
    165 
    166 define void @store_v8( <8 x float> %val, <8 x float>* %ptr )
    167 {
    168 ;CHECK: stq
    169 ;CHECK: stq
    170 ;CHECK: bi $lr
    171 	store <8 x float> %val, <8 x float>* %ptr
    172 	ret void
    173 }
    174 
    175 define void @store_null_vec( <4 x i32> %val ) {
    176 ; FIXME - this is for some reason compiled into a il+stqd, not a sta. 
    177 ;CHECK: stqd
    178 ;CHECK: bi $lr
    179 	store <4 x i32> %val, <4 x i32>* null
    180 	ret void
    181 }
    182