; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL ; RUN: llc -mtriple=aarch64-eabi -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL define i64 @extract_v2i64(<2 x i64> %x, i32 %y) { ; CHECK-ISEL-LABEL: extract_v2i64: ; CHECK-ISEL: // %bb.0: ; CHECK-ISEL-NEXT: mov x0, v0.d[1] ; CHECK-ISEL-NEXT: ret ; ; CHECK-GLOBAL-LABEL: extract_v2i64: ; CHECK-GLOBAL: // %bb.0: ; CHECK-GLOBAL-NEXT: mov d0, v0.d[1] ; CHECK-GLOBAL-NEXT: fmov x0, d0 ; CHECK-GLOBAL-NEXT: ret %ext = extractelement <2 x i64> %x, i32 1 ret i64 %ext } define i64 @extract_v1i64(<1 x i64> %x, i32 %y) { ; CHECK-ISEL-LABEL: extract_v1i64: ; CHECK-ISEL: // %bb.0: ; CHECK-ISEL-NEXT: ret ; ; CHECK-GLOBAL-LABEL: extract_v1i64: ; CHECK-GLOBAL: // %bb.0: ; CHECK-GLOBAL-NEXT: fmov x0, d0 ; CHECK-GLOBAL-NEXT: ret %ext = extractelement <1 x i64> %x, i32 1 ret i64 %ext } define i32 @extract_v4i32(<4 x i32> %x, i32 %y) { ; CHECK-ISEL-LABEL: extract_v4i32: ; CHECK-ISEL: // %bb.0: ; CHECK-ISEL-NEXT: mov w0, v0.s[1] ; CHECK-ISEL-NEXT: ret ; ; CHECK-GLOBAL-LABEL: extract_v4i32: ; CHECK-GLOBAL: // %bb.0: ; CHECK-GLOBAL-NEXT: mov s0, v0.s[1] ; CHECK-GLOBAL-NEXT: fmov w0, s0 ; CHECK-GLOBAL-NEXT: ret %ext = extractelement <4 x i32> %x, i32 1 ret i32 %ext } define i32 @extract_v2i32(<2 x i32> %x, i32 %y) { ; CHECK-ISEL-LABEL: extract_v2i32: ; CHECK-ISEL: // %bb.0: ; CHECK-ISEL-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-ISEL-NEXT: mov w0, v0.s[1] ; CHECK-ISEL-NEXT: ret ; ; CHECK-GLOBAL-LABEL: extract_v2i32: ; CHECK-GLOBAL: // %bb.0: ; CHECK-GLOBAL-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-GLOBAL-NEXT: mov s0, v0.s[1] ; CHECK-GLOBAL-NEXT: fmov w0, s0 ; CHECK-GLOBAL-NEXT: ret %ext = extractelement <2 x i32> %x, i32 1 ret i32 %ext } define i16 @extract_v8i16(<8 x i16> %x, i32 %y) { ; CHECK-LABEL: extract_v8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.h[1] ; CHECK-NEXT: ret %ext = extractelement <8 x i16> %x, i32 1 ret i16 %ext } define i16 @extract_v4i16(<4 x i16> %x, i32 %y) { ; CHECK-LABEL: extract_v4i16: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.h[1] ; CHECK-NEXT: ret %ext = extractelement <4 x i16> %x, i32 1 ret i16 %ext } define i8 @extract_v16i8(<16 x i8> %x, i32 %y) { ; CHECK-LABEL: extract_v16i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.b[1] ; CHECK-NEXT: ret %ext = extractelement <16 x i8> %x, i32 1 ret i8 %ext } define i8 @extract_v8i8(<8 x i8> %x, i32 %y) { ; CHECK-LABEL: extract_v8i8: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.b[1] ; CHECK-NEXT: ret %ext = extractelement <8 x i8> %x, i32 1 ret i8 %ext } define i64 @sv2i32i64(<2 x i32> %x) { ; CHECK-LABEL: sv2i32i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov x0, v0.s[1] ; CHECK-NEXT: ret %e = extractelement <2 x i32> %x, i64 1 %s = sext i32 %e to i64 ret i64 %s } define i64 @sv4i32i64(<4 x i32> %x) { ; CHECK-LABEL: sv4i32i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smov x0, v0.s[2] ; CHECK-NEXT: ret %e = extractelement <4 x i32> %x, i64 2 %s = sext i32 %e to i64 ret i64 %s } define i64 @sv4i16i64(<4 x i16> %x) { ; CHECK-LABEL: sv4i16i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov x0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <4 x i16> %x, i64 2 %s = sext i16 %e to i64 ret i64 %s } define i64 @sv8i16i64(<8 x i16> %x) { ; CHECK-LABEL: sv8i16i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smov x0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <8 x i16> %x, i64 2 %s = sext i16 %e to i64 ret i64 %s } define i64 @sv8i8i64(<8 x i8> %x) { ; CHECK-LABEL: sv8i8i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov x0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = sext i8 %e to i64 ret i64 %s } define i64 @sv16i8i64(<16 x i8> %x) { ; CHECK-LABEL: sv16i8i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smov x0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = sext i8 %e to i64 ret i64 %s } define i32 @sv8i16i32(<8 x i16> %x) { ; CHECK-LABEL: sv8i16i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <8 x i16> %x, i64 2 %s = sext i16 %e to i32 ret i32 %s } define i32 @sv4i16i32(<4 x i16> %x) { ; CHECK-LABEL: sv4i16i32: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <4 x i16> %x, i64 2 %s = sext i16 %e to i32 ret i32 %s } define i32 @sv16i8i32(<16 x i8> %x) { ; CHECK-LABEL: sv16i8i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = sext i8 %e to i32 ret i32 %s } define i32 @sv8i8i32(<8 x i8> %x) { ; CHECK-LABEL: sv8i8i32: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = sext i8 %e to i32 ret i32 %s } define i16 @sv16i8i16(<16 x i8> %x) { ; CHECK-LABEL: sv16i8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = sext i8 %e to i16 ret i16 %s } define i16 @sv8i8i16(<8 x i8> %x) { ; CHECK-LABEL: sv8i8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: smov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = sext i8 %e to i16 ret i16 %s } define i64 @zv2i32i64(<2 x i32> %x) { ; CHECK-LABEL: zv2i32i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: mov w0, v0.s[1] ; CHECK-NEXT: ret %e = extractelement <2 x i32> %x, i64 1 %s = zext i32 %e to i64 ret i64 %s } define i64 @zv4i32i64(<4 x i32> %x) { ; CHECK-LABEL: zv4i32i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w0, v0.s[2] ; CHECK-NEXT: ret %e = extractelement <4 x i32> %x, i64 2 %s = zext i32 %e to i64 ret i64 %s } define i64 @zv4i16i64(<4 x i16> %x) { ; CHECK-LABEL: zv4i16i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <4 x i16> %x, i64 2 %s = zext i16 %e to i64 ret i64 %s } define i64 @zv8i16i64(<8 x i16> %x) { ; CHECK-LABEL: zv8i16i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <8 x i16> %x, i64 2 %s = zext i16 %e to i64 ret i64 %s } define i64 @zv8i8i64(<8 x i8> %x) { ; CHECK-LABEL: zv8i8i64: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = zext i8 %e to i64 ret i64 %s } define i64 @zv16i8i64(<16 x i8> %x) { ; CHECK-LABEL: zv16i8i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = zext i8 %e to i64 ret i64 %s } define i32 @zv8i16i32(<8 x i16> %x) { ; CHECK-LABEL: zv8i16i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <8 x i16> %x, i64 2 %s = zext i16 %e to i32 ret i32 %s } define i32 @zv4i16i32(<4 x i16> %x) { ; CHECK-LABEL: zv4i16i32: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.h[2] ; CHECK-NEXT: ret %e = extractelement <4 x i16> %x, i64 2 %s = zext i16 %e to i32 ret i32 %s } define i32 @zv16i8i32(<16 x i8> %x) { ; CHECK-LABEL: zv16i8i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = zext i8 %e to i32 ret i32 %s } define i32 @zv8i8i32(<8 x i8> %x) { ; CHECK-LABEL: zv8i8i32: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = zext i8 %e to i32 ret i32 %s } define i16 @zv16i8i16(<16 x i8> %x) { ; CHECK-LABEL: zv16i8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <16 x i8> %x, i64 2 %s = zext i8 %e to i16 ret i16 %s } define i16 @zv8i8i16(<8 x i8> %x) { ; CHECK-LABEL: zv8i8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 ; CHECK-NEXT: umov w0, v0.b[2] ; CHECK-NEXT: ret %e = extractelement <8 x i8> %x, i64 2 %s = zext i8 %e to i16 ret i16 %s }