brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 67b6bbb Raw
242 lines · c
1// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \2// RUN: -o - | FileCheck %s --check-prefix=FULL3 4// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \5// RUN: -complex-range=basic -o - | FileCheck --check-prefix=BASIC %s6 7// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \8// RUN: -fno-cx-limited-range -o - | FileCheck %s --check-prefix=FULL9 10// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \11// RUN: -complex-range=improved -o - | FileCheck --check-prefix=IMPRVD %s12 13// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \14// RUN: -complex-range=promoted -o - | FileCheck --check-prefix=PRMTD %s15 16// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \17// RUN: -complex-range=full -o - | FileCheck --check-prefix=FULL %s18 19_Complex float pragma_on_mul(_Complex float a, _Complex float b) {20#pragma STDC CX_LIMITED_RANGE ON21  // LABEL: define {{.*}} @pragma_on_mul(22 23  // FULL: fmul float24  // FULL-NEXT: fmul float25  // FULL-NEXT: fmul float26  // FULL-NEXT: fmul float27  // FULL-NEXT: fsub float28  // FULL-NEXT: fadd float29 30  // BASIC: fmul float31  // BASIC-NEXT: fmul float32  // BASIC-NEXT: fmul float33  // BASIC-NEXT: fmul float34  // BASIC-NEXT: fsub float35  // BASIC-NEXT: fadd float36 37  // IMPRVD: fmul float38  // IMPRVD-NEXT: fmul float39  // IMPRVD-NEXT: fmul float40  // IMPRVD-NEXT: fmul float41  // IMPRVD-NEXT: fsub float42  // IMPRVD-NEXT: fadd float43 44  // PRMTD: fmul float45  // PRMTD-NEXT: fmul float46  // PRMTD-NEXT: fmul float47  // PRMTD-NEXT: fmul float48  // PRMTD-NEXT: fsub float49  // PRMTD-NEXT: fadd float50 51  return a * b;52}53 54_Complex float pragma_off_mul(_Complex float a, _Complex float b) {55#pragma STDC CX_LIMITED_RANGE OFF56  // LABEL: define {{.*}} @pragma_off_mul(57 58  // FULL: call {{.*}} @__mulsc359 60  // BASIC: call {{.*}} @__mulsc361 62  // IMPRVD: call {{.*}} @__mulsc363 64  // PRMTD: call {{.*}} @__mulsc365 66  return a * b;67}68 69_Complex float pragma_on_div(_Complex float a, _Complex float b) {70#pragma STDC CX_LIMITED_RANGE ON71  // LABEL: define {{.*}} @pragma_on_div(72 73  // FULL: fmul float74  // FULL-NEXT: fmul float75  // FULL-NEXT: fadd float76  // FULL-NEXT: fmul float77  // FULL-NEXT: fmul float78  // FULL-NEXT: fadd float79  // FULL-NEXT: fmul float80  // FULL-NEXT: fmul float81  // FULL-NEXT: fsub float82  // FULL-NEXT: fdiv float83  // FULL: fdiv float84 85  // BASIC: fmul float86  // BASIC-NEXT: fmul float87  // BASIC-NEXT: fadd float88  // BASIC-NEXT: fmul float89  // BASIC-NEXT: fmul float90  // BASIC-NEXT: fadd float91  // BASIC-NEXT: fmul float92  // BASIC-NEXT: fmul float93  // BASIC-NEXT: fsub float94  // BASIC-NEXT: fdiv float95  // BASIC-NEXT: fdiv float96 97  // IMPRVD: fmul float98  // IMPRVD-NEXT: fmul float99  // IMPRVD-NEXT: fadd float100  // IMPRVD-NEXT: fmul float101  // IMPRVD-NEXT: fmul float102  // IMPRVD-NEXT: fadd float103  // IMPRVD-NEXT: fmul float104  // IMPRVD-NEXT: fmul float105  // IMPRVD-NEXT: fsub float106  // IMPRVD-NEXT: fdiv float107  // IMPRVD-NEXT: fdiv float108 109  // PRMTD: fmul float110  // PRMTD-NEXT: fmul float111  // PRMTD-NEXT: fadd float112  // PRMTD-NEXT: fmul float113  // PRMTD-NEXT: fmul float114  // PRMTD-NEXT: fadd float115  // PRMTD-NEXT: fmul float116  // PRMTD-NEXT: fmul float117  // PRMTD-NEXT: fsub float118  // PRMTD-NEXT: fdiv float119  // PRMTD-NEXT: fdiv float120 121  return a / b;122}123 124_Complex float pragma_off_div(_Complex float a, _Complex float b) {125#pragma STDC CX_LIMITED_RANGE OFF126  // LABEL: define {{.*}} @pragma_off_div(127 128  // FULL: call {{.*}} @__divsc3129 130  // BASIC: call {{.*}} @__divsc3131 132  // IMPRVD: call {{.*}} @__divsc3133 134  // PRMTD: call {{.*}} @__divsc3135 136  return a / b;137}138 139_Complex float pragma_default_mul(_Complex float a, _Complex float b) {140#pragma STDC CX_LIMITED_RANGE DEFAULT141  // LABEL: define {{.*}} @pragma_on_mul(142 143  // FULL: fmul float144  // FULL-NEXT: fmul float145  // FULL-NEXT: fmul float146  // FULL-NEXT: fmul float147  // FULL-NEXT: fsub float148  // FULL-NEXT: fadd float149 150  // BASIC: fmul float151  // BASIC-NEXT: fmul float152  // BASIC-NEXT: fmul float153  // BASIC-NEXT: fmul float154  // BASIC-NEXT: fsub float155  // BASIC-NEXT: fadd float156 157  // IMPRVD: fmul float158  // IMPRVD-NEXT: fmul float159  // IMPRVD-NEXT: fmul float160  // IMPRVD-NEXT: fmul float161  // IMPRVD-NEXT: fsub float162  // IMPRVD-NEXT: fadd float163 164  // PRMTD: fmul float165  // PRMTD-NEXT: fmul float166  // PRMTD-NEXT: fmul float167  // PRMTD-NEXT: fmul float168  // PRMTD-NEXT: fsub float169  // PRMTD-NEXT: fadd float170 171  return a * b;172}173_Complex float pragma_default_div(_Complex float a, _Complex float b) {174#pragma STDC CX_LIMITED_RANGE DEFAULT175  // LABEL: define {{.*}} @pragma_on_divx(176 177  // FULL: call {{.*}} @__divsc3178 179  // BASIC: fmul float180  // BASIC-NEXT: fmul float181  // BASIC-NEXT: fadd float182  // BASIC-NEXT: fmul float183  // BASIC-NEXT: fmul float184  // BASIC-NEXT: fadd float185  // BASIC-NEXT: fmul float186  // BASIC-NEXT: fmul float187  // BASIC-NEXT: fsub float188  // BASIC-NEXT: fdiv float189  // BASIC-NEXT: fdiv float190 191  // IMPRVD: call{{.*}}float @llvm.fabs.f32(float {{.*}})192  // IMPRVD-NEXT: call{{.*}}float @llvm.fabs.f32(float {{.*}})193  // IMPRVD-NEXT: fcmp{{.*}}ugt float {{.*}}, {{.*}}194  // IMPRVD-NEXT:   br i1 {{.*}}, label195  // IMPRVD:  abs_rhsr_greater_or_equal_abs_rhsi:196  // IMPRVD-NEXT: fdiv float197  // IMPRVD-NEXT: fmul float198  // IMPRVD-NEXT: fadd float199  // IMPRVD-NEXT: fmul float200  // IMPRVD-NEXT: fadd float201  // IMPRVD-NEXT: fdiv float202  // IMPRVD-NEXT: fmul float203  // IMPRVD-NEXT: fsub float204  // IMPRVD-NEXT: fdiv float205  // IMPRVD-NEXT: br label206  // IMPRVD: abs_rhsr_less_than_abs_rhsi:207  // IMPRVD-NEXT: fdiv float208  // IMPRVD-NEXT: fmul float209  // IMPRVD-NEXT: fadd float210  // IMPRVD-NEXT: fmul float211  // IMPRVD-NEXT: fadd float212  // IMPRVD-NEXT: fdiv float213  // IMPRVD-NEXT: fmul float214  // IMPRVD-NEXT: fsub float215  // IMPRVD-NEXT: fdiv float216 217  // PRMTD: load float, ptr {{.*}}218  // PRMTD: fpext float {{.*}} to double219  // PRMTD-NEXT: fpext float {{.*}} to double220  // PRMTD-NEXT: getelementptr inbounds nuw { float, float }, ptr {{.*}}, i32 0, i32 0221  // PRMTD-NEXT: load float, ptr {{.*}}222  // PRMTD-NEXT: getelementptr inbounds nuw { float, float }, ptr {{.*}}, i32 0, i32 1223  // PRMTD-NEXT: load float, ptr {{.*}}224  // PRMTD-NEXT: fpext float {{.*}} to double225  // PRMTD-NEXT: fpext float {{.*}} to double226  // PRMTD-NEXT: fmul double227  // PRMTD-NEXT: fmul double228  // PRMTD-NEXT: fadd double229  // PRMTD-NEXT: fmul double230  // PRMTD-NEXT: fmul double231  // PRMTD-NEXT: fadd double232  // PRMTD-NEXT: fmul double233  // PRMTD-NEXT: fmul double234  // PRMTD-NEXT: fsub double235  // PRMTD-NEXT: fdiv double236  // PRMTD-NEXT: fdiv double237  // PRMTD-NEXT: fptrunc double {{.*}} to float238  // PRMTD-NEXT: fptrunc double {{.*}} to float239 240  return a / b;241}242