mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-03 02:30:00 +00:00
Allow vector fabs operations on bitcasted constant integer values to be optimized in the same way that we already optimize scalar fabs. So for code like this: %bitcast = bitcast i64 18446744069414584320 to <2 x float> ; 0xFFFF_FFFF_0000_0000 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %bitcast) %ret = bitcast <2 x float> %fabs to i64 Instead of generating something like this: movabsq (constant pool loadi of mask for sign bits) vmovq (move from integer register to vector/fp register) vandps (mask off sign bits) vmovq (move vector/fp register back to integer return register) We should generate: mov (put constant value in return register) I have also removed a redundant clause in the first 'if' statement: N0.getOperand(0).getValueType().isInteger() is the same thing as: IntVT.isInteger() Testcases for x86 and ARM added to existing files that deal with vector fabs. One existing testcase for x86 removed because it is no longer ideal. For more background, please see: http://reviews.llvm.org/D4770 And: http://llvm.org/bugs/show_bug.cgi?id=20354 Differential Revision: http://reviews.llvm.org/D4785 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214892 91177308-0d34-0410-b5e6-96231b3b80d8
55 lines
1.5 KiB
LLVM
55 lines
1.5 KiB
LLVM
; RUN: llc < %s -mtriple=armv7-eabi -float-abi=hard -mcpu=cortex-a8 | FileCheck %s
|
|
|
|
; CHECK-LABEL: test:
|
|
; CHECK: vabs.f32 q0, q0
|
|
define <4 x float> @test(<4 x float> %a) {
|
|
%foo = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
|
|
ret <4 x float> %foo
|
|
}
|
|
declare <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
|
|
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: vabs.f32 d0, d0
|
|
define <2 x float> @test2(<2 x float> %a) {
|
|
%foo = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
|
|
ret <2 x float> %foo
|
|
}
|
|
declare <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
|
|
|
|
; No constant pool loads or vector ops are needed for the fabs of a
|
|
; bitcasted integer constant; we should just return integer constants
|
|
; that have the sign bits turned off.
|
|
;
|
|
; So instead of something like this:
|
|
; mvn r0, #0
|
|
; mov r1, #0
|
|
; vmov d16, r1, r0
|
|
; vabs.f32 d16, d16
|
|
; vmov r0, r1, d16
|
|
; bx lr
|
|
;
|
|
; We should generate:
|
|
; mov r0, #0
|
|
; mvn r1, #-2147483648
|
|
; mov pc, lr
|
|
|
|
; CHECK-LABEL: fabs_v2f32_1
|
|
define i64 @fabs_v2f32_1() {
|
|
%bitcast = bitcast i64 18446744069414584320 to <2 x float> ; 0xFFFF_FFFF_0000_0000
|
|
%fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %bitcast)
|
|
%ret = bitcast <2 x float> %fabs to i64
|
|
ret i64 %ret
|
|
; CHECK: mvn r1, #-2147483648
|
|
; CHECK-NOT: vabs
|
|
}
|
|
|
|
; CHECK-LABEL: fabs_v2f32_2
|
|
define i64 @fabs_v2f32_2() {
|
|
%bitcast = bitcast i64 4294967295 to <2 x float> ; 0x0000_0000_FFFF_FFFF
|
|
%fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %bitcast)
|
|
%ret = bitcast <2 x float> %fabs to i64
|
|
ret i64 %ret
|
|
; CHECK: mvn r0, #-2147483648
|
|
; CHECK-NOT: vabs
|
|
}
|