1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2; RUN: llc -global-isel -mtriple=amdgcn -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s 3 4define float @v_constained_fadd_f32_fpexcept_strict(float %x, float %y) #0 { 5 ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_strict 6 ; CHECK: bb.1 (%ir-block.0): 7 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 8 ; CHECK-NEXT: {{ $}} 9 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 10 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 11 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(s32) = G_STRICT_FADD [[COPY]], [[COPY1]] 12 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FADD]](s32) 13 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 14 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 15 ret float %val 16} 17 18define float @v_constained_fadd_f32_fpexcept_strict_flags(float %x, float %y) #0 { 19 ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_strict_flags 20 ; CHECK: bb.1 (%ir-block.0): 21 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 22 ; CHECK-NEXT: {{ $}} 23 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 24 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 25 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(s32) = nsz G_STRICT_FADD [[COPY]], [[COPY1]] 26 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FADD]](s32) 27 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 28 %val = call nsz float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 29 ret float %val 30} 31 32define float @v_constained_fadd_f32_fpexcept_ignore(float %x, float %y) #0 { 33 ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_ignore 34 ; CHECK: bb.1 (%ir-block.0): 35 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 36 ; CHECK-NEXT: {{ $}} 37 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 38 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 39 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(s32) = nofpexcept G_STRICT_FADD [[COPY]], [[COPY1]] 40 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FADD]](s32) 41 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 42 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 43 ret float %val 44} 45 46define float @v_constained_fadd_f32_fpexcept_ignore_flags(float %x, float %y) #0 { 47 ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_ignore_flags 48 ; CHECK: bb.1 (%ir-block.0): 49 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 50 ; CHECK-NEXT: {{ $}} 51 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 52 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 53 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FADD [[COPY]], [[COPY1]] 54 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FADD]](s32) 55 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 56 %val = call nsz float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 57 ret float %val 58} 59 60define float @v_constained_fadd_f32_fpexcept_maytrap(float %x, float %y) #0 { 61 ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_maytrap 62 ; CHECK: bb.1 (%ir-block.0): 63 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 64 ; CHECK-NEXT: {{ $}} 65 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 66 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 67 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(s32) = G_STRICT_FADD [[COPY]], [[COPY1]] 68 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FADD]](s32) 69 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 70 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap") 71 ret float %val 72} 73 74define <2 x float> @v_constained_fadd_v2f32_fpexcept_strict(<2 x float> %x, <2 x float> %y) #0 { 75 ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_strict 76 ; CHECK: bb.1 (%ir-block.0): 77 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3 78 ; CHECK-NEXT: {{ $}} 79 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 80 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 81 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32) 82 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 83 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3 84 ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32) 85 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]] 86 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>) 87 ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 88 ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 89 ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 90 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 91 ret <2 x float> %val 92} 93 94define <2 x float> @v_constained_fadd_v2f32_fpexcept_ignore(<2 x float> %x, <2 x float> %y) #0 { 95 ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_ignore 96 ; CHECK: bb.1 (%ir-block.0): 97 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3 98 ; CHECK-NEXT: {{ $}} 99 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 100 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 101 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32) 102 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 103 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3 104 ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32) 105 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = nofpexcept G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]] 106 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>) 107 ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 108 ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 109 ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 110 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 111 ret <2 x float> %val 112} 113 114define <2 x float> @v_constained_fadd_v2f32_fpexcept_maytrap(<2 x float> %x, <2 x float> %y) #0 { 115 ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_maytrap 116 ; CHECK: bb.1 (%ir-block.0): 117 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3 118 ; CHECK-NEXT: {{ $}} 119 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 120 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 121 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32) 122 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 123 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3 124 ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32) 125 ; CHECK-NEXT: [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]] 126 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>) 127 ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 128 ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 129 ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 130 %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap") 131 ret <2 x float> %val 132} 133 134define float @v_constained_fsub_f32_fpexcept_ignore_flags(float %x, float %y) #0 { 135 ; CHECK-LABEL: name: v_constained_fsub_f32_fpexcept_ignore_flags 136 ; CHECK: bb.1 (%ir-block.0): 137 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 138 ; CHECK-NEXT: {{ $}} 139 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 140 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 141 ; CHECK-NEXT: [[STRICT_FSUB:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FSUB [[COPY]], [[COPY1]] 142 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FSUB]](s32) 143 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 144 %val = call nsz float @llvm.experimental.constrained.fsub.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 145 ret float %val 146} 147 148define float @v_constained_fmul_f32_fpexcept_ignore_flags(float %x, float %y) #0 { 149 ; CHECK-LABEL: name: v_constained_fmul_f32_fpexcept_ignore_flags 150 ; CHECK: bb.1 (%ir-block.0): 151 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 152 ; CHECK-NEXT: {{ $}} 153 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 154 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 155 ; CHECK-NEXT: [[STRICT_FMUL:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FMUL [[COPY]], [[COPY1]] 156 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FMUL]](s32) 157 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 158 %val = call nsz float @llvm.experimental.constrained.fmul.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 159 ret float %val 160} 161 162define float @v_constained_fdiv_f32_fpexcept_ignore_flags(float %x, float %y) #0 { 163 ; CHECK-LABEL: name: v_constained_fdiv_f32_fpexcept_ignore_flags 164 ; CHECK: bb.1 (%ir-block.0): 165 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 166 ; CHECK-NEXT: {{ $}} 167 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 168 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 169 ; CHECK-NEXT: [[STRICT_FDIV:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FDIV [[COPY]], [[COPY1]] 170 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FDIV]](s32) 171 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 172 %val = call nsz float @llvm.experimental.constrained.fdiv.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 173 ret float %val 174} 175 176define float @v_constained_frem_f32_fpexcept_ignore_flags(float %x, float %y) #0 { 177 ; CHECK-LABEL: name: v_constained_frem_f32_fpexcept_ignore_flags 178 ; CHECK: bb.1 (%ir-block.0): 179 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 180 ; CHECK-NEXT: {{ $}} 181 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 182 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 183 ; CHECK-NEXT: [[STRICT_FREM:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FREM [[COPY]], [[COPY1]] 184 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FREM]](s32) 185 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 186 %val = call nsz float @llvm.experimental.constrained.frem.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 187 ret float %val 188} 189 190define float @v_constained_fma_f32_fpexcept_ignore_flags(float %x, float %y, float %z) #0 { 191 ; CHECK-LABEL: name: v_constained_fma_f32_fpexcept_ignore_flags 192 ; CHECK: bb.1 (%ir-block.0): 193 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2 194 ; CHECK-NEXT: {{ $}} 195 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 196 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 197 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 198 ; CHECK-NEXT: [[STRICT_FMA:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FMA [[COPY]], [[COPY1]], [[COPY2]] 199 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FMA]](s32) 200 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 201 %val = call nsz float @llvm.experimental.constrained.fma.f32(float %x, float %y, float %z, metadata !"round.tonearest", metadata !"fpexcept.ignore") 202 ret float %val 203} 204 205define float @v_constained_sqrt_f32_fpexcept_strict(float %x) #0 { 206 ; CHECK-LABEL: name: v_constained_sqrt_f32_fpexcept_strict 207 ; CHECK: bb.1 (%ir-block.0): 208 ; CHECK-NEXT: liveins: $vgpr0 209 ; CHECK-NEXT: {{ $}} 210 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 211 ; CHECK-NEXT: [[STRICT_FSQRT:%[0-9]+]]:_(s32) = G_STRICT_FSQRT [[COPY]] 212 ; CHECK-NEXT: $vgpr0 = COPY [[STRICT_FSQRT]](s32) 213 ; CHECK-NEXT: SI_RETURN implicit $vgpr0 214 %val = call float @llvm.experimental.constrained.sqrt.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") 215 ret float %val 216} 217 218declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata) #1 219declare <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float>, <2 x float>, metadata, metadata) #1 220declare <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float>, <3 x float>, metadata, metadata) #1 221declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata) #1 222declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata) #1 223declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata) #1 224declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata) #1 225declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) #1 226declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata) #1 227 228attributes #0 = { strictfp } 229attributes #1 = { inaccessiblememonly nounwind willreturn } 230