Use ".arch_extension" ARM directive to support hwdiv on krait

In case of "krait" CPU, asm printer doesn't emit any ".cpu" so the
features bits are not computed. This patch lets the asm printer
emit ".cpu cortex-a9" directive for krait and the hwdiv feature is
enabled through ".arch_extension". In short, krait is treated
as "cortex-a9" with hwdiv. We can not emit ".krait" as CPU since
it is not supported bu GNU GAS yet

llvm-svn: 230651
This commit is contained in:
Sumanth Gundapaneni 2015-02-26 18:08:41 +00:00
parent a9049ea368
commit 28a3b86b06
2 changed files with 48 additions and 3 deletions

View File

@ -16,6 +16,7 @@
#include "ARM.h"
#include "ARMConstantPoolValue.h"
#include "ARMFPUName.h"
#include "ARMArchExtName.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMTargetMachine.h"
#include "ARMTargetObjectFile.h"
@ -668,9 +669,17 @@ void ARMAsmPrinter::emitAttributes() {
std::string CPUString = STI.getCPUString();
// FIXME: remove krait check when GNU tools support krait cpu
if (CPUString != "generic" && CPUString != "krait")
ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, CPUString);
if (CPUString != "generic") {
// FIXME: remove krait check when GNU tools support krait cpu
if (STI.isKrait()) {
ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, "cortex-a9");
// We consider krait as a "cortex-a9" + hwdiv CPU
// Enable hwdiv through ".arch_extension idiv"
if (STI.hasDivide() || STI.hasDivideInARMMode())
ATS.emitArchExtension(ARM::HWDIV);
} else
ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, CPUString);
}
ATS.emitAttribute(ARMBuildAttrs::CPU_arch, getArchForCPU(CPUString, &STI));

View File

@ -0,0 +1,36 @@
; Tests the genration of ".arch_extension" attribute for hardware
; division on krait CPU. For now, krait is recognized as "cortex-a9" + hwdiv
; Also, tests for the hwdiv instruction on krait CPU
; check for arch_extension/cpu directive
; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=krait | FileCheck %s --check-prefix=DIV_EXTENSION
; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=krait | FileCheck %s --check-prefix=DIV_EXTENSION
; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a9 | FileCheck %s --check-prefix=NODIV_KRAIT
; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=cortex-a9 | FileCheck %s --check-prefix=NODIV_KRAIT
; RUN: llc < %s -mcpu=krait -mattr=-hwdiv,-hwdiv-arm | FileCheck %s --check-prefix=NODIV_KRAIT
; check if correct instruction is emitted by integrated assembler
; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=krait -filetype=obj | llvm-objdump -mcpu=krait -triple armv7-linux-gnueabi -d - | FileCheck %s --check-prefix=HWDIV
; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=krait -filetype=obj | llvm-objdump -mcpu=krait -triple thumbv7-linux-gnueabi -d - | FileCheck %s --check-prefix=HWDIV
; arch_extension attribute
; DIV_EXTENSION: .cpu cortex-a9
; DIV_EXTENSION: .arch_extension idiv
; NODIV_KRAIT-NOT: .arch_extension idiv
; HWDIV: sdiv
define i32 @main() #0 {
entry:
%retval = alloca i32, align 4
%a = alloca i32, align 4
%b = alloca i32, align 4
%c = alloca i32, align 4
store i32 0, i32* %retval
store volatile i32 100, i32* %b, align 4
store volatile i32 32, i32* %c, align 4
%0 = load volatile i32* %b, align 4
%1 = load volatile i32* %c, align 4
%div = sdiv i32 %0, %1
store volatile i32 %div, i32* %a, align 4
ret i32 0
}