| ; Tests assembly of ldrex and strex instructions |
| |
| ; REQUIRES: allow_dump |
| |
| ; Compile using standalone assembler. |
| ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -Om1 \ |
| ; RUN: | FileCheck %s --check-prefix=ASM |
| |
| ; Show bytes in assembled standalone code. |
| ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \ |
| ; RUN: --args -Om1 | FileCheck %s --check-prefix=DIS |
| |
| ; Compile using integrated assembler. |
| ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -Om1 \ |
| ; RUN: | FileCheck %s --check-prefix=IASM |
| |
| ; Show bytes in assembled integrated code. |
| ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \ |
| ; RUN: --args -Om1 | FileCheck %s --check-prefix=DIS |
| |
| declare i8 @llvm.nacl.atomic.rmw.i8(i32, i8*, i8, i32) |
| |
| declare i16 @llvm.nacl.atomic.rmw.i16(i32, i16*, i16, i32) |
| |
| declare i32 @llvm.nacl.atomic.rmw.i32(i32, i32*, i32, i32) #0 |
| |
| declare i64 @llvm.nacl.atomic.rmw.i64(i32, i64*, i64, i32) #0 |
| |
| define internal i32 @testI8Form(i32 %ptr, i32 %a) { |
| ; ASM-LABEL:testI8Form: |
| ; DIS-LABEL:<testI8Form>: |
| ; IASM-LABEL:testI8Form: |
| |
| entry: |
| %ptr.asptr = inttoptr i32 %ptr to i8* |
| %a.arg_trunc = trunc i32 %a to i8 |
| |
| %v = call i8 @llvm.nacl.atomic.rmw.i8(i32 1, i8* %ptr.asptr, |
| i8 %a.arg_trunc, i32 6) |
| |
| ; ****** Example of dmb ******* |
| ; ASM: dmb sy |
| ; DIS: 1c: f57ff05f |
| ; IASM: .byte 0x5f |
| ; IASM-NEXT: .byte 0xf0 |
| ; IASM-NEXT: .byte 0x7f |
| ; IASM-NEXT: .byte 0xf5 |
| |
| ; ***** Example of ldrexb ***** |
| ; ASM: ldrexb r1, [r2] |
| ; DIS: 24: e1d21f9f |
| ; IASM: .byte 0x9f |
| ; IASM-NEXT: .byte 0x1f |
| ; IASM-NEXT: .byte 0xd2 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ; ***** Example of strexb ***** |
| ; ASM: strexb r4, r3, [r2] |
| ; DIS: 2c: e1c24f93 |
| ; IASM: .byte 0x93 |
| ; IASM-NEXT: .byte 0x4f |
| ; IASM-NEXT: .byte 0xc2 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| %retval = zext i8 %v to i32 |
| ret i32 %retval |
| } |
| |
| define internal i32 @testI16Form(i32 %ptr, i32 %a) { |
| ; ASM-LABEL:testI16Form: |
| ; DIS-LABEL:<testI16Form>: |
| ; IASM-LABEL:testI16Form: |
| |
| entry: |
| %ptr.asptr = inttoptr i32 %ptr to i16* |
| %a.arg_trunc = trunc i32 %a to i16 |
| |
| %v = call i16 @llvm.nacl.atomic.rmw.i16(i32 1, i16* %ptr.asptr, |
| i16 %a.arg_trunc, i32 6) |
| ; ***** Example of ldrexh ***** |
| ; ASM: ldrexh r1, [r2] |
| ; DIS: 84: e1f21f9f |
| ; IASM: .byte 0x9f |
| ; IASM-NEXT: .byte 0x1f |
| ; IASM-NEXT: .byte 0xf2 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ; ***** Example of strexh ***** |
| ; ASM: strexh r4, r3, [r2] |
| ; DIS: 8c: e1e24f93 |
| ; IASM: .byte 0x93 |
| ; IASM-NEXT: .byte 0x4f |
| ; IASM-NEXT: .byte 0xe2 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| %retval = zext i16 %v to i32 |
| ret i32 %retval |
| } |
| |
| define internal i32 @testI32Form(i32 %ptr, i32 %a) { |
| ; ASM-LABEL:testI32Form: |
| ; DIS-LABEL:<testI32Form>: |
| ; IASM-LABEL:testI32Form: |
| |
| entry: |
| %ptr.asptr = inttoptr i32 %ptr to i32* |
| %v = call i32 @llvm.nacl.atomic.rmw.i32(i32 1, i32* %ptr.asptr, |
| i32 %a, i32 6) |
| |
| ; ***** Example of ldrex ***** |
| ; ASM: ldrex r1, [r2] |
| ; DIS: dc: e1921f9f |
| ; IASM: .byte 0x9f |
| ; IASM-NEXT: .byte 0x1f |
| ; IASM-NEXT: .byte 0x92 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ; ***** Example of strex ***** |
| ; ASM: strex r4, r3, [r2] |
| ; DIS: e4: e1824f93 |
| ; IASM: .byte 0x93 |
| ; IASM-NEXT: .byte 0x4f |
| ; IASM-NEXT: .byte 0x82 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ret i32 %v |
| } |
| |
| define internal i64 @testI64Form(i32 %ptr, i64 %a) { |
| ; ASM-LABEL:testI64Form: |
| ; DIS-LABEL:<testI64Form>: |
| ; IASM-LABEL:testI64Form: |
| |
| entry: |
| %ptr.asptr = inttoptr i32 %ptr to i64* |
| %v = call i64 @llvm.nacl.atomic.rmw.i64(i32 1, i64* %ptr.asptr, |
| i64 %a, i32 6) |
| |
| ; ***** Example of ldrexd ***** |
| ; ASM: ldrexd r4, r5, [r6] |
| ; DIS: 13c: e1b64f9f |
| ; IASM: .byte 0x9f |
| ; IASM-NEXT: .byte 0x4f |
| ; IASM-NEXT: .byte 0xb6 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ; ***** Example of strexd ***** |
| ; ASM: strexd r4, r0, r1, [r6] |
| ; DIS: 158: e1a64f90 |
| ; IASM: .byte 0x90 |
| ; IASM-NEXT: .byte 0x4f |
| ; IASM-NEXT: .byte 0xa6 |
| ; IASM-NEXT: .byte 0xe1 |
| |
| ret i64 %v |
| } |