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