Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/AArch64/complex-arithmetic-f16-mul.ll
Show All 29 Lines | entry: | ||||
%5 = fsub fast <1 x half> %3, %4 | %5 = fsub fast <1 x half> %3, %4 | ||||
%interleaved.vec = shufflevector <1 x half> %5, <1 x half> %2, <2 x i32> <i32 0, i32 1> | %interleaved.vec = shufflevector <1 x half> %5, <1 x half> %2, <2 x i32> <i32 0, i32 1> | ||||
ret <2 x half> %interleaved.vec | ret <2 x half> %interleaved.vec | ||||
} | } | ||||
define <4 x half> @complex_mul_v4f16(<4 x half> %a, <4 x half> %b) { | define <4 x half> @complex_mul_v4f16(<4 x half> %a, <4 x half> %b) { | ||||
; CHECK-LABEL: complex_mul_v4f16: | ; CHECK-LABEL: complex_mul_v4f16: | ||||
; CHECK: // %bb.0: // %entry | ; CHECK: // %bb.0: // %entry | ||||
; CHECK-NEXT: uzp2 v2.4h, v0.4h, v0.4h | ; CHECK-NEXT: movi d2, #0000000000000000 | ||||
; CHECK-NEXT: uzp2 v3.4h, v1.4h, v0.4h | ; CHECK-NEXT: fcmla v2.4h, v0.4h, v1.4h, #0 | ||||
; CHECK-NEXT: uzp1 v0.4h, v0.4h, v0.4h | ; CHECK-NEXT: fcmla v2.4h, v0.4h, v1.4h, #90 | ||||
; CHECK-NEXT: fmul v4.4h, v2.4h, v3.4h | ; CHECK-NEXT: fmov d0, d2 | ||||
; CHECK-NEXT: uzp1 v1.4h, v1.4h, v0.4h | |||||
; CHECK-NEXT: fmul v3.4h, v3.4h, v0.4h | |||||
; CHECK-NEXT: fneg v4.4h, v4.4h | |||||
; CHECK-NEXT: fmla v3.4h, v2.4h, v1.4h | |||||
; CHECK-NEXT: fmla v4.4h, v0.4h, v1.4h | |||||
; CHECK-NEXT: zip1 v0.4h, v4.4h, v3.4h | |||||
; CHECK-NEXT: ret | ; CHECK-NEXT: ret | ||||
entry: | entry: | ||||
%a.real = shufflevector <4 x half> %a, <4 x half> poison, <2 x i32> <i32 0, i32 2> | %a.real = shufflevector <4 x half> %a, <4 x half> poison, <2 x i32> <i32 0, i32 2> | ||||
%a.imag = shufflevector <4 x half> %a, <4 x half> poison, <2 x i32> <i32 1, i32 3> | %a.imag = shufflevector <4 x half> %a, <4 x half> poison, <2 x i32> <i32 1, i32 3> | ||||
%b.real = shufflevector <4 x half> %b, <4 x half> poison, <2 x i32> <i32 0, i32 2> | %b.real = shufflevector <4 x half> %b, <4 x half> poison, <2 x i32> <i32 0, i32 2> | ||||
%b.imag = shufflevector <4 x half> %b, <4 x half> poison, <2 x i32> <i32 1, i32 3> | %b.imag = shufflevector <4 x half> %b, <4 x half> poison, <2 x i32> <i32 1, i32 3> | ||||
%0 = fmul fast <2 x half> %b.imag, %a.real | %0 = fmul fast <2 x half> %b.imag, %a.real | ||||
%1 = fmul fast <2 x half> %b.real, %a.imag | %1 = fmul fast <2 x half> %b.real, %a.imag | ||||
%2 = fadd fast <2 x half> %1, %0 | %2 = fadd fast <2 x half> %1, %0 | ||||
%3 = fmul fast <2 x half> %b.real, %a.real | %3 = fmul fast <2 x half> %b.real, %a.real | ||||
%4 = fmul fast <2 x half> %a.imag, %b.imag | %4 = fmul fast <2 x half> %a.imag, %b.imag | ||||
%5 = fsub fast <2 x half> %3, %4 | %5 = fsub fast <2 x half> %3, %4 | ||||
%interleaved.vec = shufflevector <2 x half> %5, <2 x half> %2, <4 x i32> <i32 0, i32 2, i32 1, i32 3> | %interleaved.vec = shufflevector <2 x half> %5, <2 x half> %2, <4 x i32> <i32 0, i32 2, i32 1, i32 3> | ||||
ret <4 x half> %interleaved.vec | ret <4 x half> %interleaved.vec | ||||
} | } | ||||
define <8 x half> @complex_mul_v8f16(<8 x half> %a, <8 x half> %b) { | define <8 x half> @complex_mul_v8f16(<8 x half> %a, <8 x half> %b) { | ||||
; CHECK-LABEL: complex_mul_v8f16: | ; CHECK-LABEL: complex_mul_v8f16: | ||||
; CHECK: // %bb.0: // %entry | ; CHECK: // %bb.0: // %entry | ||||
; CHECK-NEXT: ext v2.16b, v0.16b, v0.16b, #8 | ; CHECK-NEXT: movi v2.2d, #0000000000000000 | ||||
; CHECK-NEXT: ext v3.16b, v1.16b, v1.16b, #8 | ; CHECK-NEXT: fcmla v2.8h, v0.8h, v1.8h, #0 | ||||
; CHECK-NEXT: uzp2 v4.4h, v0.4h, v2.4h | ; CHECK-NEXT: fcmla v2.8h, v0.8h, v1.8h, #90 | ||||
; CHECK-NEXT: uzp1 v0.4h, v0.4h, v2.4h | ; CHECK-NEXT: mov v0.16b, v2.16b | ||||
; CHECK-NEXT: uzp2 v5.4h, v1.4h, v3.4h | |||||
; CHECK-NEXT: uzp1 v1.4h, v1.4h, v3.4h | |||||
; CHECK-NEXT: fmul v2.4h, v4.4h, v5.4h | |||||
; CHECK-NEXT: fmul v3.4h, v5.4h, v0.4h | |||||
; CHECK-NEXT: fneg v2.4h, v2.4h | |||||
; CHECK-NEXT: fmla v3.4h, v4.4h, v1.4h | |||||
; CHECK-NEXT: fmla v2.4h, v0.4h, v1.4h | |||||
; CHECK-NEXT: zip2 v1.4h, v2.4h, v3.4h | |||||
; CHECK-NEXT: zip1 v0.4h, v2.4h, v3.4h | |||||
; CHECK-NEXT: mov v0.d[1], v1.d[0] | |||||
; CHECK-NEXT: ret | ; CHECK-NEXT: ret | ||||
entry: | entry: | ||||
%a.real = shufflevector <8 x half> %a, <8 x half> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> | %a.real = shufflevector <8 x half> %a, <8 x half> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> | ||||
%a.imag = shufflevector <8 x half> %a, <8 x half> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> | %a.imag = shufflevector <8 x half> %a, <8 x half> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> | ||||
%b.real = shufflevector <8 x half> %b, <8 x half> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> | %b.real = shufflevector <8 x half> %b, <8 x half> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> | ||||
%b.imag = shufflevector <8 x half> %b, <8 x half> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> | %b.imag = shufflevector <8 x half> %b, <8 x half> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> | ||||
%0 = fmul fast <4 x half> %b.imag, %a.real | %0 = fmul fast <4 x half> %b.imag, %a.real | ||||
%1 = fmul fast <4 x half> %b.real, %a.imag | %1 = fmul fast <4 x half> %b.real, %a.imag | ||||
%2 = fadd fast <4 x half> %1, %0 | %2 = fadd fast <4 x half> %1, %0 | ||||
%3 = fmul fast <4 x half> %b.real, %a.real | %3 = fmul fast <4 x half> %b.real, %a.real | ||||
%4 = fmul fast <4 x half> %a.imag, %b.imag | %4 = fmul fast <4 x half> %a.imag, %b.imag | ||||
%5 = fsub fast <4 x half> %3, %4 | %5 = fsub fast <4 x half> %3, %4 | ||||
%interleaved.vec = shufflevector <4 x half> %5, <4 x half> %2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7> | %interleaved.vec = shufflevector <4 x half> %5, <4 x half> %2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7> | ||||
ret <8 x half> %interleaved.vec | ret <8 x half> %interleaved.vec | ||||
} | } | ||||
define <16 x half> @complex_mul_v16f16(<16 x half> %a, <16 x half> %b) { | define <16 x half> @complex_mul_v16f16(<16 x half> %a, <16 x half> %b) { | ||||
; CHECK-LABEL: complex_mul_v16f16: | ; CHECK-LABEL: complex_mul_v16f16: | ||||
; CHECK: // %bb.0: // %entry | ; CHECK: // %bb.0: // %entry | ||||
; CHECK-NEXT: uzp2 v4.8h, v2.8h, v3.8h | ; CHECK-NEXT: movi v4.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp2 v5.8h, v0.8h, v1.8h | ; CHECK-NEXT: movi v5.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h | ; CHECK-NEXT: fcmla v4.8h, v0.8h, v2.8h, #0 | ||||
; CHECK-NEXT: uzp1 v2.8h, v2.8h, v3.8h | ; CHECK-NEXT: fcmla v5.8h, v1.8h, v3.8h, #0 | ||||
; CHECK-NEXT: fmul v1.8h, v5.8h, v4.8h | ; CHECK-NEXT: fcmla v4.8h, v0.8h, v2.8h, #90 | ||||
; CHECK-NEXT: fmul v3.8h, v4.8h, v0.8h | ; CHECK-NEXT: fcmla v5.8h, v1.8h, v3.8h, #90 | ||||
; CHECK-NEXT: fneg v1.8h, v1.8h | ; CHECK-NEXT: mov v0.16b, v4.16b | ||||
; CHECK-NEXT: fmla v3.8h, v5.8h, v2.8h | ; CHECK-NEXT: mov v1.16b, v5.16b | ||||
; CHECK-NEXT: fmla v1.8h, v0.8h, v2.8h | |||||
; CHECK-NEXT: zip1 v0.8h, v1.8h, v3.8h | |||||
; CHECK-NEXT: zip2 v1.8h, v1.8h, v3.8h | |||||
; CHECK-NEXT: ret | ; CHECK-NEXT: ret | ||||
entry: | entry: | ||||
%a.real = shufflevector <16 x half> %a, <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | %a.real = shufflevector <16 x half> %a, <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | ||||
%a.imag = shufflevector <16 x half> %a, <16 x half> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | %a.imag = shufflevector <16 x half> %a, <16 x half> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | ||||
%b.real = shufflevector <16 x half> %b, <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | %b.real = shufflevector <16 x half> %b, <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | ||||
%b.imag = shufflevector <16 x half> %b, <16 x half> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | %b.imag = shufflevector <16 x half> %b, <16 x half> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | ||||
%0 = fmul fast <8 x half> %b.imag, %a.real | %0 = fmul fast <8 x half> %b.imag, %a.real | ||||
%1 = fmul fast <8 x half> %b.real, %a.imag | %1 = fmul fast <8 x half> %b.real, %a.imag | ||||
%2 = fadd fast <8 x half> %1, %0 | %2 = fadd fast <8 x half> %1, %0 | ||||
%3 = fmul fast <8 x half> %b.real, %a.real | %3 = fmul fast <8 x half> %b.real, %a.real | ||||
%4 = fmul fast <8 x half> %a.imag, %b.imag | %4 = fmul fast <8 x half> %a.imag, %b.imag | ||||
%5 = fsub fast <8 x half> %3, %4 | %5 = fsub fast <8 x half> %3, %4 | ||||
%interleaved.vec = shufflevector <8 x half> %5, <8 x half> %2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> | %interleaved.vec = shufflevector <8 x half> %5, <8 x half> %2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> | ||||
ret <16 x half> %interleaved.vec | ret <16 x half> %interleaved.vec | ||||
} | } | ||||
define <32 x half> @complex_mul_v32f16(<32 x half> %a, <32 x half> %b) { | define <32 x half> @complex_mul_v32f16(<32 x half> %a, <32 x half> %b) { | ||||
; CHECK-LABEL: complex_mul_v32f16: | ; CHECK-LABEL: complex_mul_v32f16: | ||||
; CHECK: // %bb.0: // %entry | ; CHECK: // %bb.0: // %entry | ||||
; CHECK-NEXT: uzp2 v16.8h, v4.8h, v5.8h | ; CHECK-NEXT: movi v16.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp1 v17.8h, v2.8h, v3.8h | ; CHECK-NEXT: movi v17.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp1 v18.8h, v0.8h, v1.8h | ; CHECK-NEXT: movi v18.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp2 v0.8h, v0.8h, v1.8h | ; CHECK-NEXT: movi v19.2d, #0000000000000000 | ||||
; CHECK-NEXT: uzp2 v1.8h, v2.8h, v3.8h | ; CHECK-NEXT: fcmla v16.8h, v0.8h, v4.8h, #0 | ||||
; CHECK-NEXT: uzp2 v2.8h, v6.8h, v7.8h | ; CHECK-NEXT: fcmla v17.8h, v1.8h, v5.8h, #0 | ||||
; CHECK-NEXT: uzp1 v3.8h, v4.8h, v5.8h | ; CHECK-NEXT: fcmla v18.8h, v2.8h, v6.8h, #0 | ||||
; CHECK-NEXT: fmul v4.8h, v0.8h, v16.8h | ; CHECK-NEXT: fcmla v19.8h, v3.8h, v7.8h, #0 | ||||
; CHECK-NEXT: uzp1 v5.8h, v6.8h, v7.8h | ; CHECK-NEXT: fcmla v16.8h, v0.8h, v4.8h, #90 | ||||
; CHECK-NEXT: fmul v6.8h, v1.8h, v2.8h | ; CHECK-NEXT: fcmla v17.8h, v1.8h, v5.8h, #90 | ||||
; CHECK-NEXT: fmul v7.8h, v16.8h, v18.8h | ; CHECK-NEXT: fcmla v18.8h, v2.8h, v6.8h, #90 | ||||
; CHECK-NEXT: fneg v4.8h, v4.8h | ; CHECK-NEXT: fcmla v19.8h, v3.8h, v7.8h, #90 | ||||
; CHECK-NEXT: fmul v16.8h, v2.8h, v17.8h | ; CHECK-NEXT: mov v0.16b, v16.16b | ||||
; CHECK-NEXT: fneg v6.8h, v6.8h | ; CHECK-NEXT: mov v1.16b, v17.16b | ||||
; CHECK-NEXT: fmla v7.8h, v0.8h, v3.8h | ; CHECK-NEXT: mov v2.16b, v18.16b | ||||
; CHECK-NEXT: fmla v4.8h, v18.8h, v3.8h | ; CHECK-NEXT: mov v3.16b, v19.16b | ||||
; CHECK-NEXT: fmla v16.8h, v1.8h, v5.8h | |||||
; CHECK-NEXT: fmla v6.8h, v17.8h, v5.8h | |||||
; CHECK-NEXT: zip1 v0.8h, v4.8h, v7.8h | |||||
; CHECK-NEXT: zip2 v1.8h, v4.8h, v7.8h | |||||
; CHECK-NEXT: zip1 v2.8h, v6.8h, v16.8h | |||||
; CHECK-NEXT: zip2 v3.8h, v6.8h, v16.8h | |||||
; CHECK-NEXT: ret | ; CHECK-NEXT: ret | ||||
entry: | entry: | ||||
%a.real = shufflevector <32 x half> %a, <32 x half> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30> | %a.real = shufflevector <32 x half> %a, <32 x half> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30> | ||||
%a.imag = shufflevector <32 x half> %a, <32 x half> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31> | %a.imag = shufflevector <32 x half> %a, <32 x half> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31> | ||||
%b.real = shufflevector <32 x half> %b, <32 x half> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30> | %b.real = shufflevector <32 x half> %b, <32 x half> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30> | ||||
%b.imag = shufflevector <32 x half> %b, <32 x half> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31> | %b.imag = shufflevector <32 x half> %b, <32 x half> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31> | ||||
%0 = fmul fast <16 x half> %b.imag, %a.real | %0 = fmul fast <16 x half> %b.imag, %a.real | ||||
%1 = fmul fast <16 x half> %b.real, %a.imag | %1 = fmul fast <16 x half> %b.real, %a.imag | ||||
%2 = fadd fast <16 x half> %1, %0 | %2 = fadd fast <16 x half> %1, %0 | ||||
%3 = fmul fast <16 x half> %b.real, %a.real | %3 = fmul fast <16 x half> %b.real, %a.real | ||||
%4 = fmul fast <16 x half> %a.imag, %b.imag | %4 = fmul fast <16 x half> %a.imag, %b.imag | ||||
%5 = fsub fast <16 x half> %3, %4 | %5 = fsub fast <16 x half> %3, %4 | ||||
%interleaved.vec = shufflevector <16 x half> %5, <16 x half> %2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31> | %interleaved.vec = shufflevector <16 x half> %5, <16 x half> %2, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31> | ||||
ret <32 x half> %interleaved.vec | ret <32 x half> %interleaved.vec | ||||
} | } |