[MIPS] Regen ctselect tests, drop MSA cases unsupported by new legalizer The core PR's new CT_SELECT expansion normalizes the scalar mask to the vector element type. On MIPS that element type is not always a legal scalar register (i16, i8 on any MIPS; i64/double on mips32), triggering "Unexpected illegal type!" in LegalizeOp. Drop <8 x i16>, <16 x i8>, <2 x i64>, <2 x double> from the MSA fallback vector test pending a fix in lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (see TODO at top of test). Regen CHECK lines for everything else.
diff --git a/llvm/test/CodeGen/Mips/ctselect-fallback-edge-cases.ll b/llvm/test/CodeGen/Mips/ctselect-fallback-edge-cases.ll index 401a742..65b6a69 100644 --- a/llvm/test/CodeGen/Mips/ctselect-fallback-edge-cases.ll +++ b/llvm/test/CodeGen/Mips/ctselect-fallback-edge-cases.ll
@@ -36,16 +36,18 @@ ; M32: # %bb.0: ; M32-NEXT: andi $1, $4, 1 ; M32-NEXT: lui $2, 32768 +; M32-NEXT: negu $1, $1 ; M32-NEXT: jr $ra -; M32-NEXT: subu $2, $2, $1 +; M32-NEXT: xor $2, $1, $2 ; ; M64-LABEL: test_ctselect_extremal_values: ; M64: # %bb.0: ; M64-NEXT: sll $1, $4, 0 ; M64-NEXT: lui $2, 32768 ; M64-NEXT: andi $1, $1, 1 +; M64-NEXT: negu $1, $1 ; M64-NEXT: jr $ra -; M64-NEXT: subu $2, $2, $1 +; M64-NEXT: xor $2, $1, $2 %result = call i32 @llvm.ct.select.i32(i1 %cond, i32 2147483647, i32 -2147483648) ret i32 %result } @@ -155,55 +157,55 @@ ; M32-NEXT: andi $4, $6, 1 ; M32-NEXT: lw $6, 28($sp) ; M32-NEXT: negu $3, $3 +; M32-NEXT: negu $4, $4 ; M32-NEXT: xor $2, $2, $1 ; M32-NEXT: and $2, $2, $3 ; M32-NEXT: andi $3, $5, 1 -; M32-NEXT: lw $5, 32($sp) +; M32-NEXT: andi $5, $7, 1 +; M32-NEXT: lw $7, 24($sp) ; M32-NEXT: xor $1, $1, $2 -; M32-NEXT: lw $2, 24($sp) ; M32-NEXT: negu $3, $3 -; M32-NEXT: xor $1, $1, $2 +; M32-NEXT: lw $2, 32($sp) +; M32-NEXT: negu $5, $5 +; M32-NEXT: xor $1, $1, $7 ; M32-NEXT: and $1, $1, $3 -; M32-NEXT: andi $3, $7, 1 -; M32-NEXT: xor $1, $2, $1 -; M32-NEXT: negu $2, $4 -; M32-NEXT: negu $3, $3 +; M32-NEXT: xor $1, $7, $1 ; M32-NEXT: xor $1, $1, $6 -; M32-NEXT: and $1, $1, $2 +; M32-NEXT: and $1, $1, $4 ; M32-NEXT: xor $1, $6, $1 -; M32-NEXT: xor $1, $1, $5 -; M32-NEXT: and $1, $1, $3 +; M32-NEXT: xor $1, $1, $2 +; M32-NEXT: and $1, $1, $5 ; M32-NEXT: jr $ra -; M32-NEXT: xor $2, $5, $1 +; M32-NEXT: xor $2, $2, $1 ; ; M64-LABEL: test_ctselect_deeply_nested: ; M64: # %bb.0: ; M64-NEXT: sll $1, $4, 0 ; M64-NEXT: xor $2, $8, $9 -; M64-NEXT: sll $5, $5, 0 -; M64-NEXT: sll $3, $6, 0 -; M64-NEXT: sll $6, $11, 0 +; M64-NEXT: sll $3, $5, 0 +; M64-NEXT: sll $5, $11, 0 ; M64-NEXT: sll $4, $7, 0 ; M64-NEXT: lw $7, 0($sp) ; M64-NEXT: andi $1, $1, 1 ; M64-NEXT: sll $2, $2, 0 -; M64-NEXT: andi $5, $5, 1 ; M64-NEXT: andi $3, $3, 1 ; M64-NEXT: andi $4, $4, 1 ; M64-NEXT: negu $1, $1 -; M64-NEXT: negu $5, $5 +; M64-NEXT: negu $3, $3 ; M64-NEXT: negu $4, $4 ; M64-NEXT: and $1, $2, $1 -; M64-NEXT: sll $2, $9, 0 -; M64-NEXT: xor $1, $2, $1 -; M64-NEXT: sll $2, $10, 0 -; M64-NEXT: xor $1, $1, $2 -; M64-NEXT: and $1, $1, $5 -; M64-NEXT: xor $1, $2, $1 -; M64-NEXT: negu $2, $3 -; M64-NEXT: xor $1, $1, $6 -; M64-NEXT: and $1, $1, $2 +; M64-NEXT: sll $2, $6, 0 +; M64-NEXT: sll $6, $9, 0 ; M64-NEXT: xor $1, $6, $1 +; M64-NEXT: sll $6, $10, 0 +; M64-NEXT: andi $2, $2, 1 +; M64-NEXT: xor $1, $1, $6 +; M64-NEXT: negu $2, $2 +; M64-NEXT: and $1, $1, $3 +; M64-NEXT: xor $1, $6, $1 +; M64-NEXT: xor $1, $1, $5 +; M64-NEXT: and $1, $1, $2 +; M64-NEXT: xor $1, $5, $1 ; M64-NEXT: xor $1, $1, $7 ; M64-NEXT: and $1, $1, $4 ; M64-NEXT: jr $ra
diff --git a/llvm/test/CodeGen/Mips/ctselect-fallback-patterns.ll b/llvm/test/CodeGen/Mips/ctselect-fallback-patterns.ll index a1c5d52..dd15e5d 100644 --- a/llvm/test/CodeGen/Mips/ctselect-fallback-patterns.ll +++ b/llvm/test/CodeGen/Mips/ctselect-fallback-patterns.ll
@@ -244,13 +244,17 @@ define i32 @test_ctselect_constant_folding_true(i32 %a, i32 %b) { ; M32-LABEL: test_ctselect_constant_folding_true: ; M32: # %bb.0: +; M32-NEXT: xor $1, $4, $5 ; M32-NEXT: jr $ra -; M32-NEXT: move $2, $4 +; M32-NEXT: xor $2, $5, $1 ; ; M64-LABEL: test_ctselect_constant_folding_true: ; M64: # %bb.0: +; M64-NEXT: xor $1, $4, $5 +; M64-NEXT: sll $2, $5, 0 +; M64-NEXT: sll $1, $1, 0 ; M64-NEXT: jr $ra -; M64-NEXT: sll $2, $4, 0 +; M64-NEXT: xor $2, $2, $1 %result = call i32 @llvm.ct.select.i32(i1 true, i32 %a, i32 %b) ret i32 %result } @@ -259,12 +263,13 @@ ; M32-LABEL: test_ctselect_constant_folding_false: ; M32: # %bb.0: ; M32-NEXT: jr $ra -; M32-NEXT: move $2, $5 +; M32-NEXT: xor $2, $5, $zero ; ; M64-LABEL: test_ctselect_constant_folding_false: ; M64: # %bb.0: +; M64-NEXT: sll $1, $5, 0 ; M64-NEXT: jr $ra -; M64-NEXT: sll $2, $5, 0 +; M64-NEXT: xor $2, $1, $zero %result = call i32 @llvm.ct.select.i32(i1 false, i32 %a, i32 %b) ret i32 %result } @@ -274,12 +279,13 @@ ; M32-LABEL: test_ctselect_identical_operands: ; M32: # %bb.0: ; M32-NEXT: jr $ra -; M32-NEXT: move $2, $5 +; M32-NEXT: xor $2, $5, $zero ; ; M64-LABEL: test_ctselect_identical_operands: ; M64: # %bb.0: +; M64-NEXT: sll $1, $5, 0 ; M64-NEXT: jr $ra -; M64-NEXT: sll $2, $5, 0 +; M64-NEXT: xor $2, $1, $zero %result = call i32 @llvm.ct.select.i32(i1 %cond, i32 %x, i32 %x) ret i32 %result } @@ -321,49 +327,49 @@ ; M32: # %bb.0: ; M32-NEXT: lw $1, 16($sp) ; M32-NEXT: andi $3, $4, 1 +; M32-NEXT: andi $4, $6, 1 ; M32-NEXT: negu $3, $3 +; M32-NEXT: negu $4, $4 ; M32-NEXT: xor $2, $7, $1 ; M32-NEXT: and $2, $2, $3 ; M32-NEXT: andi $3, $5, 1 +; M32-NEXT: lw $5, 20($sp) ; M32-NEXT: xor $1, $1, $2 -; M32-NEXT: lw $2, 20($sp) ; M32-NEXT: negu $3, $3 -; M32-NEXT: xor $1, $1, $2 +; M32-NEXT: lw $2, 24($sp) +; M32-NEXT: xor $1, $1, $5 ; M32-NEXT: and $1, $1, $3 -; M32-NEXT: lw $3, 24($sp) -; M32-NEXT: xor $1, $2, $1 -; M32-NEXT: andi $2, $6, 1 -; M32-NEXT: xor $1, $1, $3 -; M32-NEXT: negu $2, $2 -; M32-NEXT: and $1, $1, $2 +; M32-NEXT: xor $1, $5, $1 +; M32-NEXT: xor $1, $1, $2 +; M32-NEXT: and $1, $1, $4 ; M32-NEXT: jr $ra -; M32-NEXT: xor $2, $3, $1 +; M32-NEXT: xor $2, $2, $1 ; ; M64-LABEL: test_ctselect_chain: ; M64: # %bb.0: ; M64-NEXT: sll $1, $4, 0 ; M64-NEXT: xor $2, $7, $8 ; M64-NEXT: sll $3, $5, 0 +; M64-NEXT: sll $4, $8, 0 +; M64-NEXT: sll $5, $9, 0 ; M64-NEXT: andi $1, $1, 1 ; M64-NEXT: sll $2, $2, 0 -; M64-NEXT: andi $3, $3, 1 ; M64-NEXT: negu $1, $1 -; M64-NEXT: negu $3, $3 ; M64-NEXT: and $1, $2, $1 -; M64-NEXT: sll $2, $8, 0 -; M64-NEXT: xor $1, $2, $1 -; M64-NEXT: sll $2, $9, 0 -; M64-NEXT: xor $1, $1, $2 -; M64-NEXT: and $1, $1, $3 -; M64-NEXT: sll $3, $6, 0 -; M64-NEXT: xor $1, $2, $1 ; M64-NEXT: andi $2, $3, 1 -; M64-NEXT: sll $3, $10, 0 -; M64-NEXT: xor $1, $1, $3 +; M64-NEXT: sll $3, $6, 0 +; M64-NEXT: xor $1, $4, $1 ; M64-NEXT: negu $2, $2 +; M64-NEXT: andi $3, $3, 1 +; M64-NEXT: sll $4, $10, 0 +; M64-NEXT: xor $1, $1, $5 +; M64-NEXT: negu $3, $3 ; M64-NEXT: and $1, $1, $2 +; M64-NEXT: xor $1, $5, $1 +; M64-NEXT: xor $1, $1, $4 +; M64-NEXT: and $1, $1, $3 ; M64-NEXT: jr $ra -; M64-NEXT: xor $2, $3, $1 +; M64-NEXT: xor $2, $4, $1 %sel1 = call i32 @llvm.ct.select.i32(i1 %c1, i32 %a, i32 %b) %sel2 = call i32 @llvm.ct.select.i32(i1 %c2, i32 %sel1, i32 %c) %sel3 = call i32 @llvm.ct.select.i32(i1 %c3, i32 %sel2, i32 %d)
diff --git a/llvm/test/CodeGen/Mips/ctselect-fallback-vector.ll b/llvm/test/CodeGen/Mips/ctselect-fallback-vector.ll index 302e06b..f7b6aac 100644 --- a/llvm/test/CodeGen/Mips/ctselect-fallback-vector.ll +++ b/llvm/test/CodeGen/Mips/ctselect-fallback-vector.ll
@@ -2,6 +2,13 @@ ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r6 -mattr=+msa -O3 | FileCheck %s --check-prefix=MIPS64-MSA ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r6 -mattr=+msa -O3 | FileCheck %s --check-prefix=MIPS32-MSA +; TODO: <8 x i16>, <16 x i8>, <2 x i64>, <2 x double> MSA cases crash in the +; new legalizer. The CT_SELECT expansion normalizes the scalar mask to the +; vector element type (i16/i8/i64/double here), which is not always a legal +; scalar register on MIPS. Fix needed in lib/CodeGen/SelectionDAG/LegalizeDAG.cpp. +; vector element type (i16/i8 here), which is not a legal scalar register +; on MIPS. Fix needed in lib/CodeGen/SelectionDAG/LegalizeDAG.cpp. + ; Test 32-bit integer vector (128 bits) define <4 x i32> @test_ctselect_v4i32(i1 %cond, <4 x i32> %a, <4 x i32> %b) { ; MIPS64-MSA-LABEL: test_ctselect_v4i32: @@ -9,14 +16,14 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -29,11 +36,8 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $4 ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -43,6 +47,9 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 @@ -56,187 +63,10 @@ } ; Test 16-bit integer vector (8 x i16 = 128-bit) -define <8 x i16> @test_ctselect_v8i16(i1 %cond, <8 x i16> %a, <8 x i16> %b) { -; MIPS64-MSA-LABEL: test_ctselect_v8i16: -; MIPS64-MSA: # %bb.0: -; MIPS64-MSA-NEXT: insert.d $w0[0], $7 -; MIPS64-MSA-NEXT: insert.d $w1[0], $5 -; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.h $w2, $1 -; MIPS64-MSA-NEXT: insert.d $w0[1], $8 -; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.h $w2, $w2, 15 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.h $w2, $w2, 15 -; MIPS64-MSA-NEXT: shf.h $w0, $w0, 27 -; MIPS64-MSA-NEXT: shf.h $w1, $w1, 27 -; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS64-MSA-NEXT: shf.h $w0, $w0, 27 -; MIPS64-MSA-NEXT: copy_s.d $2, $w0[0] -; MIPS64-MSA-NEXT: jr $ra -; MIPS64-MSA-NEXT: copy_s.d $3, $w0[1] -; -; MIPS32-MSA-LABEL: test_ctselect_v8i16: -; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: lw $2, 24($sp) -; MIPS32-MSA-NEXT: lw $1, 28($sp) -; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.h $w2, $4 -; MIPS32-MSA-NEXT: insert.w $w0[0], $2 -; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.h $w2, $w2, 15 -; MIPS32-MSA-NEXT: srai.h $w2, $w2, 15 -; MIPS32-MSA-NEXT: insert.w $w0[1], $1 -; MIPS32-MSA-NEXT: lw $1, 32($sp) -; MIPS32-MSA-NEXT: insert.w $w0[2], $1 -; MIPS32-MSA-NEXT: lw $1, 36($sp) -; MIPS32-MSA-NEXT: insert.w $w0[3], $1 -; MIPS32-MSA-NEXT: lw $1, 16($sp) -; MIPS32-MSA-NEXT: insert.w $w1[2], $1 -; MIPS32-MSA-NEXT: lw $1, 20($sp) -; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: shf.h $w0, $w0, 177 -; MIPS32-MSA-NEXT: shf.h $w1, $w1, 177 -; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS32-MSA-NEXT: shf.h $w0, $w0, 177 -; MIPS32-MSA-NEXT: copy_s.w $2, $w0[0] -; MIPS32-MSA-NEXT: copy_s.w $3, $w0[1] -; MIPS32-MSA-NEXT: copy_s.w $4, $w0[2] -; MIPS32-MSA-NEXT: jr $ra -; MIPS32-MSA-NEXT: copy_s.w $5, $w0[3] - %result = call <8 x i16> @llvm.ct.select.v8i16(i1 %cond, <8 x i16> %a, <8 x i16> %b) - ret <8 x i16> %result -} ; Test byte vector (16 x i8 = 128-bit) -define <16 x i8> @test_ctselect_v16i8(i1 %cond, <16 x i8> %a, <16 x i8> %b) { -; MIPS64-MSA-LABEL: test_ctselect_v16i8: -; MIPS64-MSA: # %bb.0: -; MIPS64-MSA-NEXT: insert.d $w0[0], $7 -; MIPS64-MSA-NEXT: insert.d $w1[0], $5 -; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.b $w2, $1 -; MIPS64-MSA-NEXT: insert.d $w0[1], $8 -; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.b $w2, $w2, 7 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: shf.b $w0, $w0, 27 -; MIPS64-MSA-NEXT: srai.b $w2, $w2, 7 -; MIPS64-MSA-NEXT: shf.b $w1, $w1, 27 -; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 -; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 -; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS64-MSA-NEXT: shf.b $w0, $w0, 27 -; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 -; MIPS64-MSA-NEXT: copy_s.d $2, $w0[0] -; MIPS64-MSA-NEXT: jr $ra -; MIPS64-MSA-NEXT: copy_s.d $3, $w0[1] -; -; MIPS32-MSA-LABEL: test_ctselect_v16i8: -; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: lw $2, 24($sp) -; MIPS32-MSA-NEXT: lw $1, 28($sp) -; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.b $w2, $4 -; MIPS32-MSA-NEXT: insert.w $w0[0], $2 -; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.b $w2, $w2, 7 -; MIPS32-MSA-NEXT: srai.b $w2, $w2, 7 -; MIPS32-MSA-NEXT: insert.w $w0[1], $1 -; MIPS32-MSA-NEXT: lw $1, 32($sp) -; MIPS32-MSA-NEXT: insert.w $w0[2], $1 -; MIPS32-MSA-NEXT: lw $1, 36($sp) -; MIPS32-MSA-NEXT: insert.w $w0[3], $1 -; MIPS32-MSA-NEXT: lw $1, 16($sp) -; MIPS32-MSA-NEXT: insert.w $w1[2], $1 -; MIPS32-MSA-NEXT: lw $1, 20($sp) -; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: shf.b $w0, $w0, 27 -; MIPS32-MSA-NEXT: shf.b $w1, $w1, 27 -; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS32-MSA-NEXT: shf.b $w0, $w0, 27 -; MIPS32-MSA-NEXT: copy_s.w $2, $w0[0] -; MIPS32-MSA-NEXT: copy_s.w $3, $w0[1] -; MIPS32-MSA-NEXT: copy_s.w $4, $w0[2] -; MIPS32-MSA-NEXT: jr $ra -; MIPS32-MSA-NEXT: copy_s.w $5, $w0[3] - %result = call <16 x i8> @llvm.ct.select.v16i8(i1 %cond, <16 x i8> %a, <16 x i8> %b) - ret <16 x i8> %result -} ; Test 64-bit integer vector (2 x i64 = 128-bit) -define <2 x i64> @test_ctselect_v2i64(i1 %cond, <2 x i64> %a, <2 x i64> %b) { -; MIPS64-MSA-LABEL: test_ctselect_v2i64: -; MIPS64-MSA: # %bb.0: -; MIPS64-MSA-NEXT: insert.d $w0[0], $7 -; MIPS64-MSA-NEXT: insert.d $w1[0], $5 -; MIPS64-MSA-NEXT: fill.d $w2, $4 -; MIPS64-MSA-NEXT: insert.d $w0[1], $8 -; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.d $w2, $w2, 63 -; MIPS64-MSA-NEXT: srai.d $w2, $w2, 63 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS64-MSA-NEXT: copy_s.d $2, $w0[0] -; MIPS64-MSA-NEXT: jr $ra -; MIPS64-MSA-NEXT: copy_s.d $3, $w0[1] -; -; MIPS32-MSA-LABEL: test_ctselect_v2i64: -; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: addiu $sp, $sp, -32 -; MIPS32-MSA-NEXT: .cfi_def_cfa_offset 32 -; MIPS32-MSA-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill -; MIPS32-MSA-NEXT: sw $fp, 24($sp) # 4-byte Folded Spill -; MIPS32-MSA-NEXT: .cfi_offset 31, -4 -; MIPS32-MSA-NEXT: .cfi_offset 30, -8 -; MIPS32-MSA-NEXT: move $fp, $sp -; MIPS32-MSA-NEXT: .cfi_def_cfa_register 30 -; MIPS32-MSA-NEXT: addiu $1, $zero, -16 -; MIPS32-MSA-NEXT: and $sp, $sp, $1 -; MIPS32-MSA-NEXT: lw $2, 56($fp) -; MIPS32-MSA-NEXT: lw $1, 60($fp) -; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: sw $4, 12($sp) -; MIPS32-MSA-NEXT: sw $4, 4($sp) -; MIPS32-MSA-NEXT: ld.d $w2, 0($sp) -; MIPS32-MSA-NEXT: insert.w $w0[0], $2 -; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.d $w2, $w2, 63 -; MIPS32-MSA-NEXT: insert.w $w0[1], $1 -; MIPS32-MSA-NEXT: lw $1, 64($fp) -; MIPS32-MSA-NEXT: srai.d $w2, $w2, 63 -; MIPS32-MSA-NEXT: insert.w $w0[2], $1 -; MIPS32-MSA-NEXT: lw $1, 68($fp) -; MIPS32-MSA-NEXT: insert.w $w0[3], $1 -; MIPS32-MSA-NEXT: lw $1, 48($fp) -; MIPS32-MSA-NEXT: insert.w $w1[2], $1 -; MIPS32-MSA-NEXT: lw $1, 52($fp) -; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: shf.w $w0, $w0, 177 -; MIPS32-MSA-NEXT: shf.w $w1, $w1, 177 -; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS32-MSA-NEXT: shf.w $w0, $w0, 177 -; MIPS32-MSA-NEXT: copy_s.w $2, $w0[0] -; MIPS32-MSA-NEXT: copy_s.w $3, $w0[1] -; MIPS32-MSA-NEXT: copy_s.w $4, $w0[2] -; MIPS32-MSA-NEXT: copy_s.w $5, $w0[3] -; MIPS32-MSA-NEXT: move $sp, $fp -; MIPS32-MSA-NEXT: lw $fp, 24($sp) # 4-byte Folded Reload -; MIPS32-MSA-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload -; MIPS32-MSA-NEXT: jr $ra -; MIPS32-MSA-NEXT: addiu $sp, $sp, 32 - %result = call <2 x i64> @llvm.ct.select.v2i64(i1 %cond, <2 x i64> %a, <2 x i64> %b) - ret <2 x i64> %result -} ; Test single-precision float vector (4 x float = 128-bit) define <4 x float> @test_ctselect_v4f32(i1 %cond, <4 x float> %a, <4 x float> %b) { @@ -245,14 +75,14 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -265,11 +95,8 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $5 ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -279,6 +106,9 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: andi $1, $5, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 @@ -289,68 +119,6 @@ } ; Test double-precision float vector (2 x double = 128-bit) -define <2 x double> @test_ctselect_v2f64(i1 %cond, <2 x double> %a, <2 x double> %b) { -; MIPS64-MSA-LABEL: test_ctselect_v2f64: -; MIPS64-MSA: # %bb.0: -; MIPS64-MSA-NEXT: insert.d $w0[0], $7 -; MIPS64-MSA-NEXT: insert.d $w1[0], $5 -; MIPS64-MSA-NEXT: fill.d $w2, $4 -; MIPS64-MSA-NEXT: insert.d $w0[1], $8 -; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.d $w2, $w2, 63 -; MIPS64-MSA-NEXT: srai.d $w2, $w2, 63 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS64-MSA-NEXT: copy_s.d $2, $w0[0] -; MIPS64-MSA-NEXT: jr $ra -; MIPS64-MSA-NEXT: copy_s.d $3, $w0[1] -; -; MIPS32-MSA-LABEL: test_ctselect_v2f64: -; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: addiu $sp, $sp, -32 -; MIPS32-MSA-NEXT: .cfi_def_cfa_offset 32 -; MIPS32-MSA-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill -; MIPS32-MSA-NEXT: sw $fp, 24($sp) # 4-byte Folded Spill -; MIPS32-MSA-NEXT: .cfi_offset 31, -4 -; MIPS32-MSA-NEXT: .cfi_offset 30, -8 -; MIPS32-MSA-NEXT: move $fp, $sp -; MIPS32-MSA-NEXT: .cfi_def_cfa_register 30 -; MIPS32-MSA-NEXT: addiu $1, $zero, -16 -; MIPS32-MSA-NEXT: and $sp, $sp, $1 -; MIPS32-MSA-NEXT: lw $2, 56($fp) -; MIPS32-MSA-NEXT: lw $1, 60($fp) -; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: sw $5, 12($sp) -; MIPS32-MSA-NEXT: sw $5, 4($sp) -; MIPS32-MSA-NEXT: ld.d $w2, 0($sp) -; MIPS32-MSA-NEXT: insert.w $w0[0], $2 -; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.d $w2, $w2, 63 -; MIPS32-MSA-NEXT: insert.w $w0[1], $1 -; MIPS32-MSA-NEXT: lw $1, 64($fp) -; MIPS32-MSA-NEXT: srai.d $w2, $w2, 63 -; MIPS32-MSA-NEXT: insert.w $w0[2], $1 -; MIPS32-MSA-NEXT: lw $1, 68($fp) -; MIPS32-MSA-NEXT: insert.w $w0[3], $1 -; MIPS32-MSA-NEXT: lw $1, 48($fp) -; MIPS32-MSA-NEXT: insert.w $w1[2], $1 -; MIPS32-MSA-NEXT: lw $1, 52($fp) -; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: shf.w $w0, $w0, 177 -; MIPS32-MSA-NEXT: shf.w $w1, $w1, 177 -; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS32-MSA-NEXT: st.d $w0, 0($4) -; MIPS32-MSA-NEXT: move $sp, $fp -; MIPS32-MSA-NEXT: lw $fp, 24($sp) # 4-byte Folded Reload -; MIPS32-MSA-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload -; MIPS32-MSA-NEXT: jr $ra -; MIPS32-MSA-NEXT: addiu $sp, $sp, 32 - %result = call <2 x double> @llvm.ct.select.v2f64(i1 %cond, <2 x double> %a, <2 x double> %b) - ret <2 x double> %result -} ; Test with aligned loads (common case) define <4 x i32> @test_ctselect_v4i32_aligned_load(i1 %cond, ptr %p1, ptr %p2) { @@ -359,10 +127,10 @@ ; MIPS64-MSA-NEXT: sll $1, $4, 0 ; MIPS64-MSA-NEXT: ld.w $w0, 0($6) ; MIPS64-MSA-NEXT: ld.w $w1, 0($5) -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 +; MIPS64-MSA-NEXT: negu $1, $1 ; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -372,12 +140,12 @@ ; ; MIPS32-MSA-LABEL: test_ctselect_v4i32_aligned_load: ; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: fill.w $w2, $4 +; MIPS32-MSA-NEXT: andi $1, $4, 1 ; MIPS32-MSA-NEXT: ld.w $w0, 0($6) ; MIPS32-MSA-NEXT: ld.w $w1, 0($5) -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS32-MSA-NEXT: copy_s.w $2, $w0[0] @@ -398,10 +166,10 @@ ; MIPS64-MSA-NEXT: sll $1, $4, 0 ; MIPS64-MSA-NEXT: ld.w $w0, 0($6) ; MIPS64-MSA-NEXT: ld.w $w1, 0($5) -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 +; MIPS64-MSA-NEXT: negu $1, $1 ; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -411,12 +179,12 @@ ; ; MIPS32-MSA-LABEL: test_ctselect_v4i32_unaligned_load: ; MIPS32-MSA: # %bb.0: -; MIPS32-MSA-NEXT: fill.w $w2, $4 +; MIPS32-MSA-NEXT: andi $1, $4, 1 ; MIPS32-MSA-NEXT: ld.w $w0, 0($6) ; MIPS32-MSA-NEXT: ld.w $w1, 0($5) -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS32-MSA-NEXT: copy_s.w $2, $w0[0] @@ -437,14 +205,14 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: jr $ra @@ -455,11 +223,8 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $4 ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -469,8 +234,11 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: lw $1, 40($sp) +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 +; MIPS32-MSA-NEXT: lw $1, 40($sp) ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS32-MSA-NEXT: jr $ra @@ -487,22 +255,22 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $8 ; MIPS64-MSA-NEXT: insert.d $w1[0], $6 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 -; MIPS64-MSA-NEXT: sll $1, $5, 0 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $9 ; MIPS64-MSA-NEXT: insert.d $w1[1], $7 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: sll $1, $5, 0 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: andi $1, $1, 1 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: insert.d $w1[0], $10 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 ; MIPS64-MSA-NEXT: insert.d $w1[1], $11 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: and.v $w0, $w0, $w2 @@ -517,12 +285,10 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $4 +; MIPS32-MSA-NEXT: lw $3, 40($sp) ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: lw $2, 40($sp) -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS32-MSA-NEXT: lw $2, 44($sp) ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -532,19 +298,21 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 -; MIPS32-MSA-NEXT: lw $1, 44($sp) +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 +; MIPS32-MSA-NEXT: andi $1, $5, 1 +; MIPS32-MSA-NEXT: negu $1, $1 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 -; MIPS32-MSA-NEXT: fill.w $w2, $5 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 -; MIPS32-MSA-NEXT: insert.w $w1[0], $2 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: insert.w $w1[1], $1 -; MIPS32-MSA-NEXT: lw $1, 48($sp) -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: insert.w $w1[2], $1 -; MIPS32-MSA-NEXT: lw $1, 52($sp) -; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: insert.w $w1[0], $3 +; MIPS32-MSA-NEXT: insert.w $w1[1], $2 +; MIPS32-MSA-NEXT: lw $2, 48($sp) +; MIPS32-MSA-NEXT: insert.w $w1[2], $2 +; MIPS32-MSA-NEXT: lw $2, 52($sp) +; MIPS32-MSA-NEXT: insert.w $w1[3], $2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS32-MSA-NEXT: and.v $w0, $w0, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w1, $w0 @@ -565,16 +333,16 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 +; MIPS64-MSA-NEXT: negu $1, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 ; MIPS64-MSA-NEXT: fadd.w $w2, $w1, $w0 ; MIPS64-MSA-NEXT: fsub.w $w0, $w1, $w0 ; MIPS64-MSA-NEXT: xor.v $w1, $w2, $w0 ; MIPS64-MSA-NEXT: fill.w $w2, $1 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -598,12 +366,12 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: andi $1, $5, 1 +; MIPS32-MSA-NEXT: negu $1, $1 ; MIPS32-MSA-NEXT: fadd.w $w2, $w1, $w0 ; MIPS32-MSA-NEXT: fsub.w $w0, $w1, $w0 ; MIPS32-MSA-NEXT: xor.v $w1, $w2, $w0 -; MIPS32-MSA-NEXT: fill.w $w2, $5 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS32-MSA-NEXT: jr $ra @@ -621,12 +389,12 @@ ; MIPS64-MSA-NEXT: ld.w $w0, 0($6) ; MIPS64-MSA-NEXT: ld.w $w1, 0($5) ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 +; MIPS64-MSA-NEXT: negu $1, $1 ; MIPS64-MSA-NEXT: addvi.w $w0, $w0, 2 ; MIPS64-MSA-NEXT: addvi.w $w1, $w1, 1 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: jr $ra @@ -636,11 +404,11 @@ ; MIPS32-MSA: # %bb.0: ; MIPS32-MSA-NEXT: ld.w $w0, 0($6) ; MIPS32-MSA-NEXT: ld.w $w1, 0($5) -; MIPS32-MSA-NEXT: fill.w $w2, $4 +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 ; MIPS32-MSA-NEXT: addvi.w $w0, $w0, 2 ; MIPS32-MSA-NEXT: addvi.w $w1, $w1, 1 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 @@ -662,14 +430,14 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 @@ -682,11 +450,8 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $4 ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -696,6 +461,9 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1 @@ -715,14 +483,14 @@ ; MIPS64-MSA-NEXT: insert.d $w0[0], $7 ; MIPS64-MSA-NEXT: insert.d $w1[0], $5 ; MIPS64-MSA-NEXT: sll $1, $4, 0 -; MIPS64-MSA-NEXT: fill.w $w2, $1 +; MIPS64-MSA-NEXT: andi $1, $1, 1 ; MIPS64-MSA-NEXT: insert.d $w0[1], $8 ; MIPS64-MSA-NEXT: insert.d $w1[1], $6 -; MIPS64-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 -; MIPS64-MSA-NEXT: srai.w $w2, $w2, 31 +; MIPS64-MSA-NEXT: negu $1, $1 +; MIPS64-MSA-NEXT: fill.w $w2, $1 ; MIPS64-MSA-NEXT: shf.w $w0, $w0, 177 ; MIPS64-MSA-NEXT: shf.w $w1, $w1, 177 +; MIPS64-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS64-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS64-MSA-NEXT: xor.v $w0, $w0, $w1 ; MIPS64-MSA-NEXT: addv.w $w0, $w0, $w0 @@ -736,11 +504,8 @@ ; MIPS32-MSA-NEXT: lw $2, 24($sp) ; MIPS32-MSA-NEXT: lw $1, 28($sp) ; MIPS32-MSA-NEXT: insert.w $w1[0], $6 -; MIPS32-MSA-NEXT: fill.w $w2, $4 ; MIPS32-MSA-NEXT: insert.w $w0[0], $2 ; MIPS32-MSA-NEXT: insert.w $w1[1], $7 -; MIPS32-MSA-NEXT: slli.w $w2, $w2, 31 -; MIPS32-MSA-NEXT: srai.w $w2, $w2, 31 ; MIPS32-MSA-NEXT: insert.w $w0[1], $1 ; MIPS32-MSA-NEXT: lw $1, 32($sp) ; MIPS32-MSA-NEXT: insert.w $w0[2], $1 @@ -750,6 +515,9 @@ ; MIPS32-MSA-NEXT: insert.w $w1[2], $1 ; MIPS32-MSA-NEXT: lw $1, 20($sp) ; MIPS32-MSA-NEXT: insert.w $w1[3], $1 +; MIPS32-MSA-NEXT: andi $1, $4, 1 +; MIPS32-MSA-NEXT: negu $1, $1 +; MIPS32-MSA-NEXT: fill.w $w2, $1 ; MIPS32-MSA-NEXT: xor.v $w1, $w1, $w0 ; MIPS32-MSA-NEXT: and.v $w1, $w1, $w2 ; MIPS32-MSA-NEXT: xor.v $w0, $w0, $w1
diff --git a/llvm/test/CodeGen/Mips/ctselect-fallback.ll b/llvm/test/CodeGen/Mips/ctselect-fallback.ll index 6a61412..8e0fe45 100644 --- a/llvm/test/CodeGen/Mips/ctselect-fallback.ll +++ b/llvm/test/CodeGen/Mips/ctselect-fallback.ll
@@ -81,17 +81,17 @@ define i64 @test_ctselect_i64(i1 %cond, i64 %a, i64 %b) { ; M32-LABEL: test_ctselect_i64: ; M32: # %bb.0: -; M32-NEXT: lw $1, 16($sp) ; M32-NEXT: andi $3, $4, 1 +; M32-NEXT: lw $1, 16($sp) +; M32-NEXT: lw $4, 20($sp) ; M32-NEXT: negu $3, $3 ; M32-NEXT: xor $2, $6, $1 +; M32-NEXT: xor $5, $7, $4 ; M32-NEXT: and $2, $2, $3 +; M32-NEXT: and $3, $5, $3 ; M32-NEXT: xor $2, $1, $2 -; M32-NEXT: lw $1, 20($sp) -; M32-NEXT: xor $4, $7, $1 -; M32-NEXT: and $3, $4, $3 ; M32-NEXT: jr $ra -; M32-NEXT: xor $3, $1, $3 +; M32-NEXT: xor $3, $4, $3 ; ; M64-LABEL: test_ctselect_i64: ; M64: # %bb.0: @@ -131,13 +131,17 @@ define i32 @test_ctselect_const_true(i32 %a, i32 %b) { ; M32-LABEL: test_ctselect_const_true: ; M32: # %bb.0: +; M32-NEXT: xor $1, $4, $5 ; M32-NEXT: jr $ra -; M32-NEXT: move $2, $4 +; M32-NEXT: xor $2, $5, $1 ; ; M64-LABEL: test_ctselect_const_true: ; M64: # %bb.0: +; M64-NEXT: xor $1, $4, $5 +; M64-NEXT: sll $2, $5, 0 +; M64-NEXT: sll $1, $1, 0 ; M64-NEXT: jr $ra -; M64-NEXT: sll $2, $4, 0 +; M64-NEXT: xor $2, $2, $1 %result = call i32 @llvm.ct.select.i32(i1 true, i32 %a, i32 %b) ret i32 %result } @@ -146,12 +150,13 @@ ; M32-LABEL: test_ctselect_const_false: ; M32: # %bb.0: ; M32-NEXT: jr $ra -; M32-NEXT: move $2, $5 +; M32-NEXT: xor $2, $5, $zero ; ; M64-LABEL: test_ctselect_const_false: ; M64: # %bb.0: +; M64-NEXT: sll $1, $5, 0 ; M64-NEXT: jr $ra -; M64-NEXT: sll $2, $5, 0 +; M64-NEXT: xor $2, $1, $zero %result = call i32 @llvm.ct.select.i32(i1 false, i32 %a, i32 %b) ret i32 %result } @@ -305,35 +310,35 @@ ; M32: # %bb.0: ; M32-NEXT: andi $2, $5, 1 ; M32-NEXT: xor $1, $6, $7 -; M32-NEXT: andi $3, $4, 1 +; M32-NEXT: lw $3, 16($sp) ; M32-NEXT: negu $2, $2 -; M32-NEXT: negu $3, $3 ; M32-NEXT: and $1, $1, $2 -; M32-NEXT: lw $2, 16($sp) +; M32-NEXT: andi $2, $4, 1 ; M32-NEXT: xor $1, $7, $1 -; M32-NEXT: xor $1, $1, $2 -; M32-NEXT: and $1, $1, $3 +; M32-NEXT: negu $2, $2 +; M32-NEXT: xor $1, $1, $3 +; M32-NEXT: and $1, $1, $2 ; M32-NEXT: jr $ra -; M32-NEXT: xor $2, $2, $1 +; M32-NEXT: xor $2, $3, $1 ; ; M64-LABEL: test_ctselect_nested: ; M64: # %bb.0: ; M64-NEXT: sll $1, $5, 0 ; M64-NEXT: xor $2, $6, $7 -; M64-NEXT: sll $3, $4, 0 +; M64-NEXT: sll $3, $7, 0 ; M64-NEXT: andi $1, $1, 1 ; M64-NEXT: sll $2, $2, 0 -; M64-NEXT: andi $3, $3, 1 ; M64-NEXT: negu $1, $1 -; M64-NEXT: negu $3, $3 ; M64-NEXT: and $1, $2, $1 -; M64-NEXT: sll $2, $7, 0 -; M64-NEXT: xor $1, $2, $1 -; M64-NEXT: sll $2, $8, 0 -; M64-NEXT: xor $1, $1, $2 -; M64-NEXT: and $1, $1, $3 +; M64-NEXT: sll $2, $4, 0 +; M64-NEXT: andi $2, $2, 1 +; M64-NEXT: xor $1, $3, $1 +; M64-NEXT: sll $3, $8, 0 +; M64-NEXT: negu $2, $2 +; M64-NEXT: xor $1, $1, $3 +; M64-NEXT: and $1, $1, $2 ; M64-NEXT: jr $ra -; M64-NEXT: xor $2, $2, $1 +; M64-NEXT: xor $2, $3, $1 %inner = call i32 @llvm.ct.select.i32(i1 %cond2, i32 %a, i32 %b) %result = call i32 @llvm.ct.select.i32(i1 %cond1, i32 %inner, i32 %c) ret i32 %result