1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=sse2 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; PR22428: https://llvm.org/bugs/show_bug.cgi?id=22428 4*9880d681SAndroid Build Coastguard Worker; f1, f2, f3, and f4 should use an integer logic instruction. 5*9880d681SAndroid Build Coastguard Worker; f9 and f10 should use an FP (SSE) logic instruction. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; f5, f6, f7, and f8 are less clear. 8*9880d681SAndroid Build Coastguard Worker; 9*9880d681SAndroid Build Coastguard Worker; For f5 and f6, we can save a register move by using an FP logic instruction, 10*9880d681SAndroid Build Coastguard Worker; but we may need to calculate the relative costs of an SSE op vs. int op vs. 11*9880d681SAndroid Build Coastguard Worker; scalar <-> SSE register moves. 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; For f7 and f8, the SSE instructions don't take immediate operands, so if we 14*9880d681SAndroid Build Coastguard Worker; use one of those, we either have to load a constant from memory or move the 15*9880d681SAndroid Build Coastguard Worker; scalar immediate value from an integer register over to an SSE register. 16*9880d681SAndroid Build Coastguard Worker; Optimizing for size may affect that decision. Also, note that there are no 17*9880d681SAndroid Build Coastguard Worker; scalar versions of the FP logic ops, so if we want to fold a load into a 18*9880d681SAndroid Build Coastguard Worker; logic op, we have to load or splat a 16-byte vector constant. 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; 1 FP operand, 1 int operand, int result 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(float %x, i32 %y) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 24*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %edi, %eax 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 30*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, %y 31*9880d681SAndroid Build Coastguard Worker ret i32 %and 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; Swap operands of the logic op. 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(float %x, i32 %y) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 38*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %edi, %eax 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 44*9880d681SAndroid Build Coastguard Worker %and = and i32 %y, %bc1 45*9880d681SAndroid Build Coastguard Worker ret i32 %and 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; 1 FP operand, 1 constant operand, int result 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(float %x) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 52*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $1, %eax 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 58*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, 1 59*9880d681SAndroid Build Coastguard Worker ret i32 %and 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; Swap operands of the logic op. 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(float %x) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 66*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl $2, %eax 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 72*9880d681SAndroid Build Coastguard Worker %and = and i32 2, %bc1 73*9880d681SAndroid Build Coastguard Worker ret i32 %and 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; 1 FP operand, 1 integer operand, FP result 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine float @f5(float %x, i32 %y) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 80*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %edi, %eax 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %eax, %xmm0 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 87*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, %y 88*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 89*9880d681SAndroid Build Coastguard Worker ret float %bc2 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; Swap operands of the logic op. 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine float @f6(float %x, i32 %y) { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 96*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %edi, %eax 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %eax, %xmm0 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 103*9880d681SAndroid Build Coastguard Worker %and = and i32 %y, %bc1 104*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 105*9880d681SAndroid Build Coastguard Worker ret float %bc2 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; 1 FP operand, 1 constant operand, FP result 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdefine float @f7(float %x) { 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 112*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm0 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 118*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, 3 119*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 120*9880d681SAndroid Build Coastguard Worker ret float %bc2 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; Swap operands of the logic op. 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine float @f8(float %x) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 127*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm0 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 133*9880d681SAndroid Build Coastguard Worker %and = and i32 4, %bc1 134*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 135*9880d681SAndroid Build Coastguard Worker ret float %bc2 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; 2 FP operands, int result 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(float %x, float %y) { 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 142*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm0 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %eax 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 148*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast float %y to i32 149*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, %bc2 150*9880d681SAndroid Build Coastguard Worker ret i32 %and 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; 2 FP operands, FP result 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine float @f10(float %x, float %y) { 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 157*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm0 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 162*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast float %y to i32 163*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, %bc2 164*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast i32 %and to float 165*9880d681SAndroid Build Coastguard Worker ret float %bc3 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine float @or(float %x, float %y) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or: 170*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm1, %xmm0 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 175*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast float %y to i32 176*9880d681SAndroid Build Coastguard Worker %and = or i32 %bc1, %bc2 177*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast i32 %and to float 178*9880d681SAndroid Build Coastguard Worker ret float %bc3 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine float @xor(float %x, float %y) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor: 183*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps %xmm1, %xmm0 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 188*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast float %y to i32 189*9880d681SAndroid Build Coastguard Worker %and = xor i32 %bc1, %bc2 190*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast i32 %and to float 191*9880d681SAndroid Build Coastguard Worker ret float %bc3 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine float @f7_or(float %x) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7_or: 196*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm1, %xmm0 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 202*9880d681SAndroid Build Coastguard Worker %and = or i32 %bc1, 3 203*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 204*9880d681SAndroid Build Coastguard Worker ret float %bc2 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine float @f7_xor(float %x) { 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7_xor: 209*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps %xmm1, %xmm0 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 215*9880d681SAndroid Build Coastguard Worker %and = xor i32 %bc1, 3 216*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 217*9880d681SAndroid Build Coastguard Worker ret float %bc2 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; Make sure that doubles work too. 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine double @doubles(double %x, double %y) { 223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: doubles: 224*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm0 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast double %x to i64 229*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast double %y to i64 230*9880d681SAndroid Build Coastguard Worker %and = and i64 %bc1, %bc2 231*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast i64 %and to double 232*9880d681SAndroid Build Coastguard Worker ret double %bc3 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdefine double @f7_double(double %x) { 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7_double: 237*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm0 240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast double %x to i64 243*9880d681SAndroid Build Coastguard Worker %and = and i64 %bc1, 3 244*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i64 %and to double 245*9880d681SAndroid Build Coastguard Worker ret double %bc2 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker; Grabbing the sign bit is a special case that could be handled 249*9880d681SAndroid Build Coastguard Worker; by movmskps/movmskpd, but if we're not shifting it over, then 250*9880d681SAndroid Build Coastguard Worker; a simple FP logic op is cheaper. 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerdefine float @movmsk(float %x) { 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: movmsk: 254*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm0 257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 260*9880d681SAndroid Build Coastguard Worker %and = and i32 %bc1, 2147483648 261*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %and to float 262*9880d681SAndroid Build Coastguard Worker ret float %bc2 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_fabs(double %x) { 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fabs: 267*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd {{.*}}(%rip), %xmm0 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 270*9880d681SAndroid Build Coastguard Worker; 271*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast double %x to i64 272*9880d681SAndroid Build Coastguard Worker %and = and i64 %bc1, 9223372036854775807 273*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i64 %and to double 274*9880d681SAndroid Build Coastguard Worker ret double %bc2 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_fneg(float %x) { 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fneg: 279*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps {{.*}}(%rip), %xmm0 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 282*9880d681SAndroid Build Coastguard Worker; 283*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 284*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %bc1, 2147483648 285*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %xor to float 286*9880d681SAndroid Build Coastguard Worker ret float %bc2 287*9880d681SAndroid Build Coastguard Worker} 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @bitcast_fabs_vec(<2 x double> %x) { 290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fabs_vec: 291*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps {{.*}}(%rip), %xmm0 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 294*9880d681SAndroid Build Coastguard Worker; 295*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <2 x double> %x to <2 x i64> 296*9880d681SAndroid Build Coastguard Worker %and = and <2 x i64> %bc1, <i64 9223372036854775807, i64 9223372036854775807> 297*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <2 x i64> %and to <2 x double> 298*9880d681SAndroid Build Coastguard Worker ret <2 x double> %bc2 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @bitcast_fneg_vec(<4 x float> %x) { 302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fneg_vec: 303*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps {{.*}}(%rip), %xmm0 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 306*9880d681SAndroid Build Coastguard Worker; 307*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x float> %x to <4 x i32> 308*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %bc1, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648> 309*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x i32> %xor to <4 x float> 310*9880d681SAndroid Build Coastguard Worker ret <4 x float> %bc2 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313