1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i64_bitcast_v2i32: 5*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword v 6*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword v 7*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i64_bitcast_v2i32(i32 addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { 8*9880d681SAndroid Build Coastguard Worker %ld = load <2 x i32>, <2 x i32> addrspace(1)* %in 9*9880d681SAndroid Build Coastguard Worker %bc = bitcast <2 x i32> %ld to i64 10*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %bc to i32 11*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 addrspace(1)* %out 12*9880d681SAndroid Build Coastguard Worker ret void 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i96_bitcast_v3i32: 16*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword v 17*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword v 18*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i96_bitcast_v3i32(i32 addrspace(1)* %out, <3 x i32> addrspace(1)* %in) { 19*9880d681SAndroid Build Coastguard Worker %ld = load <3 x i32>, <3 x i32> addrspace(1)* %in 20*9880d681SAndroid Build Coastguard Worker %bc = bitcast <3 x i32> %ld to i96 21*9880d681SAndroid Build Coastguard Worker %trunc = trunc i96 %bc to i32 22*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 addrspace(1)* %out 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i128_bitcast_v4i32: 27*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword v 28*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword v 29*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i128_bitcast_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 30*9880d681SAndroid Build Coastguard Worker %ld = load <4 x i32>, <4 x i32> addrspace(1)* %in 31*9880d681SAndroid Build Coastguard Worker %bc = bitcast <4 x i32> %ld to i128 32*9880d681SAndroid Build Coastguard Worker %trunc = trunc i128 %bc to i32 33*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 addrspace(1)* %out 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; Don't want load width reduced in this case. 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i16_bitcast_v2i16: 39*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword [[VAL:v[0-9]+]] 40*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_short [[VAL]] 41*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i16_bitcast_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %in) { 42*9880d681SAndroid Build Coastguard Worker %ld = load <2 x i16>, <2 x i16> addrspace(1)* %in 43*9880d681SAndroid Build Coastguard Worker %bc = bitcast <2 x i16> %ld to i32 44*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %bc to i16 45*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 addrspace(1)* %out 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i16_bitcast_v4i16: 50*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword [[VAL:v[0-9]+]] 51*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_short [[VAL]] 52*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i16_bitcast_v4i16(i16 addrspace(1)* %out, <4 x i16> addrspace(1)* %in) { 53*9880d681SAndroid Build Coastguard Worker %ld = load <4 x i16>, <4 x i16> addrspace(1)* %in 54*9880d681SAndroid Build Coastguard Worker %bc = bitcast <4 x i16> %ld to i64 55*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %bc to i16 56*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 addrspace(1)* %out 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; FIXME: Don't want load width reduced in this case. 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i8_bitcast_v2i8: 62*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_ubyte [[VAL:v[0-9]+]] 63*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_byte [[VAL]] 64*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i8_bitcast_v2i8(i8 addrspace(1)* %out, <2 x i8> addrspace(1)* %in) { 65*9880d681SAndroid Build Coastguard Worker %ld = load <2 x i8>, <2 x i8> addrspace(1)* %in 66*9880d681SAndroid Build Coastguard Worker %bc = bitcast <2 x i8> %ld to i16 67*9880d681SAndroid Build Coastguard Worker %trunc = trunc i16 %bc to i8 68*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 addrspace(1)* %out 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i32_bitcast_v4i8: 73*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword [[VAL:v[0-9]+]] 74*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_byte [[VAL]] 75*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i32_bitcast_v4i8(i8 addrspace(1)* %out, <4 x i8> addrspace(1)* %in) { 76*9880d681SAndroid Build Coastguard Worker %ld = load <4 x i8>, <4 x i8> addrspace(1)* %in 77*9880d681SAndroid Build Coastguard Worker %bc = bitcast <4 x i8> %ld to i32 78*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %bc to i8 79*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 addrspace(1)* %out 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}trunc_i24_bitcast_v3i8: 84*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword [[VAL:v[0-9]+]] 85*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_byte [[VAL]] 86*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i24_bitcast_v3i8(i8 addrspace(1)* %out, <3 x i8> addrspace(1)* %in) { 87*9880d681SAndroid Build Coastguard Worker %ld = load <3 x i8>, <3 x i8> addrspace(1)* %in 88*9880d681SAndroid Build Coastguard Worker %bc = bitcast <3 x i8> %ld to i24 89*9880d681SAndroid Build Coastguard Worker %trunc = trunc i24 %bc to i8 90*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 addrspace(1)* %out 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93