1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64_be-- < %s | FileCheck %s --check-prefix=BE 3; RUN: llc -mtriple=aarch64-- < %s | FileCheck %s --check-prefix=LE 4 5define i32 @trunc_i64_to_i32_le(i64 %x) { 6; BE-LABEL: trunc_i64_to_i32_le: 7; BE: // %bb.0: 8; BE-NEXT: lsr x0, x0, #32 9; BE-NEXT: // kill: def $w0 killed $w0 killed $x0 10; BE-NEXT: ret 11; 12; LE-LABEL: trunc_i64_to_i32_le: 13; LE: // %bb.0: 14; LE-NEXT: // kill: def $w0 killed $w0 killed $x0 15; LE-NEXT: ret 16 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 17 %bc = bitcast <2 x i64> %ins to <4 x i32> 18 %ext = extractelement <4 x i32> %bc, i32 0 19 ret i32 %ext 20} 21 22define i32 @trunc_i64_to_i32_be(i64 %x) { 23; BE-LABEL: trunc_i64_to_i32_be: 24; BE: // %bb.0: 25; BE-NEXT: // kill: def $w0 killed $w0 killed $x0 26; BE-NEXT: ret 27; 28; LE-LABEL: trunc_i64_to_i32_be: 29; LE: // %bb.0: 30; LE-NEXT: lsr x0, x0, #32 31; LE-NEXT: // kill: def $w0 killed $w0 killed $x0 32; LE-NEXT: ret 33 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 34 %bc = bitcast <2 x i64> %ins to <4 x i32> 35 %ext = extractelement <4 x i32> %bc, i32 1 36 ret i32 %ext 37} 38 39define i16 @trunc_i64_to_i16_le(i64 %x) { 40; BE-LABEL: trunc_i64_to_i16_le: 41; BE: // %bb.0: 42; BE-NEXT: lsr x0, x0, #48 43; BE-NEXT: // kill: def $w0 killed $w0 killed $x0 44; BE-NEXT: ret 45; 46; LE-LABEL: trunc_i64_to_i16_le: 47; LE: // %bb.0: 48; LE-NEXT: // kill: def $w0 killed $w0 killed $x0 49; LE-NEXT: ret 50 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 51 %bc = bitcast <2 x i64> %ins to <8 x i16> 52 %ext = extractelement <8 x i16> %bc, i32 0 53 ret i16 %ext 54} 55 56define i16 @trunc_i64_to_i16_be(i64 %x) { 57; BE-LABEL: trunc_i64_to_i16_be: 58; BE: // %bb.0: 59; BE-NEXT: // kill: def $w0 killed $w0 killed $x0 60; BE-NEXT: ret 61; 62; LE-LABEL: trunc_i64_to_i16_be: 63; LE: // %bb.0: 64; LE-NEXT: lsr x0, x0, #48 65; LE-NEXT: // kill: def $w0 killed $w0 killed $x0 66; LE-NEXT: ret 67 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 68 %bc = bitcast <2 x i64> %ins to <8 x i16> 69 %ext = extractelement <8 x i16> %bc, i32 3 70 ret i16 %ext 71} 72 73define i8 @trunc_i32_to_i8_le(i32 %x) { 74; BE-LABEL: trunc_i32_to_i8_le: 75; BE: // %bb.0: 76; BE-NEXT: lsr w0, w0, #24 77; BE-NEXT: ret 78; 79; LE-LABEL: trunc_i32_to_i8_le: 80; LE: // %bb.0: 81; LE-NEXT: ret 82 %ins = insertelement <4 x i32> undef, i32 %x, i32 0 83 %bc = bitcast <4 x i32> %ins to <16 x i8> 84 %ext = extractelement <16 x i8> %bc, i32 0 85 ret i8 %ext 86} 87 88define i8 @trunc_i32_to_i8_be(i32 %x) { 89; BE-LABEL: trunc_i32_to_i8_be: 90; BE: // %bb.0: 91; BE-NEXT: ret 92; 93; LE-LABEL: trunc_i32_to_i8_be: 94; LE: // %bb.0: 95; LE-NEXT: lsr w0, w0, #24 96; LE-NEXT: ret 97 %ins = insertelement <4 x i32> undef, i32 %x, i32 0 98 %bc = bitcast <4 x i32> %ins to <16 x i8> 99 %ext = extractelement <16 x i8> %bc, i32 3 100 ret i8 %ext 101} 102 103; Weird type (non-power-of-2 vector) is ok. 104 105define i8 @trunc_i64_to_i8_be(i64 %x) { 106; BE-LABEL: trunc_i64_to_i8_be: 107; BE: // %bb.0: 108; BE-NEXT: // kill: def $w0 killed $w0 killed $x0 109; BE-NEXT: ret 110; 111; LE-LABEL: trunc_i64_to_i8_be: 112; LE: // %bb.0: 113; LE-NEXT: lsr x0, x0, #56 114; LE-NEXT: // kill: def $w0 killed $w0 killed $x0 115; LE-NEXT: ret 116 %ins = insertelement <3 x i64> undef, i64 %x, i32 0 117 %bc = bitcast <3 x i64> %ins to <24 x i8> 118 %ext = extractelement <24 x i8> %bc, i32 7 119 ret i8 %ext 120} 121 122