1; RUN: llc -march=amdgcn -mcpu=gfx940 -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 2 3declare float @llvm.amdgcn.cvt.f32.bf8(i32, i32) 4declare float @llvm.amdgcn.cvt.f32.fp8(i32, i32) 5declare <2 x float> @llvm.amdgcn.cvt.pk.f32.bf8(i32, i1) 6declare <2 x float> @llvm.amdgcn.cvt.pk.f32.fp8(i32, i1) 7declare i32 @llvm.amdgcn.cvt.pk.bf8.f32(float, float, i32, i1) 8declare i32 @llvm.amdgcn.cvt.pk.fp8.f32(float, float, i32, i1) 9declare i32 @llvm.amdgcn.cvt.sr.bf8.f32(float, i32, i32, i32) 10declare i32 @llvm.amdgcn.cvt.sr.fp8.f32(float, i32, i32, i32) 11 12; GCN-LABEL: {{^}}test_cvt_f32_bf8_byte0: 13; GCN: v_cvt_f32_bf8_e32 v0, v0{{$}} 14define float @test_cvt_f32_bf8_byte0(i32 %a) { 15 %ret = tail call float @llvm.amdgcn.cvt.f32.bf8(i32 %a, i32 0) 16 ret float %ret 17} 18 19; GCN-LABEL: {{^}}test_cvt_f32_bf8_byte1: 20; GCN: v_cvt_f32_bf8_sdwa v0, v0 src0_sel:BYTE_1 21define float @test_cvt_f32_bf8_byte1(i32 %a) { 22 %ret = tail call float @llvm.amdgcn.cvt.f32.bf8(i32 %a, i32 1) 23 ret float %ret 24} 25 26; GCN-LABEL: {{^}}test_cvt_f32_bf8_byte2: 27; GCN: v_cvt_f32_bf8_sdwa v0, v0 src0_sel:BYTE_2 28define float @test_cvt_f32_bf8_byte2(i32 %a) { 29 %ret = tail call float @llvm.amdgcn.cvt.f32.bf8(i32 %a, i32 2) 30 ret float %ret 31} 32 33; GCN-LABEL: {{^}}test_cvt_f32_bf8_byte3: 34; GCN: v_cvt_f32_bf8_sdwa v0, v0 src0_sel:BYTE_3 35define float @test_cvt_f32_bf8_byte3(i32 %a) { 36 %ret = tail call float @llvm.amdgcn.cvt.f32.bf8(i32 %a, i32 3) 37 ret float %ret 38} 39 40; GCN-LABEL: {{^}}test_cvt_f32_fp8_byte0: 41; GCN: v_cvt_f32_fp8_e32 v0, v0{{$}} 42define float @test_cvt_f32_fp8_byte0(i32 %a) { 43 %ret = tail call float @llvm.amdgcn.cvt.f32.fp8(i32 %a, i32 0) 44 ret float %ret 45} 46 47; GCN-LABEL: {{^}}test_cvt_f32_fp8_byte1: 48; GCN: v_cvt_f32_fp8_sdwa v0, v0 src0_sel:BYTE_1 49define float @test_cvt_f32_fp8_byte1(i32 %a) { 50 %ret = tail call float @llvm.amdgcn.cvt.f32.fp8(i32 %a, i32 1) 51 ret float %ret 52} 53 54; GCN-LABEL: {{^}}test_cvt_f32_fp8_byte2: 55; GCN: v_cvt_f32_fp8_sdwa v0, v0 src0_sel:BYTE_2 56define float @test_cvt_f32_fp8_byte2(i32 %a) { 57 %ret = tail call float @llvm.amdgcn.cvt.f32.fp8(i32 %a, i32 2) 58 ret float %ret 59} 60 61; GCN-LABEL: {{^}}test_cvt_f32_fp8_byte3: 62; GCN: v_cvt_f32_fp8_sdwa v0, v0 src0_sel:BYTE_3 63define float @test_cvt_f32_fp8_byte3(i32 %a) { 64 %ret = tail call float @llvm.amdgcn.cvt.f32.fp8(i32 %a, i32 3) 65 ret float %ret 66} 67 68; GCN-LABEL: {{^}}test_cvt_pk_f32_bf8_word0: 69; GCN: v_cvt_pk_f32_bf8_e32 v[0:1], v0{{$}} 70define <2 x float> @test_cvt_pk_f32_bf8_word0(i32 %a) { 71 %ret = tail call <2 x float> @llvm.amdgcn.cvt.pk.f32.bf8(i32 %a, i1 false) 72 ret <2 x float> %ret 73} 74 75; GCN-LABEL: {{^}}test_cvt_pk_f32_bf8_word1: 76; GCN: v_cvt_pk_f32_bf8_sdwa v[0:1], v0 src0_sel:WORD_1 77define <2 x float> @test_cvt_pk_f32_bf8_word1(i32 %a) { 78 %ret = tail call <2 x float> @llvm.amdgcn.cvt.pk.f32.bf8(i32 %a, i1 true) 79 ret <2 x float> %ret 80} 81 82; GCN-LABEL: {{^}}test_cvt_pk_f32_fp8_word0: 83; GCN: v_cvt_pk_f32_fp8_e32 v[0:1], v0{{$}} 84define <2 x float> @test_cvt_pk_f32_fp8_word0(i32 %a) { 85 %ret = tail call <2 x float> @llvm.amdgcn.cvt.pk.f32.fp8(i32 %a, i1 false) 86 ret <2 x float> %ret 87} 88 89; GCN-LABEL: {{^}}test_cvt_pk_f32_fp8_word1: 90; GCN: v_cvt_pk_f32_fp8_sdwa v[0:1], v0 src0_sel:WORD_1 91define <2 x float> @test_cvt_pk_f32_fp8_word1(i32 %a) { 92 %ret = tail call <2 x float> @llvm.amdgcn.cvt.pk.f32.fp8(i32 %a, i1 true) 93 ret <2 x float> %ret 94} 95 96; GCN-LABEL: {{^}}test_cvt_pk_bf8_f32_word0: 97; GCN: v_cvt_pk_bf8_f32 v2, v0, v1{{$}} 98; GCN: v_mov_b32_e32 v0, v2 99define i32 @test_cvt_pk_bf8_f32_word0(float %x, float %y, i32 %old) { 100 %ret = tail call i32 @llvm.amdgcn.cvt.pk.bf8.f32(float %x, float %y, i32 %old, i1 false) 101 ret i32 %ret 102} 103 104; GCN-LABEL: {{^}}test_cvt_pk_bf8_f32_word1: 105; GCN: v_cvt_pk_bf8_f32 v2, v0, v1 op_sel:[0,0,1] 106; GCN: v_mov_b32_e32 v0, v2 107define i32 @test_cvt_pk_bf8_f32_word1(float %x, float %y, i32 %old) { 108 %ret = tail call i32 @llvm.amdgcn.cvt.pk.bf8.f32(float %x, float %y, i32 %old, i1 true) 109 ret i32 %ret 110} 111 112; GCN-LABEL: {{^}}test_cvt_pk_fp8_f32_word0: 113; GCN: v_cvt_pk_fp8_f32 v2, v0, v1{{$}} 114; GCN: v_mov_b32_e32 v0, v2 115define i32 @test_cvt_pk_fp8_f32_word0(float %x, float %y, i32 %old) { 116 %ret = tail call i32 @llvm.amdgcn.cvt.pk.fp8.f32(float %x, float %y, i32 %old, i1 false) 117 ret i32 %ret 118} 119 120; GCN-LABEL: {{^}}test_cvt_pk_fp8_f32_word1: 121; GCN: v_cvt_pk_fp8_f32 v2, v0, v1 op_sel:[0,0,1] 122; GCN: v_mov_b32_e32 v0, v2 123define i32 @test_cvt_pk_fp8_f32_word1(float %x, float %y, i32 %old) { 124 %ret = tail call i32 @llvm.amdgcn.cvt.pk.fp8.f32(float %x, float %y, i32 %old, i1 true) 125 ret i32 %ret 126} 127 128; GCN-LABEL: {{^}}test_cvt_sr_bf8_f32_byte0: 129; GCN: v_cvt_sr_bf8_f32 v2, v0, v1{{$}} 130; GCN: v_mov_b32_e32 v0, v2 131define i32 @test_cvt_sr_bf8_f32_byte0(float %x, i32 %r, i32 %old) { 132 %ret = tail call i32 @llvm.amdgcn.cvt.sr.bf8.f32(float %x, i32 %r, i32 %old, i32 0) 133 ret i32 %ret 134} 135 136; GCN-LABEL: {{^}}test_cvt_sr_bf8_f32_byte1: 137; GCN: v_cvt_sr_bf8_f32 v2, v0, v1 op_sel:[0,0,1,0] 138; GCN: v_mov_b32_e32 v0, v2 139define i32 @test_cvt_sr_bf8_f32_byte1(float %x, i32 %r, i32 %old) { 140 %ret = tail call i32 @llvm.amdgcn.cvt.sr.bf8.f32(float %x, i32 %r, i32 %old, i32 1) 141 ret i32 %ret 142} 143 144; GCN-LABEL: {{^}}test_cvt_sr_bf8_f32_byte2: 145; GCN: v_cvt_sr_bf8_f32 v2, v0, v1 op_sel:[0,0,0,1] 146; GCN: v_mov_b32_e32 v0, v2 147define i32 @test_cvt_sr_bf8_f32_byte2(float %x, i32 %r, i32 %old) { 148 %ret = tail call i32 @llvm.amdgcn.cvt.sr.bf8.f32(float %x, i32 %r, i32 %old, i32 2) 149 ret i32 %ret 150} 151 152; GCN-LABEL: {{^}}test_cvt_sr_bf8_f32_byte3: 153; GCN: v_cvt_sr_bf8_f32 v2, v0, v1 op_sel:[0,0,1,1] 154; GCN: v_mov_b32_e32 v0, v2 155define i32 @test_cvt_sr_bf8_f32_byte3(float %x, i32 %r, i32 %old) { 156 %ret = tail call i32 @llvm.amdgcn.cvt.sr.bf8.f32(float %x, i32 %r, i32 %old, i32 3) 157 ret i32 %ret 158} 159 160; GCN-LABEL: {{^}}test_cvt_sr_fp8_f32_byte0: 161; GCN: v_cvt_sr_fp8_f32 v2, v0, v1{{$}} 162; GCN: v_mov_b32_e32 v0, v2 163define i32 @test_cvt_sr_fp8_f32_byte0(float %x, i32 %r, i32 %old) { 164 %ret = tail call i32 @llvm.amdgcn.cvt.sr.fp8.f32(float %x, i32 %r, i32 %old, i32 0) 165 ret i32 %ret 166} 167 168; GCN-LABEL: {{^}}test_cvt_sr_fp8_f32_byte1: 169; GCN: v_cvt_sr_fp8_f32 v2, v0, v1 op_sel:[0,0,1,0] 170; GCN: v_mov_b32_e32 v0, v2 171define i32 @test_cvt_sr_fp8_f32_byte1(float %x, i32 %r, i32 %old) { 172 %ret = tail call i32 @llvm.amdgcn.cvt.sr.fp8.f32(float %x, i32 %r, i32 %old, i32 1) 173 ret i32 %ret 174} 175 176; GCN-LABEL: {{^}}test_cvt_sr_fp8_f32_byte2: 177; GCN: v_cvt_sr_fp8_f32 v2, v0, v1 op_sel:[0,0,0,1] 178; GCN: v_mov_b32_e32 v0, v2 179define i32 @test_cvt_sr_fp8_f32_byte2(float %x, i32 %r, i32 %old) { 180 %ret = tail call i32 @llvm.amdgcn.cvt.sr.fp8.f32(float %x, i32 %r, i32 %old, i32 2) 181 ret i32 %ret 182} 183 184; GCN-LABEL: {{^}}test_cvt_sr_fp8_f32_byte3: 185; GCN: v_cvt_sr_fp8_f32 v2, v0, v1 op_sel:[0,0,1,1] 186; GCN: v_mov_b32_e32 v0, v2 187define i32 @test_cvt_sr_fp8_f32_byte3(float %x, i32 %r, i32 %old) { 188 %ret = tail call i32 @llvm.amdgcn.cvt.sr.fp8.f32(float %x, i32 %r, i32 %old, i32 3) 189 ret i32 %ret 190} 191