@@ -23,6 +23,7 @@ declare double @llvm.exp10.f64(double)
23
23
declare double @llvm.ldexp.f64.i32 (double , i32 )
24
24
declare {double , i32 } @llvm.frexp.f64.i32 (double )
25
25
declare i32 @llvm.lround (double )
26
+ declare {double , double } @llvm.modf.f64 (double )
26
27
27
28
declare void @escape_value (i32 )
28
29
@@ -203,38 +204,44 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
203
204
; CHECK-NEXT: # %bb.0:
204
205
; CHECK-NEXT: global.get $push12=, __stack_pointer
205
206
; CHECK-NEXT: i32.const $push13=, 16
206
- ; CHECK-NEXT: i32.sub $push19 =, $pop12, $pop13
207
- ; CHECK-NEXT: local.tee $push18 =, 3, $pop19
208
- ; CHECK-NEXT: global.set __stack_pointer, $pop18
209
- ; CHECK-NEXT: local.get $push23 =, 0
210
- ; CHECK-NEXT: local.get $push20 =, 0
211
- ; CHECK-NEXT: call $push0=, tan, $pop20
207
+ ; CHECK-NEXT: i32.sub $push21 =, $pop12, $pop13
208
+ ; CHECK-NEXT: local.tee $push20 =, 3, $pop21
209
+ ; CHECK-NEXT: global.set __stack_pointer, $pop20
210
+ ; CHECK-NEXT: local.get $push25 =, 0
211
+ ; CHECK-NEXT: local.get $push22 =, 0
212
+ ; CHECK-NEXT: call $push0=, tan, $pop22
212
213
; CHECK-NEXT: call $push1=, cos, $pop0
213
214
; CHECK-NEXT: call $push2=, log10, $pop1
214
- ; CHECK-NEXT: local.get $push21 =, 1
215
- ; CHECK-NEXT: call $push3=, pow, $pop2, $pop21
216
- ; CHECK-NEXT: local.get $push22 =, 2
217
- ; CHECK-NEXT: call $push4=, __powidf2, $pop3, $pop22
215
+ ; CHECK-NEXT: local.get $push23 =, 1
216
+ ; CHECK-NEXT: call $push3=, pow, $pop2, $pop23
217
+ ; CHECK-NEXT: local.get $push24 =, 2
218
+ ; CHECK-NEXT: call $push4=, __powidf2, $pop3, $pop24
218
219
; CHECK-NEXT: call $push5=, log, $pop4
219
220
; CHECK-NEXT: call $push6=, exp, $pop5
220
221
; CHECK-NEXT: call $push7=, exp10, $pop6
221
222
; CHECK-NEXT: call $push8=, cbrt, $pop7
222
223
; CHECK-NEXT: call $push9=, lround, $pop8
223
- ; CHECK-NEXT: call $push10=, ldexp, $pop23, $pop9
224
- ; CHECK-NEXT: local.get $push24=, 3
225
- ; CHECK-NEXT: i32.const $push16=, 12
226
- ; CHECK-NEXT: i32.add $push17=, $pop24, $pop16
227
- ; CHECK-NEXT: call $push25=, frexp, $pop10, $pop17
228
- ; CHECK-NEXT: local.set 0, $pop25
224
+ ; CHECK-NEXT: call $push10=, ldexp, $pop25, $pop9
229
225
; CHECK-NEXT: local.get $push26=, 3
230
- ; CHECK-NEXT: i32.load $push11=, 12($pop26)
226
+ ; CHECK-NEXT: i32.const $push18=, 4
227
+ ; CHECK-NEXT: i32.add $push19=, $pop26, $pop18
228
+ ; CHECK-NEXT: call $push27=, frexp, $pop10, $pop19
229
+ ; CHECK-NEXT: local.set 0, $pop27
230
+ ; CHECK-NEXT: local.get $push28=, 3
231
+ ; CHECK-NEXT: i32.load $push11=, 4($pop28)
231
232
; CHECK-NEXT: call escape_value, $pop11
232
- ; CHECK-NEXT: local.get $push27=, 3
233
+ ; CHECK-NEXT: local.get $push31=, 0
234
+ ; CHECK-NEXT: local.get $push29=, 3
235
+ ; CHECK-NEXT: i32.const $push16=, 8
236
+ ; CHECK-NEXT: i32.add $push17=, $pop29, $pop16
237
+ ; CHECK-NEXT: call $push30=, modf, $pop31, $pop17
238
+ ; CHECK-NEXT: local.set 0, $pop30
239
+ ; CHECK-NEXT: local.get $push32=, 3
233
240
; CHECK-NEXT: i32.const $push14=, 16
234
- ; CHECK-NEXT: i32.add $push15=, $pop27 , $pop14
241
+ ; CHECK-NEXT: i32.add $push15=, $pop32 , $pop14
235
242
; CHECK-NEXT: global.set __stack_pointer, $pop15
236
- ; CHECK-NEXT: local.get $push28 =, 0
237
- ; CHECK-NEXT: return $pop28
243
+ ; CHECK-NEXT: local.get $push33 =, 0
244
+ ; CHECK-NEXT: return $pop33
238
245
239
246
240
247
%k = call double @llvm.tan.f64 (double %x )
@@ -251,8 +258,10 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
251
258
%result = call {double , i32 } @llvm.frexp.f64.i32 (double %j )
252
259
%result.0 = extractvalue { double , i32 } %result , 0
253
260
%result.1 = extractvalue { double , i32 } %result , 1
261
+ %resultModf = call {double , double } @llvm.modf.f64 (double %result.0 )
262
+ %resultModf.0 = extractvalue { double , double } %resultModf , 0
254
263
call void @escape_value (i32 %result.1 )
255
- ret double %result .0
264
+ ret double %resultModf .0
256
265
}
257
266
258
267
; fcmp ord and unord (RTLIB::O_F32 / RTLIB::UO_F32 etc) are a special case (see
0 commit comments