;; SSE5 permute instructions
(define_insn "sse5_pperm"
[(set (match_operand:V16QI 0 "register_operand" "=x,x,x,x")
- (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "0,0,xm,xm")
- (match_operand:V16QI 2 "nonimmediate_operand" "x,xm,0,x")
- (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0")]
+ (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "0,0,x,xm")
+ (match_operand:V16QI 2 "nonimmediate_operand" "x,xm,xm,x")
+ (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0")]
UNSPEC_SSE5_PERMUTE))]
"TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
"pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set (match_operand:V4SI 0 "register_operand" "=x,x,x,x")
(vec_concat:V4SI
(truncate:V2SI
- (match_operand:V2DI 1 "nonimmediate_operand" "0,0,xm,xm"))
+ (match_operand:V2DI 1 "nonimmediate_operand" "0,0,x,xm"))
(truncate:V2SI
- (match_operand:V2DI 2 "nonimmediate_operand" "x,xm,0,x"))))
- (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+ (match_operand:V2DI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+ (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
"TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
"pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "sse4arg")
[(set (match_operand:V8HI 0 "register_operand" "=x,x,x,x")
(vec_concat:V8HI
(truncate:V4HI
- (match_operand:V4SI 1 "nonimmediate_operand" "0,0,xm,xm"))
+ (match_operand:V4SI 1 "nonimmediate_operand" "0,0,x,xm"))
(truncate:V4HI
- (match_operand:V4SI 2 "nonimmediate_operand" "x,xm,0,x"))))
- (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+ (match_operand:V4SI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+ (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
"TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
"pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "sse4arg")
[(set (match_operand:V16QI 0 "register_operand" "=x,x,x,x")
(vec_concat:V16QI
(truncate:V8QI
- (match_operand:V8HI 1 "nonimmediate_operand" "0,0,xm,xm"))
+ (match_operand:V8HI 1 "nonimmediate_operand" "0,0,x,xm"))
(truncate:V8QI
- (match_operand:V8HI 2 "nonimmediate_operand" "x,xm,0,x"))))
- (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+ (match_operand:V8HI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+ (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
"TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
"pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "sse4arg")
(define_insn "sse5_perm<mode>"
[(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x,x,x")
(unspec:SSEMODEF2P
- [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "0,0,xm,xm")
- (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,xm,0,x")
- (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0")]
+ [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "0,0,x,xm")
+ (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,xm,xm,x")
+ (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0")]
UNSPEC_SSE5_PERMUTE))]
"TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
"perm<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"