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