1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple aarch64-apple-darwin -asm-verbose=false -disable-post-ra | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker;============ v1f32 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; WidenVecRes same 8*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test_copysign_v1f32_v1f32(<1 x float> %a, <1 x float> %b) #0 { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f32_v1f32: 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2s v2, #128, lsl #24 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.8b v0, v1, v2 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 13*9880d681SAndroid Build Coastguard Worker %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b) 14*9880d681SAndroid Build Coastguard Worker ret <1 x float> %r 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; WidenVecRes mismatched 18*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test_copysign_v1f32_v1f64(<1 x float> %a, <1 x double> %b) #0 { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f32_v1f64: 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, d1 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 24*9880d681SAndroid Build Coastguard Worker %tmp0 = fptrunc <1 x double> %b to <1 x float> 25*9880d681SAndroid Build Coastguard Worker %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %tmp0) 26*9880d681SAndroid Build Coastguard Worker ret <1 x float> %r 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdeclare <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b) #0 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker;============ v1f64 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; WidenVecOp #1 34*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_copysign_v1f64_v1f32(<1 x double> %a, <1 x float> %b) #0 { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f64_v1f32: 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d1, s1 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v2, #0000000000000000 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v2, v2 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 41*9880d681SAndroid Build Coastguard Worker %tmp0 = fpext <1 x float> %b to <1 x double> 42*9880d681SAndroid Build Coastguard Worker %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %tmp0) 43*9880d681SAndroid Build Coastguard Worker ret <1 x double> %r 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_copysign_v1f64_v1f64(<1 x double> %a, <1 x double> %b) #0 { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f64_v1f64: 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v2, #0000000000000000 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v2, v2 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 52*9880d681SAndroid Build Coastguard Worker %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b) 53*9880d681SAndroid Build Coastguard Worker ret <1 x double> %r 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdeclare <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b) #0 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker;============ v2f32 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_copysign_v2f32_v2f32(<2 x float> %a, <2 x float> %b) #0 { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f32_v2f32: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2s v2, #128, lsl #24 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.8b v0, v1, v2 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 65*9880d681SAndroid Build Coastguard Worker %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b) 66*9880d681SAndroid Build Coastguard Worker ret <2 x float> %r 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_copysign_v2f32_v2f64(<2 x float> %a, <2 x double> %b) #0 { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f32_v2f64: 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtn v1.2s, v1.2d 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2s v2, #128, lsl #24 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.8b v0, v1, v2 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 75*9880d681SAndroid Build Coastguard Worker %tmp0 = fptrunc <2 x double> %b to <2 x float> 76*9880d681SAndroid Build Coastguard Worker %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %tmp0) 77*9880d681SAndroid Build Coastguard Worker ret <2 x float> %r 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b) #0 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker;============ v4f32 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_copysign_v4f32_v4f32(<4 x float> %a, <4 x float> %b) #0 { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f32_v4f32: 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 89*9880d681SAndroid Build Coastguard Worker %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b) 90*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; SplitVecOp #1 94*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_copysign_v4f32_v4f64(<4 x float> %a, <4 x double> %b) #0 { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f32_v4f64: 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov s3, v0[1] 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v4, #128, lsl #24 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s5, d1 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov s6, v0[2] 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov s7, v0[3] 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v5, v4 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s5, d2 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v6, v5, v4 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov d1, v1[1] 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, d1 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v3, v1, v4 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov d1, v2[1] 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, d1 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v3[0] 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[2], v6[0] 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v7, v1, v4 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v7[0] 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 114*9880d681SAndroid Build Coastguard Worker %tmp0 = fptrunc <4 x double> %b to <4 x float> 115*9880d681SAndroid Build Coastguard Worker %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %tmp0) 116*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b) #0 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker;============ v2f64 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_copysign_v2f64_v232(<2 x double> %a, <2 x float> %b) #0 { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f64_v232: 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v2, #0000000000000000 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v2, v2 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtl v1.2d, v1.2s 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 130*9880d681SAndroid Build Coastguard Worker %tmp0 = fpext <2 x float> %b to <2 x double> 131*9880d681SAndroid Build Coastguard Worker %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %tmp0) 132*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_copysign_v2f64_v2f64(<2 x double> %a, <2 x double> %b) #0 { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f64_v2f64: 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v2, #0000000000000000 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v2, v2 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 141*9880d681SAndroid Build Coastguard Worker %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b) 142*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b) #0 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker;============ v4f64 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; SplitVecRes mismatched 150*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test_copysign_v4f64_v4f32(<4 x double> %a, <4 x float> %b) #0 { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f64_v4f32: 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v3, #0000000000000000 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtl2 v4.2d, v2.4s 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtl v2.2d, v2.2s 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v3, v3 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v1, v4, v3 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v2, v3 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 159*9880d681SAndroid Build Coastguard Worker %tmp0 = fpext <4 x float> %b to <4 x double> 160*9880d681SAndroid Build Coastguard Worker %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %tmp0) 161*9880d681SAndroid Build Coastguard Worker ret <4 x double> %r 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; SplitVecRes same 165*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test_copysign_v4f64_v4f64(<4 x double> %a, <4 x double> %b) #0 { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f64_v4f64: 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d v4, #0000000000000000 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg.2d v4, v4 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v2, v4 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v1, v3, v4 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 172*9880d681SAndroid Build Coastguard Worker %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b) 173*9880d681SAndroid Build Coastguard Worker ret <4 x double> %r 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b) #0 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 179