1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=X32 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X64 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=X64 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @fabs_v2f64(<2 x double> %p) { 8*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v2f64: 9*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 10*9880d681SAndroid Build Coastguard Worker; X32-NEXT: vandpd .LCPI0_0, %xmm0, %xmm0 11*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v2f64: 14*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 15*9880d681SAndroid Build Coastguard Worker; X64-NEXT: vandpd {{.*}}(%rip), %xmm0, %xmm0 16*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 17*9880d681SAndroid Build Coastguard Worker %t = call <2 x double> @llvm.fabs.v2f64(<2 x double> %p) 18*9880d681SAndroid Build Coastguard Worker ret <2 x double> %t 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.fabs.v2f64(<2 x double> %p) 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fabs_v4f32(<4 x float> %p) { 23*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v4f32: 24*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 25*9880d681SAndroid Build Coastguard Worker; X32-NEXT: vandps .LCPI1_0, %xmm0, %xmm0 26*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 27*9880d681SAndroid Build Coastguard Worker; 28*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v4f32: 29*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 30*9880d681SAndroid Build Coastguard Worker; X64-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0 31*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 32*9880d681SAndroid Build Coastguard Worker %t = call <4 x float> @llvm.fabs.v4f32(<4 x float> %p) 33*9880d681SAndroid Build Coastguard Worker ret <4 x float> %t 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.fabs.v4f32(<4 x float> %p) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @fabs_v4f64(<4 x double> %p) { 38*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v4f64: 39*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 40*9880d681SAndroid Build Coastguard Worker; X32-NEXT: vandpd .LCPI2_0, %ymm0, %ymm0 41*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v4f64: 44*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 45*9880d681SAndroid Build Coastguard Worker; X64-NEXT: vandpd {{.*}}(%rip), %ymm0, %ymm0 46*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 47*9880d681SAndroid Build Coastguard Worker %t = call <4 x double> @llvm.fabs.v4f64(<4 x double> %p) 48*9880d681SAndroid Build Coastguard Worker ret <4 x double> %t 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.fabs.v4f64(<4 x double> %p) 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @fabs_v8f32(<8 x float> %p) { 53*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v8f32: 54*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 55*9880d681SAndroid Build Coastguard Worker; X32-NEXT: vandps .LCPI3_0, %ymm0, %ymm0 56*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v8f32: 59*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 60*9880d681SAndroid Build Coastguard Worker; X64-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 61*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 62*9880d681SAndroid Build Coastguard Worker %t = call <8 x float> @llvm.fabs.v8f32(<8 x float> %p) 63*9880d681SAndroid Build Coastguard Worker ret <8 x float> %t 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.fabs.v8f32(<8 x float> %p) 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; PR20354: when generating code for a vector fabs op, 68*9880d681SAndroid Build Coastguard Worker; make sure that we're only turning off the sign bit of each float value. 69*9880d681SAndroid Build Coastguard Worker; No constant pool loads or vector ops are needed for the fabs of a 70*9880d681SAndroid Build Coastguard Worker; bitcasted integer constant; we should just return an integer constant 71*9880d681SAndroid Build Coastguard Worker; that has the sign bits turned off. 72*9880d681SAndroid Build Coastguard Worker; 73*9880d681SAndroid Build Coastguard Worker; So instead of something like this: 74*9880d681SAndroid Build Coastguard Worker; movabsq (constant pool load of mask for sign bits) 75*9880d681SAndroid Build Coastguard Worker; vmovq (move from integer register to vector/fp register) 76*9880d681SAndroid Build Coastguard Worker; vandps (mask off sign bits) 77*9880d681SAndroid Build Coastguard Worker; vmovq (move vector/fp register back to integer return register) 78*9880d681SAndroid Build Coastguard Worker; 79*9880d681SAndroid Build Coastguard Worker; We should generate: 80*9880d681SAndroid Build Coastguard Worker; mov (put constant value in return register) 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine i64 @fabs_v2f32_1() { 83*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v2f32_1: 84*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 85*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %eax, %eax 86*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF 87*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 88*9880d681SAndroid Build Coastguard Worker; 89*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v2f32_1: 90*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 91*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movabsq $9223372032559808512, %rax # imm = 0x7FFFFFFF00000000 92*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 93*9880d681SAndroid Build Coastguard Worker %bitcast = bitcast i64 18446744069414584320 to <2 x float> ; 0xFFFF_FFFF_0000_0000 94*9880d681SAndroid Build Coastguard Worker %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %bitcast) 95*9880d681SAndroid Build Coastguard Worker %ret = bitcast <2 x float> %fabs to i64 96*9880d681SAndroid Build Coastguard Worker ret i64 %ret 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine i64 @fabs_v2f32_2() { 100*9880d681SAndroid Build Coastguard Worker; X32-LABEL: fabs_v2f32_2: 101*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 102*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF 103*9880d681SAndroid Build Coastguard Worker; X32-NEXT: xorl %edx, %edx 104*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 105*9880d681SAndroid Build Coastguard Worker; 106*9880d681SAndroid Build Coastguard Worker; X64-LABEL: fabs_v2f32_2: 107*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 108*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF 109*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 110*9880d681SAndroid Build Coastguard Worker %bitcast = bitcast i64 4294967295 to <2 x float> ; 0x0000_0000_FFFF_FFFF 111*9880d681SAndroid Build Coastguard Worker %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %bitcast) 112*9880d681SAndroid Build Coastguard Worker %ret = bitcast <2 x float> %fabs to i64 113*9880d681SAndroid Build Coastguard Worker ret i64 %ret 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @llvm.fabs.v2f32(<2 x float> %p) 117