xref: /llvm-project/llvm/test/CodeGen/X86/GlobalISel/ptr-add.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=X64_GISEL
3; RUN: llc -mtriple=x86_64-linux-gnu              -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=X64
4
5define ptr @test_gep_i8(ptr%arr, i8 %ind) {
6; X64_GISEL-LABEL: test_gep_i8:
7; X64_GISEL:       # %bb.0:
8; X64_GISEL-NEXT:    # kill: def $esi killed $esi def $rsi
9; X64_GISEL-NEXT:    shlq $56, %rsi
10; X64_GISEL-NEXT:    sarq $56, %rsi
11; X64_GISEL-NEXT:    imulq $4, %rsi, %rax
12; X64_GISEL-NEXT:    addq %rdi, %rax
13; X64_GISEL-NEXT:    retq
14;
15; X64-LABEL: test_gep_i8:
16; X64:       # %bb.0:
17; X64-NEXT:    # kill: def $esi killed $esi def $rsi
18; X64-NEXT:    movsbq %sil, %rax
19; X64-NEXT:    leaq (%rdi,%rax,4), %rax
20; X64-NEXT:    retq
21  %arrayidx = getelementptr i32, ptr %arr, i8 %ind
22  ret ptr %arrayidx
23}
24
25define ptr @test_gep_i8_const(ptr%arr) {
26; X64_GISEL-LABEL: test_gep_i8_const:
27; X64_GISEL:       # %bb.0:
28; X64_GISEL-NEXT:    movl $80, %eax
29; X64_GISEL-NEXT:    addq %rdi, %rax
30; X64_GISEL-NEXT:    retq
31;
32; X64-LABEL: test_gep_i8_const:
33; X64:       # %bb.0:
34; X64-NEXT:    leaq 80(%rdi), %rax
35; X64-NEXT:    retq
36  %arrayidx = getelementptr i32, ptr %arr, i8 20
37  ret ptr %arrayidx
38}
39
40define ptr @test_gep_i16(ptr%arr, i16 %ind) {
41; X64_GISEL-LABEL: test_gep_i16:
42; X64_GISEL:       # %bb.0:
43; X64_GISEL-NEXT:    # kill: def $esi killed $esi def $rsi
44; X64_GISEL-NEXT:    shlq $48, %rsi
45; X64_GISEL-NEXT:    sarq $48, %rsi
46; X64_GISEL-NEXT:    imulq $4, %rsi, %rax
47; X64_GISEL-NEXT:    addq %rdi, %rax
48; X64_GISEL-NEXT:    retq
49;
50; X64-LABEL: test_gep_i16:
51; X64:       # %bb.0:
52; X64-NEXT:    # kill: def $esi killed $esi def $rsi
53; X64-NEXT:    movswq %si, %rax
54; X64-NEXT:    leaq (%rdi,%rax,4), %rax
55; X64-NEXT:    retq
56  %arrayidx = getelementptr i32, ptr %arr, i16 %ind
57  ret ptr %arrayidx
58}
59
60define ptr @test_gep_i16_const(ptr%arr) {
61; X64_GISEL-LABEL: test_gep_i16_const:
62; X64_GISEL:       # %bb.0:
63; X64_GISEL-NEXT:    movl $80, %eax
64; X64_GISEL-NEXT:    addq %rdi, %rax
65; X64_GISEL-NEXT:    retq
66;
67; X64-LABEL: test_gep_i16_const:
68; X64:       # %bb.0:
69; X64-NEXT:    leaq 80(%rdi), %rax
70; X64-NEXT:    retq
71  %arrayidx = getelementptr i32, ptr %arr, i16 20
72  ret ptr %arrayidx
73}
74
75define ptr @test_gep_i32(ptr%arr, i32 %ind) {
76; X64_GISEL-LABEL: test_gep_i32:
77; X64_GISEL:       # %bb.0:
78; X64_GISEL-NEXT:    movslq %esi, %rax
79; X64_GISEL-NEXT:    imulq $4, %rax, %rax
80; X64_GISEL-NEXT:    addq %rdi, %rax
81; X64_GISEL-NEXT:    retq
82;
83; X64-LABEL: test_gep_i32:
84; X64:       # %bb.0:
85; X64-NEXT:    movslq %esi, %rax
86; X64-NEXT:    leaq (%rdi,%rax,4), %rax
87; X64-NEXT:    retq
88  %arrayidx = getelementptr i32, ptr %arr, i32 %ind
89  ret ptr %arrayidx
90}
91
92define ptr @test_gep_i32_const(ptr%arr) {
93; X64_GISEL-LABEL: test_gep_i32_const:
94; X64_GISEL:       # %bb.0:
95; X64_GISEL-NEXT:    movl $20, %eax
96; X64_GISEL-NEXT:    addq %rdi, %rax
97; X64_GISEL-NEXT:    retq
98;
99; X64-LABEL: test_gep_i32_const:
100; X64:       # %bb.0:
101; X64-NEXT:    leaq 20(%rdi), %rax
102; X64-NEXT:    retq
103  %arrayidx = getelementptr i32, ptr %arr, i32 5
104  ret ptr %arrayidx
105}
106
107define ptr @test_gep_i64(ptr%arr, i64 %ind) {
108; X64_GISEL-LABEL: test_gep_i64:
109; X64_GISEL:       # %bb.0:
110; X64_GISEL-NEXT:    imulq $4, %rsi, %rax
111; X64_GISEL-NEXT:    addq %rdi, %rax
112; X64_GISEL-NEXT:    retq
113;
114; X64-LABEL: test_gep_i64:
115; X64:       # %bb.0:
116; X64-NEXT:    leaq (%rdi,%rsi,4), %rax
117; X64-NEXT:    retq
118  %arrayidx = getelementptr i32, ptr %arr, i64 %ind
119  ret ptr %arrayidx
120}
121
122define ptr @test_gep_i64_const(ptr%arr) {
123; X64_GISEL-LABEL: test_gep_i64_const:
124; X64_GISEL:       # %bb.0:
125; X64_GISEL-NEXT:    movl $20, %eax
126; X64_GISEL-NEXT:    addq %rdi, %rax
127; X64_GISEL-NEXT:    retq
128;
129; X64-LABEL: test_gep_i64_const:
130; X64:       # %bb.0:
131; X64-NEXT:    leaq 20(%rdi), %rax
132; X64-NEXT:    retq
133  %arrayidx = getelementptr i32, ptr %arr, i64 5
134  ret ptr %arrayidx
135}
136
137