mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 09:21:13 +00:00
Cleanup vector logical ops in AVX and add use int versions for simple
v2i64 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137919 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3f0e237760
commit
24b90e2287
@ -1613,21 +1613,22 @@ let neverHasSideEffects = 1, Pattern = []<dag>, isCommutable = 0 in
|
||||
///
|
||||
multiclass sse12_fp_packed_logical<bits<8> opc, string OpcodeStr,
|
||||
SDNode OpNode> {
|
||||
let Pattern = []<dag> in {
|
||||
defm V#NAME#PS : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedSingle,
|
||||
!strconcat(OpcodeStr, "ps"), f128mem,
|
||||
[(set VR128:$dst, (v2i64 (OpNode VR128:$src1, VR128:$src2)))],
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
|
||||
(memopv2i64 addr:$src2)))], 0>, VEX_4V;
|
||||
// In AVX no need to add a pattern for 128-bit logical rr ps, because they
|
||||
// are all promoted to v2i64, and the patterns are covered by the int
|
||||
// version. This is needed in SSE only, because v2i64 isn't supported on
|
||||
// SSE1, but only on SSE2.
|
||||
defm V#NAME#PS : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedSingle,
|
||||
!strconcat(OpcodeStr, "ps"), f128mem, [],
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v4f32 VR128:$src1)),
|
||||
(memopv2i64 addr:$src2)))], 0>, VEX_4V;
|
||||
|
||||
defm V#NAME#PD : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedDouble,
|
||||
!strconcat(OpcodeStr, "pd"), f128mem,
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
|
||||
(bc_v2i64 (v2f64 VR128:$src2))))],
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
|
||||
(memopv2i64 addr:$src2)))], 0>,
|
||||
OpSize, VEX_4V;
|
||||
}
|
||||
defm V#NAME#PD : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedDouble,
|
||||
!strconcat(OpcodeStr, "pd"), f128mem,
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
|
||||
(bc_v2i64 (v2f64 VR128:$src2))))],
|
||||
[(set VR128:$dst, (OpNode (bc_v2i64 (v2f64 VR128:$src1)),
|
||||
(memopv2i64 addr:$src2)))], 0>,
|
||||
OpSize, VEX_4V;
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
defm PS : sse12_fp_packed_logical_rm<opc, VR128, SSEPackedSingle,
|
||||
!strconcat(OpcodeStr, "ps"), f128mem,
|
||||
@ -2546,15 +2547,14 @@ let ExeDomain = SSEPackedInt in {
|
||||
def VPANDNrr : PDI<0xDF, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
|
||||
"vpandn\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
|
||||
VR128:$src2)))]>, VEX_4V;
|
||||
[(set VR128:$dst,
|
||||
(v2i64 (X86andnp VR128:$src1, VR128:$src2)))]>,VEX_4V;
|
||||
|
||||
def VPANDNrm : PDI<0xDF, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins VR128:$src1, i128mem:$src2),
|
||||
"vpandn\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst, (v2i64 (and (vnot VR128:$src1),
|
||||
(memopv2i64 addr:$src2))))]>,
|
||||
VEX_4V;
|
||||
[(set VR128:$dst, (X86andnp VR128:$src1,
|
||||
(memopv2i64 addr:$src2)))]>, VEX_4V;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,3 +159,21 @@ entry:
|
||||
%2 = bitcast <8 x i32> %and.i to <8 x float>
|
||||
ret <8 x float> %2
|
||||
}
|
||||
|
||||
;;; Test that basic 2 x i64 logic use the integer version on AVX
|
||||
|
||||
; CHECK: vpandn %xmm
|
||||
define <2 x i64> @vpandn(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
|
||||
entry:
|
||||
%y = xor <2 x i64> %a, <i64 -1, i64 -1>
|
||||
%x = and <2 x i64> %a, %y
|
||||
ret <2 x i64> %x
|
||||
}
|
||||
|
||||
; CHECK: vpand %xmm
|
||||
define <2 x i64> @vpand(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
|
||||
entry:
|
||||
%x = and <2 x i64> %a, %b
|
||||
ret <2 x i64> %x
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user