Home | History | Annotate | Download | only in arm32
      1 ; Test the UXTB and UXTH instructions.
      2 
      3 ; NOTE: We use -O2 to get rid of memory stores.
      4 
      5 ; REQUIRES: allow_dump
      6 
      7 ; Compile using standalone assembler.
      8 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -O2 \
      9 ; RUN:   | FileCheck %s --check-prefix=ASM
     10 
     11 ; Show bytes in assembled standalone code.
     12 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \
     13 ; RUN:   --args -O2 | FileCheck %s --check-prefix=DIS
     14 
     15 ; Compile using integrated assembler.
     16 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -O2 \
     17 ; RUN:   | FileCheck %s --check-prefix=IASM
     18 
     19 ; Show bytes in assembled integrated code.
     20 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \
     21 ; RUN:   --args -O2 | FileCheck %s --check-prefix=DIS
     22 
     23 define internal i32 @_Z7testAddhh(i32 %a, i32 %b) {
     24 ; ASM-LABEL: _Z7testAddhh:
     25 ; DIS-LABEL: 00000000 <_Z7testAddhh>:
     26 ; IASM-LABEL: _Z7testAddhh:
     27 
     28 entry:
     29 
     30 ; ASM-NEXT: .L_Z7testAddhh$entry:
     31 ; IASM-NEXT: .L_Z7testAddhh$entry:
     32 
     33   %a.arg_trunc = trunc i32 %a to i8
     34   %conv = zext i8 %a.arg_trunc to i32
     35 
     36 ; ASM-NEXT:     uxtb    r0, r0
     37 ; DIS-NEXT:    0:       e6ef0070
     38 ; IASM-NEXT:    .byte 0x70
     39 ; IASM-NEXT:    .byte 0x0
     40 ; IASM-NEXT:    .byte 0xef
     41 ; IASM-NEXT:    .byte 0xe6
     42 
     43   %b.arg_trunc = trunc i32 %b to i8
     44   %conv1 = zext i8 %b.arg_trunc to i32
     45 
     46 ; ASM-NEXT:     uxtb    r1, r1
     47 ; DIS-NEXT:    4:       e6ef1071
     48 ; IASM-NEXT:    .byte 0x71
     49 ; IASM-NEXT:    .byte 0x10
     50 ; IASM-NEXT:    .byte 0xef
     51 ; IASM-NEXT:    .byte 0xe6
     52 
     53   %add = add i32 %conv1, %conv
     54 
     55 ; ASM-NEXT:     add     r1, r1, r0
     56 ; DIS-NEXT:    8:       e0811000
     57 ; IASM-NEXT:    .byte 0x0
     58 ; IASM-NEXT:    .byte 0x10
     59 ; IASM-NEXT:    .byte 0x81
     60 ; IASM-NEXT:    .byte 0xe0
     61 
     62   %conv2 = trunc i32 %add to i16
     63   %conv2.ret_ext = zext i16 %conv2 to i32
     64 
     65 ; ASM-NEXT:     uxth    r1, r1
     66 ; DIS-NEXT:   c:        e6ff1071
     67 ; IASM-NEXT:    .byte 0x71
     68 ; IASM-NEXT:    .byte 0x10
     69 ; IASM-NEXT:    .byte 0xff
     70 ; IASM-NEXT:    .byte 0xe6
     71 
     72   ret i32 %conv2.ret_ext
     73 
     74 ; ASM-NEXT:     mov     r0, r1
     75 ; DIS-NEXT:   10:       e1a00001
     76 ; IASM-NEXT:    .byte 0x1
     77 ; IASM-NEXT:    .byte 0x0
     78 ; IASM-NEXT:    .byte 0xa0
     79 ; IASM-NEXT:    .byte 0xe1
     80 
     81 
     82 ; ASM-NEXT:     bx      lr
     83 ; DIS-NEXT:   14:       e12fff1e
     84 ; IASM-NEXT:    .byte 0x1e
     85 ; IASM-NEXT:    .byte 0xff
     86 ; IASM-NEXT:    .byte 0x2f
     87 ; IASM-NEXT:    .byte 0xe1
     88 
     89 }
     90