65 lines · plain
1; RUN: llc < %s | FileCheck %s2 3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"4target triple = "x86_64--"5 6; CHECK-LABEL: double_rounding_safe:7; CHECK: callq __trunctfdf28; CHECK-NEXT: cvtsd2ss %xmm09define void @double_rounding_safe(ptr %x, ptr %f) {10entry:11 %x.fp128 = load fp128, ptr %x, align 1612 %x.double = fptrunc fp128 %x.fp128 to double13 %x.float = fptrunc double %x.double to float14 store float %x.float, ptr %f, align 415 ret void16}17 18; CHECK-LABEL: double_rounding_contract_fst:19; CHECK: callq __trunctfdf220; CHECK-NEXT: cvtsd2ss %xmm021define void @double_rounding_contract_fst(ptr %x, ptr %f) {22entry:23 %x.fp128 = load fp128, ptr %x, align 1624 %x.double = fptrunc contract fp128 %x.fp128 to double25 %x.float = fptrunc double %x.double to float26 store float %x.float, ptr %f, align 427 ret void28}29 30; CHECK-LABEL: double_rounding_contract_snd:31; CHECK: callq __trunctfdf232; CHECK-NEXT: cvtsd2ss %xmm033define void @double_rounding_contract_snd(ptr %x, ptr %f) {34entry:35 %x.fp128 = load fp128, ptr %x, align 1636 %x.double = fptrunc fp128 %x.fp128 to double37 %x.float = fptrunc contract double %x.double to float38 store float %x.float, ptr %f, align 439 ret void40}41 42; CHECK-LABEL: double_rounding:43; CHECK: callq __trunctfsf244; CHECK-NOT: cvt45define void @double_rounding(ptr %x, ptr %f) {46entry:47 %x.fp128 = load fp128, ptr %x, align 1648 %x.double = fptrunc contract fp128 %x.fp128 to double49 %x.float = fptrunc contract double %x.double to float50 store float %x.float, ptr %f, align 451 ret void52}53 54; CHECK-LABEL: double_rounding_precise_first:55; CHECK: fstps (%56; CHECK-NOT: fstpl57define void @double_rounding_precise_first(ptr %f) {58entry:59 ; Hack, to generate a precise FP_ROUND to double60 %precise = call double asm sideeffect "fld %st(0)", "={st(0)}"()61 %0 = fptrunc double %precise to float62 store float %0, ptr %f, align 463 ret void64}65