Home | History | Annotate | Download | only in arm32
      1 ; Test that we handle select on vectors.
      2 
      3 ; REQUIRES: allow_dump
      4 
      5 ; Compile using standalone assembler.
      6 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -O2 \
      7 ; RUN:   | FileCheck %s --check-prefix=ASM
      8 
      9 ; Show bytes in assembled standalone code.
     10 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \
     11 ; RUN:   --args -O2 --reg-use=s20  | FileCheck %s --check-prefix=DIS
     12 
     13 ; Compile using integrated assembler.
     14 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -O2 \
     15 ; RUN:   --reg-use=s20 \
     16 ; RUN:   | FileCheck %s --check-prefix=IASM
     17 
     18 ; Show bytes in assembled integrated code.
     19 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \
     20 ; RUN:   --args -O2 --reg-use=s20 | FileCheck %s --check-prefix=DIS
     21 
     22 define internal <4 x float> @select4float(<4 x i1> %s, <4 x float> %a,
     23                                           <4 x float> %b) {
     24 ; ASM-LABEL:select4float:
     25 ; DIS-LABEL:00000000 <select4float>:
     26 ; IASM-LABEL:select4float:
     27 
     28 entry:
     29   %res = select <4 x i1> %s, <4 x float> %a, <4 x float> %b
     30 
     31 ; ASM:          vshl.u32 [[M:.*]], {{.*}}, #31
     32 ; ASM-NEXT:     vshr.s32 [[M:.*]], {{.*}}, #31
     33 ; ASM-NEXT:     vbsl.i32 [[M]], {{.*}}
     34 ; DIS:       0: f2bf0550
     35 ; DIS-NEXT:  4: f2a10050
     36 ; DIS-NEXT:  8: f3120154
     37 ; IASM-NOT:     vshl
     38 ; IASM-NOT:     vshr
     39 ; IASM-NOT:     vbsl
     40 
     41   ret <4 x float> %res
     42 }
     43 
     44 define internal <4 x i32> @select4i32(<4 x i1> %s, <4 x i32> %a, <4 x i32> %b) {
     45 ; ASM-LABEL:select4i32:
     46 ; DIS-LABEL:00000010 <select4i32>:
     47 ; IASM-LABEL:select4i32:
     48 
     49 entry:
     50   %res = select <4 x i1> %s, <4 x i32> %a, <4 x i32> %b
     51 
     52 ; ASM:          vshl.u32 [[M:.*]], {{.*}}, #31
     53 ; ASM-NEXT:     vshr.s32 [[M:.*]], {{.*}}, #31
     54 ; ASM-NEXT:     vbsl.i32 [[M]], {{.*}}
     55 ; DIS:      10: f2bf0550
     56 ; DIS-NEXT: 14: f2a10050
     57 ; DIS_NEXT: 18: f3120154
     58 ; IASM-NOT:     vshl
     59 ; IASM-NOT:     vshr
     60 ; IASM-NOT:     vbsl
     61 
     62   ret <4 x i32> %res
     63 }
     64 
     65 define internal <8 x i16> @select8i16(<8 x i1> %s, <8 x i16> %a, <8 x i16> %b) {
     66 ; ASM-LABEL:select8i16:
     67 ; DIS-LABEL:00000020 <select8i16>:
     68 ; IASM-LABEL:select8i16:
     69 
     70 entry:
     71   %res = select <8 x i1> %s, <8 x i16> %a, <8 x i16> %b
     72 
     73 ; ASM:          vshl.u16 [[M:.*]], {{.*}}, #15
     74 ; ASM-NEXT:     vshr.s16 [[M:.*]], {{.*}}, #15
     75 ; ASM-NEXT:     vbsl.i16 [[M]], {{.*}}
     76 ; DIS:      20: f29f0550
     77 ; DIS-NEXT: 24: f2910050
     78 ; DIS-NEXT: 28: f3120154
     79 ; IASM-NOT:     vshl
     80 ; IASM-NOT:     vshr
     81 ; IASM-NOT:     vbsl
     82 
     83   ret <8 x i16> %res
     84 }
     85 
     86 define internal <16 x i8> @select16i8(<16 x i1> %s, <16 x i8> %a,
     87                                       <16 x i8> %b) {
     88 ; ASM-LABEL:select16i8:
     89 ; DIS-LABEL:00000030 <select16i8>:
     90 ; IASM-LABEL:select16i8:
     91 
     92 entry:
     93   %res = select <16 x i1> %s, <16 x i8> %a, <16 x i8> %b
     94 
     95 ; ASM:          vshl.u8 [[M:.*]], {{.*}}, #7
     96 ; ASM-NEXT:     vshr.s8 [[M:.*]], {{.*}}, #7
     97 ; ASM-NEXT:     vbsl.i8 [[M]], {{.*}}
     98 ; DIS:      30: f28f0550
     99 ; DIS-NEXT: 34: f2890050
    100 ; DIS-NEXT: 38: f3120154
    101 ; IASM-NOT:     vshl
    102 ; IASM-NOT:     vshr
    103 ; IASM-NOT:     vbsl
    104 
    105   ret <16 x i8> %res
    106 }
    107