@@ -23,6 +23,7 @@ declare double @llvm.exp10.f64(double)
2323declare double @llvm.ldexp.f64.i32 (double , i32 )
2424declare {double , i32 } @llvm.frexp.f64.i32 (double )
2525declare i32 @llvm.lround (double )
26+ declare {double , double } @llvm.modf.f64 (double )
2627
2728declare void @escape_value (i32 )
2829
@@ -203,38 +204,44 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
203204; CHECK-NEXT: # %bb.0:
204205; CHECK-NEXT: global.get $push12=, __stack_pointer
205206; 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
212213; CHECK-NEXT: call $push1=, cos, $pop0
213214; 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
218219; CHECK-NEXT: call $push5=, log, $pop4
219220; CHECK-NEXT: call $push6=, exp, $pop5
220221; CHECK-NEXT: call $push7=, exp10, $pop6
221222; CHECK-NEXT: call $push8=, cbrt, $pop7
222223; 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
229225; 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)
231232; 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
233240; CHECK-NEXT: i32.const $push14=, 16
234- ; CHECK-NEXT: i32.add $push15=, $pop27 , $pop14
241+ ; CHECK-NEXT: i32.add $push15=, $pop32 , $pop14
235242; 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
238245
239246
240247 %k = call double @llvm.tan.f64 (double %x )
@@ -251,8 +258,10 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
251258 %result = call {double , i32 } @llvm.frexp.f64.i32 (double %j )
252259 %result.0 = extractvalue { double , i32 } %result , 0
253260 %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
254263 call void @escape_value (i32 %result.1 )
255- ret double %result .0
264+ ret double %resultModf .0
256265}
257266
258267; fcmp ord and unord (RTLIB::O_F32 / RTLIB::UO_F32 etc) are a special case (see
0 commit comments