1; This file checks support for comparing vector values with the fcmp 2; instruction. 3 4; RUN: %p2i -i %s --filetype=obj --disassemble -a -O2 | FileCheck %s 5; RUN: %p2i -i %s --filetype=obj --disassemble -a -Om1 | FileCheck %s 6 7; RUN: %if --need=target_MIPS32 --need=allow_dump \ 8; RUN: --command %p2i --filetype=asm --assemble --disassemble --target mips32\ 9; RUN: -i %s --args -O2 \ 10; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 11; RUN: --command FileCheck --check-prefix MIPS32 %s 12 13; Check that sext elimination occurs when the result of the comparison 14; instruction is alrady sign extended. Sign extension to 4 x i32 uses 15; the pslld instruction. 16define internal <4 x i32> @sextElimination(<4 x float> %a, <4 x float> %b) { 17entry: 18 %res.trunc = fcmp oeq <4 x float> %a, %b 19 %res = sext <4 x i1> %res.trunc to <4 x i32> 20 ret <4 x i32> %res 21; CHECK-LABEL: sextElimination 22; CHECK: cmpeqps 23; CHECK-NOT: pslld 24} 25; MIPS32-LABEL: sextElimination 26; MIPS32: c.eq.s 27; MIPS32: li [[R:.*]],1 28; MIPS32: movf [[R]],zero,$fcc0 29; MIPS32: c.eq.s 30; MIPS32: li [[R:.*]],1 31; MIPS32: movf [[R]],zero,$fcc0 32; MIPS32: c.eq.s 33; MIPS32: li [[R:.*]],1 34; MIPS32: movf [[R]],zero,$fcc0 35; MIPS32: c.eq.s 36; MIPS32: li [[R:.*]],1 37; MIPS32: movf [[R]],zero,$fcc0 38 39define internal <4 x i32> @fcmpFalseVector(<4 x float> %a, <4 x float> %b) { 40entry: 41 %res.trunc = fcmp false <4 x float> %a, %b 42 %res = sext <4 x i1> %res.trunc to <4 x i32> 43 ret <4 x i32> %res 44; CHECK-LABEL: fcmpFalseVector 45; CHECK: pxor 46} 47; MIPS32-LABEL: fcmpFalseVector 48; MIPS32: li v0,0 49; MIPS32: li v1,0 50; MIPS32: li a0,0 51; MIPS32: li a1,0 52 53define internal <4 x i32> @fcmpOeqVector(<4 x float> %a, <4 x float> %b) { 54entry: 55 %res.trunc = fcmp oeq <4 x float> %a, %b 56 %res = sext <4 x i1> %res.trunc to <4 x i32> 57 ret <4 x i32> %res 58; CHECK-LABEL: fcmpOeqVector 59; CHECK: cmpeqps 60} 61; MIPS32-LABEL: fcmpOeqVector 62; MIPS32: c.eq.s 63; MIPS32: li [[R:.*]],1 64; MIPS32: movf [[R]],zero,$fcc0 65; MIPS32: c.eq.s 66; MIPS32: li [[R:.*]],1 67; MIPS32: movf [[R]],zero,$fcc0 68; MIPS32: c.eq.s 69; MIPS32: li [[R:.*]],1 70; MIPS32: movf [[R]],zero,$fcc0 71; MIPS32: c.eq.s 72; MIPS32: li [[R:.*]],1 73; MIPS32: movf [[R]],zero,$fcc0 74 75define internal <4 x i32> @fcmpOgeVector(<4 x float> %a, <4 x float> %b) { 76entry: 77 %res.trunc = fcmp oge <4 x float> %a, %b 78 %res = sext <4 x i1> %res.trunc to <4 x i32> 79 ret <4 x i32> %res 80; CHECK-LABEL: fcmpOgeVector 81; CHECK: cmpleps 82} 83; MIPS32-LABEL: fcmpOgeVector 84; MIPS32: c.ult.s 85; MIPS32: li [[R:.*]],1 86; MIPS32: movt [[R]],zero,$fcc0 87; MIPS32: c.ult.s 88; MIPS32: li [[R:.*]],1 89; MIPS32: movt [[R]],zero,$fcc0 90; MIPS32: c.ult.s 91; MIPS32: li [[R:.*]],1 92; MIPS32: movt [[R]],zero,$fcc0 93; MIPS32: c.ult.s 94; MIPS32: li [[R:.*]],1 95; MIPS32: movt [[R]],zero,$fcc0 96 97define internal <4 x i32> @fcmpOgtVector(<4 x float> %a, <4 x float> %b) { 98entry: 99 %res.trunc = fcmp ogt <4 x float> %a, %b 100 %res = sext <4 x i1> %res.trunc to <4 x i32> 101 ret <4 x i32> %res 102; CHECK-LABEL: fcmpOgtVector 103; CHECK: cmpltps 104} 105; MIPS32-LABEL: fcmpOgtVector 106; MIPS32: c.ule.s 107; MIPS32: li [[R:.*]],1 108; MIPS32: movt [[R]],zero,$fcc0 109; MIPS32: c.ule.s 110; MIPS32: li [[R:.*]],1 111; MIPS32: movt [[R]],zero,$fcc0 112; MIPS32: c.ule.s 113; MIPS32: li [[R:.*]],1 114; MIPS32: movt [[R]],zero,$fcc0 115; MIPS32: c.ule.s 116; MIPS32: li [[R:.*]],1 117; MIPS32: movt [[R]],zero,$fcc0 118 119define internal <4 x i32> @fcmpOleVector(<4 x float> %a, <4 x float> %b) { 120entry: 121 %res.trunc = fcmp ole <4 x float> %a, %b 122 %res = sext <4 x i1> %res.trunc to <4 x i32> 123 ret <4 x i32> %res 124; CHECK-LABEL: fcmpOleVector 125; CHECK: cmpleps 126} 127; MIPS32-LABEL: fcmpOleVector 128; MIPS32: c.ole.s 129; MIPS32: li [[R:.*]],1 130; MIPS32: movf [[R]],zero,$fcc0 131; MIPS32: c.ole.s 132; MIPS32: li [[R:.*]],1 133; MIPS32: movf [[R]],zero,$fcc0 134; MIPS32: c.ole.s 135; MIPS32: li [[R:.*]],1 136; MIPS32: movf [[R]],zero,$fcc0 137; MIPS32: c.ole.s 138; MIPS32: li [[R:.*]],1 139; MIPS32: movf [[R]],zero,$fcc0 140 141define internal <4 x i32> @fcmpOltVector(<4 x float> %a, <4 x float> %b) { 142entry: 143 %res.trunc = fcmp olt <4 x float> %a, %b 144 %res = sext <4 x i1> %res.trunc to <4 x i32> 145 ret <4 x i32> %res 146; CHECK-LABEL: fcmpOltVector 147; CHECK: cmpltps 148} 149; MIPS32-LABEL: fcmpOltVector 150; MIPS32: c.olt.s 151; MIPS32: li [[R:.*]],1 152; MIPS32: movf [[R]],zero,$fcc0 153; MIPS32: c.olt.s 154; MIPS32: li [[R:.*]],1 155; MIPS32: movf [[R]],zero,$fcc0 156; MIPS32: c.olt.s 157; MIPS32: li [[R:.*]],1 158; MIPS32: movf [[R]],zero,$fcc0 159; MIPS32: c.olt.s 160; MIPS32: li [[R:.*]],1 161; MIPS32: movf [[R]],zero,$fcc0 162 163define internal <4 x i32> @fcmpOneVector(<4 x float> %a, <4 x float> %b) { 164entry: 165 %res.trunc = fcmp one <4 x float> %a, %b 166 %res = sext <4 x i1> %res.trunc to <4 x i32> 167 ret <4 x i32> %res 168; CHECK-LABEL: fcmpOneVector 169; CHECK: cmpneqps 170; CHECK: cmpordps 171; CHECK: pand 172} 173; MIPS32-LABEL: fcmpOneVector 174; MIPS32: c.ueq.s 175; MIPS32: li [[R:.*]],1 176; MIPS32: movt [[R]],zero,$fcc0 177; MIPS32: c.ueq.s 178; MIPS32: li [[R:.*]],1 179; MIPS32: movt [[R]],zero,$fcc0 180; MIPS32: c.ueq.s 181; MIPS32: li [[R:.*]],1 182; MIPS32: movt [[R]],zero,$fcc0 183; MIPS32: c.ueq.s 184; MIPS32: li [[R:.*]],1 185; MIPS32: movt [[R]],zero,$fcc0 186 187define internal <4 x i32> @fcmpOrdVector(<4 x float> %a, <4 x float> %b) { 188entry: 189 %res.trunc = fcmp ord <4 x float> %a, %b 190 %res = sext <4 x i1> %res.trunc to <4 x i32> 191 ret <4 x i32> %res 192; CHECK-LABEL: fcmpOrdVector 193; CHECK: cmpordps 194} 195; MIPS32-LABEL: fcmpOrdVector 196; MIPS32: c.un.s 197; MIPS32: li [[R:.*]],1 198; MIPS32: movt [[R]],zero,$fcc0 199; MIPS32: c.un.s 200; MIPS32: li [[R:.*]],1 201; MIPS32: movt [[R]],zero,$fcc0 202; MIPS32: c.un.s 203; MIPS32: li [[R:.*]],1 204; MIPS32: movt [[R]],zero,$fcc0 205; MIPS32: c.un.s 206; MIPS32: li [[R:.*]],1 207; MIPS32: movt [[R]],zero,$fcc0 208 209define internal <4 x i32> @fcmpTrueVector(<4 x float> %a, <4 x float> %b) { 210entry: 211 %res.trunc = fcmp true <4 x float> %a, %b 212 %res = sext <4 x i1> %res.trunc to <4 x i32> 213 ret <4 x i32> %res 214; CHECK-LABEL: fcmpTrueVector 215; CHECK: pcmpeqd 216} 217; MIPS32-LABEL: fcmpTrueVector 218; MIPS32: li v0,1 219; MIPS32: li v1,1 220; MIPS32: li a0,1 221; MIPS32: li a1,1 222 223define internal <4 x i32> @fcmpUeqVector(<4 x float> %a, <4 x float> %b) { 224entry: 225 %res.trunc = fcmp ueq <4 x float> %a, %b 226 %res = sext <4 x i1> %res.trunc to <4 x i32> 227 ret <4 x i32> %res 228; CHECK-LABEL: fcmpUeqVector 229; CHECK: cmpeqps 230; CHECK: cmpunordps 231; CHECK: por 232} 233; MIPS32-LABEL: fcmpUeqVector 234; MIPS32: c.ueq.s 235; MIPS32: li [[R:.*]],1 236; MIPS32: movf [[R]],zero,$fcc0 237; MIPS32: c.ueq.s 238; MIPS32: li [[R:.*]],1 239; MIPS32: movf [[R]],zero,$fcc0 240; MIPS32: c.ueq.s 241; MIPS32: li [[R:.*]],1 242; MIPS32: movf [[R]],zero,$fcc0 243; MIPS32: c.ueq.s 244; MIPS32: li [[R:.*]],1 245; MIPS32: movf [[R]],zero,$fcc0 246 247define internal <4 x i32> @fcmpUgeVector(<4 x float> %a, <4 x float> %b) { 248entry: 249 %res.trunc = fcmp uge <4 x float> %a, %b 250 %res = sext <4 x i1> %res.trunc to <4 x i32> 251 ret <4 x i32> %res 252; CHECK-LABEL: fcmpUgeVector 253; CHECK: cmpnltps 254} 255; MIPS32-LABEL: fcmpUgeVector 256; MIPS32: c.olt.s 257; MIPS32: li [[R:.*]],1 258; MIPS32: movt [[R]],zero,$fcc0 259; MIPS32: c.olt.s 260; MIPS32: li [[R:.*]],1 261; MIPS32: movt [[R]],zero,$fcc0 262; MIPS32: c.olt.s 263; MIPS32: li [[R:.*]],1 264; MIPS32: movt [[R]],zero,$fcc0 265; MIPS32: c.olt.s 266; MIPS32: li [[R:.*]],1 267; MIPS32: movt [[R]],zero,$fcc0 268 269define internal <4 x i32> @fcmpUgtVector(<4 x float> %a, <4 x float> %b) { 270entry: 271 %res.trunc = fcmp ugt <4 x float> %a, %b 272 %res = sext <4 x i1> %res.trunc to <4 x i32> 273 ret <4 x i32> %res 274; CHECK-LABEL: fcmpUgtVector 275; CHECK: cmpnleps 276} 277; MIPS32-LABEL: fcmpUgtVector 278; MIPS32: c.ole.s 279; MIPS32: li [[R:.*]],1 280; MIPS32: movt [[R]],zero,$fcc0 281; MIPS32: c.ole.s 282; MIPS32: li [[R:.*]],1 283; MIPS32: movt [[R]],zero,$fcc0 284; MIPS32: c.ole.s 285; MIPS32: li [[R:.*]],1 286; MIPS32: movt [[R]],zero,$fcc0 287; MIPS32: c.ole.s 288; MIPS32: li [[R:.*]],1 289; MIPS32: movt [[R]],zero,$fcc0 290 291define internal <4 x i32> @fcmpUleVector(<4 x float> %a, <4 x float> %b) { 292entry: 293 %res.trunc = fcmp ule <4 x float> %a, %b 294 %res = sext <4 x i1> %res.trunc to <4 x i32> 295 ret <4 x i32> %res 296; CHECK-LABEL: fcmpUleVector 297; CHECK: cmpnltps 298} 299; MIPS32-LABEL: fcmpUleVector 300; MIPS32: c.ule.s 301; MIPS32: li [[R:.*]],1 302; MIPS32: movf [[R]],zero,$fcc0 303; MIPS32: c.ule.s 304; MIPS32: li [[R:.*]],1 305; MIPS32: movf [[R]],zero,$fcc0 306; MIPS32: c.ule.s 307; MIPS32: li [[R:.*]],1 308; MIPS32: movf [[R]],zero,$fcc0 309; MIPS32: c.ule.s 310; MIPS32: li [[R:.*]],1 311; MIPS32: movf [[R]],zero,$fcc0 312 313define internal <4 x i32> @fcmpUltVector(<4 x float> %a, <4 x float> %b) { 314entry: 315 %res.trunc = fcmp ult <4 x float> %a, %b 316 %res = sext <4 x i1> %res.trunc to <4 x i32> 317 ret <4 x i32> %res 318; CHECK-LABEL: fcmpUltVector 319; CHECK: cmpnleps 320} 321; MIPS32-LABEL: fcmpUltVector 322; MIPS32: c.ult.s 323; MIPS32: li [[R:.*]],1 324; MIPS32: movf [[R]],zero,$fcc0 325; MIPS32: c.ult.s 326; MIPS32: li [[R:.*]],1 327; MIPS32: movf [[R]],zero,$fcc0 328; MIPS32: c.ult.s 329; MIPS32: li [[R:.*]],1 330; MIPS32: movf [[R]],zero,$fcc0 331; MIPS32: c.ult.s 332; MIPS32: li [[R:.*]],1 333; MIPS32: movf [[R]],zero,$fcc0 334 335define internal <4 x i32> @fcmpUneVector(<4 x float> %a, <4 x float> %b) { 336entry: 337 %res.trunc = fcmp une <4 x float> %a, %b 338 %res = sext <4 x i1> %res.trunc to <4 x i32> 339 ret <4 x i32> %res 340; CHECK-LABEL: fcmpUneVector 341; CHECK: cmpneqps 342} 343; MIPS32-LABEL: fcmpUneVector 344; MIPS32: c.eq.s 345; MIPS32: li [[R:.*]],1 346; MIPS32: movt [[R]],zero,$fcc0 347; MIPS32: c.eq.s 348; MIPS32: li [[R:.*]],1 349; MIPS32: movt [[R]],zero,$fcc0 350; MIPS32: c.eq.s 351; MIPS32: li [[R:.*]],1 352; MIPS32: movt [[R]],zero,$fcc0 353; MIPS32: c.eq.s 354; MIPS32: li [[R:.*]],1 355; MIPS32: movt [[R]],zero,$fcc0 356 357define internal <4 x i32> @fcmpUnoVector(<4 x float> %a, <4 x float> %b) { 358entry: 359 %res.trunc = fcmp uno <4 x float> %a, %b 360 %res = sext <4 x i1> %res.trunc to <4 x i32> 361 ret <4 x i32> %res 362; CHECK-LABEL: fcmpUnoVector 363; CHECK: cmpunordps 364} 365; MIPS32-LABEL: fcmpUnoVector 366; MIPS32: c.un.s 367; MIPS32: li [[R:.*]],1 368; MIPS32: movf [[R]],zero,$fcc0 369; MIPS32: c.un.s 370; MIPS32: li [[R:.*]],1 371; MIPS32: movf [[R]],zero,$fcc0 372; MIPS32: c.un.s 373; MIPS32: li [[R:.*]],1 374; MIPS32: movf [[R]],zero,$fcc0 375; MIPS32: c.un.s 376; MIPS32: li [[R:.*]],1 377; MIPS32: movf [[R]],zero,$fcc0 378