brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · b9713b5 Raw
170 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64 | FileCheck %s3; RUN: llc < %s -mtriple=aarch64 -mattr=-neon | FileCheck -check-prefix=CHECK-NONEON %s4; Check that selection dag legalization of fcopysign works in cases with5; different modes for the arguments.6 7declare fp128 @llvm.copysign.f128(fp128, fp128)8declare float @llvm.copysign.f32(float %a, float %b)9declare double @llvm.copysign.f64(double %a, double %b)10declare half @llvm.copysign.f16(half %a, half %b)11 12@val_float = dso_local global float zeroinitializer, align 413@val_double = dso_local global double zeroinitializer, align 814@val_fp128 = dso_local global fp128 zeroinitializer, align 1615 16define fp128 @copysign0() {17; CHECK-LABEL: copysign0:18; CHECK:       // %bb.0: // %entry19; CHECK-NEXT:    adrp x8, .LCPI0_020; CHECK-NEXT:    ldr q0, [x8, :lo12:.LCPI0_0]21; CHECK-NEXT:    adrp x8, val_double22; CHECK-NEXT:    str q0, [sp, #-16]!23; CHECK-NEXT:    .cfi_def_cfa_offset 1624; CHECK-NEXT:    ldr x8, [x8, :lo12:val_double]25; CHECK-NEXT:    ldrb w9, [sp, #15]26; CHECK-NEXT:    and x8, x8, #0x800000000000000027; CHECK-NEXT:    lsr x8, x8, #5628; CHECK-NEXT:    bfxil w8, w9, #0, #729; CHECK-NEXT:    strb w8, [sp, #15]30; CHECK-NEXT:    ldr q0, [sp], #1631; CHECK-NEXT:    ret32;33; CHECK-NONEON-LABEL: copysign0:34; CHECK-NONEON:       // %bb.0: // %entry35; CHECK-NONEON-NEXT:    adrp x8, .LCPI0_036; CHECK-NONEON-NEXT:    ldr q0, [x8, :lo12:.LCPI0_0]37; CHECK-NONEON-NEXT:    adrp x8, val_double38; CHECK-NONEON-NEXT:    str q0, [sp, #-16]!39; CHECK-NONEON-NEXT:    .cfi_def_cfa_offset 1640; CHECK-NONEON-NEXT:    ldr x8, [x8, :lo12:val_double]41; CHECK-NONEON-NEXT:    ldrb w9, [sp, #15]42; CHECK-NONEON-NEXT:    and x8, x8, #0x800000000000000043; CHECK-NONEON-NEXT:    lsr x8, x8, #5644; CHECK-NONEON-NEXT:    bfxil w8, w9, #0, #745; CHECK-NONEON-NEXT:    strb w8, [sp, #15]46; CHECK-NONEON-NEXT:    ldr q0, [sp], #1647; CHECK-NONEON-NEXT:    ret48entry:49  %v = load double, ptr @val_double, align 850  %conv = fpext double %v to fp12851  %call = tail call fp128 @llvm.copysign.f128(fp128 0xL00000000000000007FFF000000000000, fp128 %conv) #252  ret fp128 %call53}54 55define fp128@copysign1() {56; CHECK-LABEL: copysign1:57; CHECK:       // %bb.0: // %entry58; CHECK-NEXT:    adrp x8, val_fp12859; CHECK-NEXT:    ldr q0, [x8, :lo12:val_fp128]60; CHECK-NEXT:    adrp x8, val_float61; CHECK-NEXT:    str q0, [sp, #-16]!62; CHECK-NEXT:    .cfi_def_cfa_offset 1663; CHECK-NEXT:    ldr w8, [x8, :lo12:val_float]64; CHECK-NEXT:    ldrb w9, [sp, #15]65; CHECK-NEXT:    and w8, w8, #0x8000000066; CHECK-NEXT:    and w9, w9, #0x7f67; CHECK-NEXT:    orr w8, w9, w8, lsr #2468; CHECK-NEXT:    strb w8, [sp, #15]69; CHECK-NEXT:    ldr q0, [sp], #1670; CHECK-NEXT:    ret71;72; CHECK-NONEON-LABEL: copysign1:73; CHECK-NONEON:       // %bb.0: // %entry74; CHECK-NONEON-NEXT:    adrp x8, val_fp12875; CHECK-NONEON-NEXT:    ldr q0, [x8, :lo12:val_fp128]76; CHECK-NONEON-NEXT:    adrp x8, val_float77; CHECK-NONEON-NEXT:    str q0, [sp, #-16]!78; CHECK-NONEON-NEXT:    .cfi_def_cfa_offset 1679; CHECK-NONEON-NEXT:    ldr w8, [x8, :lo12:val_float]80; CHECK-NONEON-NEXT:    ldrb w9, [sp, #15]81; CHECK-NONEON-NEXT:    and w8, w8, #0x8000000082; CHECK-NONEON-NEXT:    and w9, w9, #0x7f83; CHECK-NONEON-NEXT:    orr w8, w9, w8, lsr #2484; CHECK-NONEON-NEXT:    strb w8, [sp, #15]85; CHECK-NONEON-NEXT:    ldr q0, [sp], #1686; CHECK-NONEON-NEXT:    ret87entry:88  %v0 = load fp128, ptr @val_fp128, align 1689  %v1 = load float, ptr @val_float, align 490  %conv = fpext float %v1 to fp12891  %call = tail call fp128 @llvm.copysign.f128(fp128 %v0, fp128 %conv)92  ret fp128 %call93}94 95define float @copysign32(float %a, float %b) {96; CHECK-LABEL: copysign32:97; CHECK:       // %bb.0: // %entry98; CHECK-NEXT:    mvni v2.4s, #128, lsl #2499; CHECK-NEXT:    // kill: def $s0 killed $s0 def $q0100; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1101; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b102; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0103; CHECK-NEXT:    ret104;105; CHECK-NONEON-LABEL: copysign32:106; CHECK-NONEON:       // %bb.0: // %entry107; CHECK-NONEON-NEXT:    fabs s0, s0108; CHECK-NONEON-NEXT:    fmov w8, s1109; CHECK-NONEON-NEXT:    tst w8, #0x80000000110; CHECK-NONEON-NEXT:    fneg s2, s0111; CHECK-NONEON-NEXT:    fcsel s0, s2, s0, ne112; CHECK-NONEON-NEXT:    ret113entry:114  %c = call float @llvm.copysign.f32(float %a, float %b)115  ret float %c116}117 118define double @copysign64(double %a, double %b) {119; CHECK-LABEL: copysign64:120; CHECK:       // %bb.0: // %entry121; CHECK-NEXT:    movi v2.2d, #0xffffffffffffffff122; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0123; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1124; CHECK-NEXT:    fneg v2.2d, v2.2d125; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b126; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0127; CHECK-NEXT:    ret128;129; CHECK-NONEON-LABEL: copysign64:130; CHECK-NONEON:       // %bb.0: // %entry131; CHECK-NONEON-NEXT:    fabs d0, d0132; CHECK-NONEON-NEXT:    fmov x8, d1133; CHECK-NONEON-NEXT:    tst x8, #0x8000000000000000134; CHECK-NONEON-NEXT:    fneg d2, d0135; CHECK-NONEON-NEXT:    fcsel d0, d2, d0, ne136; CHECK-NONEON-NEXT:    ret137entry:138  %c = call double @llvm.copysign.f64(double %a, double %b)139  ret double %c140}141 142define half @copysign16(half %a, half %b) {143; CHECK-LABEL: copysign16:144; CHECK:       // %bb.0: // %entry145; CHECK-NEXT:    fcvt s1, h1146; CHECK-NEXT:    fcvt s0, h0147; CHECK-NEXT:    mvni v2.4s, #128, lsl #24148; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b149; CHECK-NEXT:    fcvt h0, s0150; CHECK-NEXT:    ret151;152; CHECK-NONEON-LABEL: copysign16:153; CHECK-NONEON:       // %bb.0: // %entry154; CHECK-NONEON-NEXT:    sub sp, sp, #16155; CHECK-NONEON-NEXT:    .cfi_def_cfa_offset 16156; CHECK-NONEON-NEXT:    fcvt s0, h0157; CHECK-NONEON-NEXT:    str h1, [sp, #12]158; CHECK-NONEON-NEXT:    ldrb w8, [sp, #13]159; CHECK-NONEON-NEXT:    tst w8, #0x80160; CHECK-NONEON-NEXT:    fabs s0, s0161; CHECK-NONEON-NEXT:    fneg s1, s0162; CHECK-NONEON-NEXT:    fcsel s0, s1, s0, ne163; CHECK-NONEON-NEXT:    fcvt h0, s0164; CHECK-NONEON-NEXT:    add sp, sp, #16165; CHECK-NONEON-NEXT:    ret166entry:167  %c = call half @llvm.copysign.f16(half %a, half %b)168  ret half %c169}170