1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i1_to_i32: 5*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64 6*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 7*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i1_to_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 8*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, %b 9*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %cmp to i32 10*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 11*9880d681SAndroid Build Coastguard Worker ret void 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_s_sext_i32_to_i64: 15*9880d681SAndroid Build Coastguard Worker; GCN: s_ashr_i32 16*9880d681SAndroid Build Coastguard Worker; GCN: s_endpg 17*9880d681SAndroid Build Coastguard Workerdefine void @test_s_sext_i32_to_i64(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) nounwind { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %a, %b 20*9880d681SAndroid Build Coastguard Worker %add = add i32 %mul, %c 21*9880d681SAndroid Build Coastguard Worker %sext = sext i32 %add to i64 22*9880d681SAndroid Build Coastguard Worker store i64 %sext, i64 addrspace(1)* %out, align 8 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i1_to_i64: 27*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64 v[[LOREG:[0-9]+]], 0, -1, vcc 28*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 v[[HIREG:[0-9]+]], v[[LOREG]] 29*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[LOREG]]:[[HIREG]]{{\]}} 30*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 31*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i1_to_i64(i64 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 32*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, %b 33*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %cmp to i64 34*9880d681SAndroid Build Coastguard Worker store i64 %sext, i64 addrspace(1)* %out, align 8 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i32_to_i64: 39*9880d681SAndroid Build Coastguard Worker; GCN: s_ashr_i32 40*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 41*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i32_to_i64(i64 addrspace(1)* %out, i32 %a) nounwind { 42*9880d681SAndroid Build Coastguard Worker %sext = sext i32 %a to i64 43*9880d681SAndroid Build Coastguard Worker store i64 %sext, i64 addrspace(1)* %out, align 8 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_i32_to_i64: 48*9880d681SAndroid Build Coastguard Worker; GCN: v_ashr 49*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 50*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_i32_to_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 51*9880d681SAndroid Build Coastguard Worker %val = load i32, i32 addrspace(1)* %in, align 4 52*9880d681SAndroid Build Coastguard Worker %sext = sext i32 %val to i64 53*9880d681SAndroid Build Coastguard Worker store i64 %sext, i64 addrspace(1)* %out, align 8 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_i16_to_i64: 58*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 59*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_i16_to_i64(i64 addrspace(1)* %out, i16 %a) nounwind { 60*9880d681SAndroid Build Coastguard Worker %sext = sext i16 %a to i64 61*9880d681SAndroid Build Coastguard Worker store i64 %sext, i64 addrspace(1)* %out, align 8 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_v4i8_to_v4i32: 66*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL:s[0-9]+]] 67*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i8 [[EXT0:s[0-9]+]], [[VAL]] 68*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_bfe_i32 [[EXT1:s[0-9]+]], [[VAL]], 0x80008 69*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_bfe_i32 [[EXT2:s[0-9]+]], [[VAL]], 0x80010 70*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i32 [[EXT3:s[0-9]+]], [[VAL]], 24 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT0:v[0-9]+]], [[EXT0]] 73*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT1:v[0-9]+]], [[EXT1]] 74*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT2:v[0-9]+]], [[EXT2]] 75*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VEXT3:v[0-9]+]], [[EXT3]] 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT0]] 78*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT1]] 79*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT2]] 80*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[VEXT3]] 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 83*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_v4i8_to_v4i32(i32 addrspace(1)* %out, i32 %a) nounwind { 84*9880d681SAndroid Build Coastguard Worker %cast = bitcast i32 %a to <4 x i8> 85*9880d681SAndroid Build Coastguard Worker %ext = sext <4 x i8> %cast to <4 x i32> 86*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x i32> %ext, i32 0 87*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x i32> %ext, i32 1 88*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x i32> %ext, i32 2 89*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x i32> %ext, i32 3 90*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt0, i32 addrspace(1)* %out 91*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt1, i32 addrspace(1)* %out 92*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt2, i32 addrspace(1)* %out 93*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt3, i32 addrspace(1)* %out 94*9880d681SAndroid Build Coastguard Worker ret void 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_v4i8_to_v4i32: 98*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]] 99*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT0:v[0-9]+]], [[VAL]], 0, 8 100*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT1:v[0-9]+]], [[VAL]], 8, 8 101*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 [[EXT2:v[0-9]+]], [[VAL]], 16, 8 102*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 [[EXT3:v[0-9]+]], 24, [[VAL]] 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT0]] 105*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT1]] 106*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT2]] 107*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[EXT3]] 108*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_v4i8_to_v4i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 109*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %in 110*9880d681SAndroid Build Coastguard Worker %cast = bitcast i32 %a to <4 x i8> 111*9880d681SAndroid Build Coastguard Worker %ext = sext <4 x i8> %cast to <4 x i32> 112*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x i32> %ext, i32 0 113*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x i32> %ext, i32 1 114*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x i32> %ext, i32 2 115*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x i32> %ext, i32 3 116*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt0, i32 addrspace(1)* %out 117*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt1, i32 addrspace(1)* %out 118*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt2, i32 addrspace(1)* %out 119*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt3, i32 addrspace(1)* %out 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; FIXME: s_bfe_i64 124*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_sext_v4i16_to_v4i32: 125*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i64 s{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 48 126*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_ashr_i32 s{{[0-9]+}}, s{{[0-9]+}}, 16 127*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i16 128*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_sext_i32_i16 129*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 130*9880d681SAndroid Build Coastguard Workerdefine void @s_sext_v4i16_to_v4i32(i32 addrspace(1)* %out, i64 %a) nounwind { 131*9880d681SAndroid Build Coastguard Worker %cast = bitcast i64 %a to <4 x i16> 132*9880d681SAndroid Build Coastguard Worker %ext = sext <4 x i16> %cast to <4 x i32> 133*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x i32> %ext, i32 0 134*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x i32> %ext, i32 1 135*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x i32> %ext, i32 2 136*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x i32> %ext, i32 3 137*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt0, i32 addrspace(1)* %out 138*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt1, i32 addrspace(1)* %out 139*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt2, i32 addrspace(1)* %out 140*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt3, i32 addrspace(1)* %out 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_sext_v4i16_to_v4i32: 145*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_ashr_i64 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, 48 146*9880d681SAndroid Build Coastguard Worker; VI-DAG: v_ashrrev_i64 v{{\[[0-9]+:[0-9]+\]}}, 48, v{{\[[0-9]+:[0-9]+\]}} 147*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 v{{[0-9]+}}, 16, v{{[0-9]+}} 148*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_ashrrev_i32_e32 v{{[0-9]+}}, 16, v{{[0-9]+}} 149*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 16 150*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 16 151*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 152*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_v4i16_to_v4i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) nounwind { 153*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %in 154*9880d681SAndroid Build Coastguard Worker %cast = bitcast i64 %a to <4 x i16> 155*9880d681SAndroid Build Coastguard Worker %ext = sext <4 x i16> %cast to <4 x i32> 156*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x i32> %ext, i32 0 157*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x i32> %ext, i32 1 158*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x i32> %ext, i32 2 159*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x i32> %ext, i32 3 160*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt0, i32 addrspace(1)* %out 161*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt1, i32 addrspace(1)* %out 162*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt2, i32 addrspace(1)* %out 163*9880d681SAndroid Build Coastguard Worker store volatile i32 %elt3, i32 addrspace(1)* %out 164*9880d681SAndroid Build Coastguard Worker ret void 165*9880d681SAndroid Build Coastguard Worker} 166