aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/BPF/memintrin.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/BPF/memintrin.ll')
-rw-r--r--llvm/test/CodeGen/BPF/memintrin.ll87
1 files changed, 87 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/BPF/memintrin.ll b/llvm/test/CodeGen/BPF/memintrin.ll
new file mode 100644
index 0000000..43ad426
--- /dev/null
+++ b/llvm/test/CodeGen/BPF/memintrin.ll
@@ -0,0 +1,87 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -march=bpfel < %s | FileCheck %s
+
+declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
+
+declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1)
+
+declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
+
+define void @memcpy(ptr %a, ptr %b, i64 %len) {
+; CHECK-LABEL: memcpy:
+; CHECK: # %bb.0:
+; CHECK-NEXT: if r3 == 0 goto LBB0_3
+; CHECK-NEXT: # %bb.1: # %loop-memcpy-expansion.preheader
+; CHECK-NEXT: r4 = 0
+; CHECK-NEXT: LBB0_2: # %loop-memcpy-expansion
+; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: r5 = r1
+; CHECK-NEXT: r5 += r4
+; CHECK-NEXT: r0 = r2
+; CHECK-NEXT: r0 += r4
+; CHECK-NEXT: r0 = *(u8 *)(r0 + 0)
+; CHECK-NEXT: *(u8 *)(r5 + 0) = r0
+; CHECK-NEXT: r4 += 1
+; CHECK-NEXT: if r3 > r4 goto LBB0_2
+; CHECK-NEXT: LBB0_3: # %post-loop-memcpy-expansion
+; CHECK-NEXT: exit
+ call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %b, i64 %len, i1 false)
+ ret void
+}
+
+
+define void @memmove(ptr %a, ptr %b, i64 %len) {
+; CHECK-LABEL: memmove:
+; CHECK: # %bb.0:
+; CHECK-NEXT: if r2 >= r1 goto LBB1_4
+; CHECK-NEXT: # %bb.1: # %copy_backwards
+; CHECK-NEXT: if r3 == 0 goto LBB1_6
+; CHECK-NEXT: # %bb.2: # %copy_backwards_loop.preheader
+; CHECK-NEXT: r2 += -1
+; CHECK-NEXT: r1 += -1
+; CHECK-NEXT: LBB1_3: # %copy_backwards_loop
+; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: r4 = r1
+; CHECK-NEXT: r4 += r3
+; CHECK-NEXT: r5 = r2
+; CHECK-NEXT: r5 += r3
+; CHECK-NEXT: r5 = *(u8 *)(r5 + 0)
+; CHECK-NEXT: *(u8 *)(r4 + 0) = r5
+; CHECK-NEXT: r3 += -1
+; CHECK-NEXT: if r3 == 0 goto LBB1_6
+; CHECK-NEXT: goto LBB1_3
+; CHECK-NEXT: LBB1_4: # %copy_forward
+; CHECK-NEXT: if r3 == 0 goto LBB1_6
+; CHECK-NEXT: LBB1_5: # %copy_forward_loop
+; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: r4 = *(u8 *)(r2 + 0)
+; CHECK-NEXT: *(u8 *)(r1 + 0) = r4
+; CHECK-NEXT: r2 += 1
+; CHECK-NEXT: r1 += 1
+; CHECK-NEXT: r3 += -1
+; CHECK-NEXT: if r3 != 0 goto LBB1_5
+; CHECK-NEXT: LBB1_6: # %memmove_done
+; CHECK-NEXT: exit
+ call void @llvm.memmove.p0.p0.i64(ptr %a, ptr %b, i64 %len, i1 false)
+ ret void
+}
+
+
+define void @memset(ptr %a, i8 %b, i64 %len) {
+; CHECK-LABEL: memset:
+; CHECK: # %bb.0:
+; CHECK-NEXT: if r3 == 0 goto LBB2_3
+; CHECK-NEXT: # %bb.1: # %loadstoreloop.preheader
+; CHECK-NEXT: r4 = 0
+; CHECK-NEXT: LBB2_2: # %loadstoreloop
+; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: r5 = r1
+; CHECK-NEXT: r5 += r4
+; CHECK-NEXT: *(u8 *)(r5 + 0) = r2
+; CHECK-NEXT: r4 += 1
+; CHECK-NEXT: if r3 > r4 goto LBB2_2
+; CHECK-NEXT: LBB2_3: # %split
+; CHECK-NEXT: exit
+ call void @llvm.memset.p0.i64(ptr %a, i8 %b, i64 %len, i1 false)
+ ret void
+}