@@ -40,6 +40,33 @@ define double @fast_cabs(double %real, double %imag) {
4040 ret double %call
4141}
4242
43+ define double @cabs_zero_real (double %imag ) {
44+ ; CHECK-LABEL: @cabs_zero_real(
45+ ; CHECK-NEXT: [[CABS:%.*]] = tail call double @llvm.fabs.f64(double [[IMAG:%.*]])
46+ ; CHECK-NEXT: ret double [[CABS]]
47+ ;
48+ %call = tail call double @cabs (double 0 .0 , double %imag )
49+ ret double %call
50+ }
51+
52+ define double @fast_cabs_neg_zero_real (double %imag ) {
53+ ; CHECK-LABEL: @fast_cabs_neg_zero_real(
54+ ; CHECK-NEXT: [[CABS:%.*]] = tail call fast double @llvm.fabs.f64(double [[IMAG:%.*]])
55+ ; CHECK-NEXT: ret double [[CABS]]
56+ ;
57+ %call = tail call fast double @cabs (double -0 .0 , double %imag )
58+ ret double %call
59+ }
60+
61+ define double @cabs_zero_imag (double %real ) {
62+ ; CHECK-LABEL: @cabs_zero_imag(
63+ ; CHECK-NEXT: [[CABS:%.*]] = tail call double @llvm.fabs.f64(double [[REAL:%.*]])
64+ ; CHECK-NEXT: ret double [[CABS]]
65+ ;
66+ %call = tail call double @cabs (double %real , double 0 .0 )
67+ ret double %call
68+ }
69+
4370define float @fast_cabsf (float %real , float %imag ) {
4471; CHECK-LABEL: @fast_cabsf(
4572; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[REAL:%.*]], [[REAL]]
@@ -52,6 +79,33 @@ define float @fast_cabsf(float %real, float %imag) {
5279 ret float %call
5380}
5481
82+ define float @cabsf_zero_real (float %imag ) {
83+ ; CHECK-LABEL: @cabsf_zero_real(
84+ ; CHECK-NEXT: [[CABS:%.*]] = tail call float @llvm.fabs.f32(float [[IMAG:%.*]])
85+ ; CHECK-NEXT: ret float [[CABS]]
86+ ;
87+ %call = tail call float @cabsf (float 0 .0 , float %imag )
88+ ret float %call
89+ }
90+
91+ define float @fast_cabsf_neg_zero_real (float %imag ) {
92+ ; CHECK-LABEL: @fast_cabsf_neg_zero_real(
93+ ; CHECK-NEXT: [[CABS:%.*]] = tail call fast float @llvm.fabs.f32(float [[IMAG:%.*]])
94+ ; CHECK-NEXT: ret float [[CABS]]
95+ ;
96+ %call = tail call fast float @cabsf (float -0 .0 , float %imag )
97+ ret float %call
98+ }
99+
100+ define float @cabsf_zero_imag (float %real ) {
101+ ; CHECK-LABEL: @cabsf_zero_imag(
102+ ; CHECK-NEXT: [[CABS:%.*]] = tail call float @llvm.fabs.f32(float [[REAL:%.*]])
103+ ; CHECK-NEXT: ret float [[CABS]]
104+ ;
105+ %call = tail call float @cabsf (float %real , float 0 .0 )
106+ ret float %call
107+ }
108+
55109define fp128 @fast_cabsl (fp128 %real , fp128 %imag ) {
56110; CHECK-LABEL: @fast_cabsl(
57111; CHECK-NEXT: [[TMP1:%.*]] = fmul fast fp128 [[REAL:%.*]], [[REAL]]
@@ -64,6 +118,33 @@ define fp128 @fast_cabsl(fp128 %real, fp128 %imag) {
64118 ret fp128 %call
65119}
66120
121+ define fp128 @cabsl_zero_real (fp128 %imag ) {
122+ ; CHECK-LABEL: @cabsl_zero_real(
123+ ; CHECK-NEXT: [[CABS:%.*]] = tail call fp128 @llvm.fabs.f128(fp128 [[IMAG:%.*]])
124+ ; CHECK-NEXT: ret fp128 [[CABS]]
125+ ;
126+ %call = tail call fp128 @cabsl (fp128 0xL00000000000000000000000000000000, fp128 %imag )
127+ ret fp128 %call
128+ }
129+
130+ define fp128 @cabsl_zero_imag (fp128 %real ) {
131+ ; CHECK-LABEL: @cabsl_zero_imag(
132+ ; CHECK-NEXT: [[CABS:%.*]] = tail call fp128 @llvm.fabs.f128(fp128 [[REAL:%.*]])
133+ ; CHECK-NEXT: ret fp128 [[CABS]]
134+ ;
135+ %call = tail call fp128 @cabsl (fp128 %real , fp128 0xL00000000000000000000000000000000)
136+ ret fp128 %call
137+ }
138+
139+ define fp128 @fast_cabsl_neg_zero_imag (fp128 %real ) {
140+ ; CHECK-LABEL: @fast_cabsl_neg_zero_imag(
141+ ; CHECK-NEXT: [[CABS:%.*]] = tail call fast fp128 @llvm.fabs.f128(fp128 [[REAL:%.*]])
142+ ; CHECK-NEXT: ret fp128 [[CABS]]
143+ ;
144+ %call = tail call fast fp128 @cabsl (fp128 %real , fp128 0xL00000000000000008000000000000000)
145+ ret fp128 %call
146+ }
147+
67148declare double @cabs (double %real , double %imag )
68149declare float @cabsf (float %real , float %imag )
69150declare fp128 @cabsl (fp128 %real , fp128 %imag )
0 commit comments