1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 3 4declare i32 @llvm.r600.read.tidig.x() #0 5 6; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i32: 7; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 8define void @v_test_smed3_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 9 %tid = call i32 @llvm.r600.read.tidig.x() 10 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 11 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 12 %a = load i32, i32 addrspace(1)* %gep0 13 14 %icmp0 = icmp sgt i32 %a, 12 15 %i0 = select i1 %icmp0, i32 %a, i32 12 16 17 %icmp1 = icmp slt i32 %i0, 17 18 %i1 = select i1 %icmp1, i32 %i0, i32 17 19 20 store i32 %i1, i32 addrspace(1)* %outgep 21 ret void 22} 23 24; GCN-LABEL: {{^}}v_test_smed3_multi_use_r_i_i_i32: 25; GCN: v_max_i32 26; GCN: v_min_i32 27define void @v_test_smed3_multi_use_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 28 %tid = call i32 @llvm.r600.read.tidig.x() 29 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 30 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 31 %a = load i32, i32 addrspace(1)* %gep0 32 33 %icmp0 = icmp sgt i32 %a, 12 34 %i0 = select i1 %icmp0, i32 %a, i32 12 35 36 %icmp1 = icmp slt i32 %i0, 17 37 %i1 = select i1 %icmp1, i32 %i0, i32 17 38 39 store volatile i32 %i0, i32 addrspace(1)* %outgep 40 store volatile i32 %i1, i32 addrspace(1)* %outgep 41 ret void 42} 43 44; GCN-LABEL: {{^}}v_test_smed3_r_i_i_constant_order_i32: 45; GCN: v_max_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 46; GCN: v_min_i32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 47define void @v_test_smed3_r_i_i_constant_order_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 48 %tid = call i32 @llvm.r600.read.tidig.x() 49 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 50 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 51 %a = load i32, i32 addrspace(1)* %gep0 52 53 %icmp0 = icmp sgt i32 %a, 17 54 %i0 = select i1 %icmp0, i32 %a, i32 17 55 56 %icmp1 = icmp slt i32 %i0, 12 57 %i1 = select i1 %icmp1, i32 %i0, i32 12 58 59 store i32 %i1, i32 addrspace(1)* %outgep 60 ret void 61} 62 63; GCN-LABEL: {{^}}v_test_smed3_r_i_i_sign_mismatch_i32: 64; GCN: v_max_u32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 65; GCN: v_min_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 66define void @v_test_smed3_r_i_i_sign_mismatch_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 67 %tid = call i32 @llvm.r600.read.tidig.x() 68 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 69 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 70 %a = load i32, i32 addrspace(1)* %gep0 71 72 %icmp0 = icmp ugt i32 %a, 12 73 %i0 = select i1 %icmp0, i32 %a, i32 12 74 75 %icmp1 = icmp slt i32 %i0, 17 76 %i1 = select i1 %icmp1, i32 %i0, i32 17 77 78 store i32 %i1, i32 addrspace(1)* %outgep 79 ret void 80} 81 82; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i64: 83; GCN: v_cmp_lt_i64 84; GCN: v_cmp_gt_i64 85define void @v_test_smed3_r_i_i_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) #1 { 86 %tid = call i32 @llvm.r600.read.tidig.x() 87 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 88 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 89 %a = load i64, i64 addrspace(1)* %gep0 90 91 %icmp0 = icmp sgt i64 %a, 12 92 %i0 = select i1 %icmp0, i64 %a, i64 12 93 94 %icmp1 = icmp slt i64 %i0, 17 95 %i1 = select i1 %icmp1, i64 %i0, i64 17 96 97 store i64 %i1, i64 addrspace(1)* %outgep 98 ret void 99} 100 101; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i16: 102; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 103define void @v_test_smed3_r_i_i_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr) #1 { 104 %tid = call i32 @llvm.r600.read.tidig.x() 105 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 106 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 107 %a = load i16, i16 addrspace(1)* %gep0 108 109 %icmp0 = icmp sgt i16 %a, 12 110 %i0 = select i1 %icmp0, i16 %a, i16 12 111 112 %icmp1 = icmp slt i16 %i0, 17 113 %i1 = select i1 %icmp1, i16 %i0, i16 17 114 115 store i16 %i1, i16 addrspace(1)* %outgep 116 ret void 117} 118 119attributes #0 = { nounwind readnone } 120attributes #1 = { nounwind } 121