summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Mips
diff options
context:
space:
mode:
authorStefan Maksimovic <stefan.maksimovic@mips.com>2018-02-08 09:25:17 +0000
committerStefan Maksimovic <stefan.maksimovic@mips.com>2018-02-08 09:25:17 +0000
commitb3e7ed3b941b3477b7797860eb99cb5154ba015e (patch)
tree0ad069284c49ea0e3c4cea9eeed2db247febe326 /llvm/test/CodeGen/Mips
parent820553fdb1e0cb49ac99a66bc5fd078283bb1a60 (diff)
downloadbcm5719-llvm-b3e7ed3b941b3477b7797860eb99cb5154ba015e.tar.gz
bcm5719-llvm-b3e7ed3b941b3477b7797860eb99cb5154ba015e.zip
[mips] Define certain instructions in microMIPS32r3
Instructions affected: mthc1, mfhc1, add.d, sub.d, mul.d, div.d, mov.d, neg.d, cvt.w.d, cvt.d.s, cvt.d.w, cvt.s.d These instructions are now defined for microMIPS32r3 + microMIPS32r6 in MicroMipsInstrFPU.td since they shared their encoding with those already defined in microMIPS32r6InstrInfo.td and have been therefore removed from the latter file. Some instructions present in MicroMipsInstrFPU.td which did not have both AFGR64 and FGR64 variants defined have been altered to do so. Differential revision: https://reviews.llvm.org/D42738 llvm-svn: 324584
Diffstat (limited to 'llvm/test/CodeGen/Mips')
-rw-r--r--llvm/test/CodeGen/Mips/llvm-ir/arith-fp.ll55
-rw-r--r--llvm/test/CodeGen/Mips/llvm-ir/bitcast.ll30
-rw-r--r--llvm/test/CodeGen/Mips/llvm-ir/cvt.ll37
-rw-r--r--llvm/test/CodeGen/Mips/maxcallframesize.ll17
4 files changed, 139 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Mips/llvm-ir/arith-fp.ll b/llvm/test/CodeGen/Mips/llvm-ir/arith-fp.ll
new file mode 100644
index 00000000000..33a86bbc5de
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/llvm-ir/arith-fp.ll
@@ -0,0 +1,55 @@
+; RUN: llc -march=mips -mcpu=mips32 -asm-show-inst < %s | FileCheck %s --check-prefix=MIPS32
+; RUN: llc -march=mips -mcpu=mips32r2 -mattr=+fp64 -asm-show-inst < %s | FileCheck %s --check-prefix=MIPS32FP64
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips -asm-show-inst < %s | FileCheck %s --check-prefix=MM
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips,+fp64 -asm-show-inst < %s | FileCheck %s --check-prefix=MMFP64
+; RUN: llc -march=mips -mcpu=mips32r6 -mattr=+micromips -asm-show-inst < %s | FileCheck %s --check-prefix=MMR6
+
+define double @add_d(double %a, double %b) {
+; MIPS32: add.d {{.*}} # <MCInst #{{[0-9]+}} FADD_D32
+; MIPS32FP64: add.d {{.*}} # <MCInst #{{[0-9]+}} FADD_D64
+; MM: add.d {{.*}} # <MCInst #{{[0-9]+}} FADD_D32_MM
+; MMFP64: add.d {{.*}} # <MCInst #{{[0-9]+}} FADD_D64_MM
+; MMR6: add.d {{.*}} # <MCInst #{{[0-9]+}} FADD_D64_MM
+ %1 = fadd double %a, %b
+ ret double %1
+}
+
+define double @sub_d(double %a, double %b) {
+; MIPS32: sub.d {{.*}} # <MCInst #{{[0-9]+}} FSUB_D32
+; MIPS32FP64: sub.d {{.*}} # <MCInst #{{[0-9]+}} FSUB_D64
+; MM: sub.d {{.*}} # <MCInst #{{[0-9]+}} FSUB_D32_MM
+; MMFP64: sub.d {{.*}} # <MCInst #{{[0-9]+}} FSUB_D64_MM
+; MMR6: sub.d {{.*}} # <MCInst #{{[0-9]+}} FSUB_D64_MM
+ %1 = fsub double %a, %b
+ ret double %1
+}
+
+define double @mul_d(double %a, double %b) {
+; MIPS32: mul.d {{.*}} # <MCInst #{{[0-9]+}} FMUL_D32
+; MIPS32FP64: mul.d {{.*}} # <MCInst #{{[0-9]+}} FMUL_D64
+; MM: mul.d {{.*}} # <MCInst #{{[0-9]+}} FMUL_D32_MM
+; MMFP64: mul.d {{.*}} # <MCInst #{{[0-9]+}} FMUL_D64_MM
+; MMR6: mul.d {{.*}} # <MCInst #{{[0-9]+}} FMUL_D64_MM
+ %1 = fmul double %a, %b
+ ret double %1
+}
+
+define double @div_d(double %a, double %b) {
+; MIPS32: div.d {{.*}} # <MCInst #{{[0-9]+}} FDIV_D32
+; MIPS32FP64: div.d {{.*}} # <MCInst #{{[0-9]+}} FDIV_D64
+; MM: div.d {{.*}} # <MCInst #{{[0-9]+}} FDIV_D32_MM
+; MMFP64: div.d {{.*}} # <MCInst #{{[0-9]+}} FDIV_D64_MM
+; MMR6: div.d {{.*}} # <MCInst #{{[0-9]+}} FDIV_D64_MM
+ %1 = fdiv double %a, %b
+ ret double %1
+}
+
+define double @fneg(double %a) {
+; MIPS32: neg.d {{.*}} # <MCInst #{{[0-9]+}} FNEG_D32
+; MIPS32FP64: neg.d {{.*}} # <MCInst #{{[0-9]+}} FNEG_D64
+; MM: neg.d {{.*}} # <MCInst #{{[0-9]+}} FNEG_D32_MM
+; MMFP64: neg.d {{.*}} # <MCInst #{{[0-9]+}} FNEG_D64_MM
+; MMR6: neg.d {{.*}} # <MCInst #{{[0-9]+}} FNEG_D64_MM
+ %1 = fsub double -0.000000e+00, %a
+ ret double %1
+}
diff --git a/llvm/test/CodeGen/Mips/llvm-ir/bitcast.ll b/llvm/test/CodeGen/Mips/llvm-ir/bitcast.ll
new file mode 100644
index 00000000000..6593103de8d
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/llvm-ir/bitcast.ll
@@ -0,0 +1,30 @@
+; RUN: llc -march=mips -mcpu=mips32r2 -asm-show-inst \
+; RUN: -mno-ldc1-sdc1 < %s | FileCheck %s --check-prefix=MIPS32R2
+; RUN: llc -march=mips -mcpu=mips32r2 -mattr=+fp64 -asm-show-inst \
+; RUN: -mno-ldc1-sdc1 < %s | FileCheck %s --check-prefix=MIPS32FP64
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips -asm-show-inst \
+; RUN: -mno-ldc1-sdc1 < %s | FileCheck %s --check-prefix=MM
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips,+fp64 -asm-show-inst \
+; RUN: -mno-ldc1-sdc1 < %s | FileCheck %s --check-prefix=MMFP64
+; RUN: llc -march=mips -mcpu=mips32r6 -mattr=+micromips -asm-show-inst \
+; RUN: -mno-ldc1-sdc1 < %s | FileCheck %s --check-prefix=MMR6
+
+define double @mthc1(i64 %a) {
+; MIPS32R2: mthc1 {{.*}} # <MCInst #{{[0-9]+}} MTHC1_D32
+; MIPS32FP64: mthc1 {{.*}} # <MCInst #{{[0-9]+}} MTHC1_D64
+; MM: mthc1 {{.*}} # <MCInst #{{[0-9]+}} MTHC1_D32_MM
+; MMFP64: mthc1 {{.*}} # <MCInst #{{[0-9]+}} MTHC1_D64_MM
+; MMR6: mthc1 {{.*}} # <MCInst #{{[0-9]+}} MTHC1_D64_MM
+ %1 = bitcast i64 %a to double
+ ret double %1
+}
+
+define i64 @mfhc1(double %a) {
+; MIPS32R2: mfhc1 {{.*}} # <MCInst #{{[0-9]+}} MFHC1_D32
+; MIPS32FP64: mfhc1 {{.*}} # <MCInst #{{[0-9]+}} MFHC1_D64
+; MM: mfhc1 {{.*}} # <MCInst #{{[0-9]+}} MFHC1_D32_MM
+; MMFP64: mfhc1 {{.*}} # <MCInst #{{[0-9]+}} MFHC1_D64_MM
+; MMR6: mfhc1 {{.*}} # <MCInst #{{[0-9]+}} MFHC1_D64_MM
+ %1 = bitcast double %a to i64
+ ret i64 %1
+}
diff --git a/llvm/test/CodeGen/Mips/llvm-ir/cvt.ll b/llvm/test/CodeGen/Mips/llvm-ir/cvt.ll
new file mode 100644
index 00000000000..04368f202fa
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/llvm-ir/cvt.ll
@@ -0,0 +1,37 @@
+; RUN: llc -march=mips -mcpu=mips32 -asm-show-inst < %s | FileCheck %s --check-prefix=MIPS32
+; RUN: llc -march=mips -mcpu=mips32r2 -mattr=+fp64 -asm-show-inst < %s | FileCheck %s --check-prefix=MIPS32FP64
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips -asm-show-inst < %s | FileCheck %s --check-prefix=MM
+; RUN: llc -march=mips -mcpu=mips32r3 -mattr=+micromips,+fp64 -asm-show-inst < %s | FileCheck %s --check-prefix=MMFP64
+; RUN: llc -march=mips -mcpu=mips32r6 -mattr=+micromips -asm-show-inst < %s | FileCheck %s --check-prefix=MMR6
+
+; TODO: Test for cvt_w_d is missing, could not generate instruction
+
+define double @cvt_d_s(float %a) {
+; MIPS32: cvt.d.s {{.*}} # <MCInst #{{[0-9]+}} CVT_D32_S
+; MIPS32FP64: cvt.d.s {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_S
+; MM: cvt.d.s {{.*}} # <MCInst #{{[0-9]+}} CVT_D32_S_MM
+; MMFP64: cvt.d.s {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_S_MM
+; MMR6: cvt.d.s {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_S_MM
+ %1 = fpext float %a to double
+ ret double %1
+}
+
+define double @cvt_d_w(i32 %a) {
+; MIPS32: cvt.d.w {{.*}} # <MCInst #{{[0-9]+}} CVT_D32_W
+; MIPS32FP64: cvt.d.w {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_W
+; MM: cvt.d.w {{.*}} # <MCInst #{{[0-9]+}} CVT_D32_W_MM
+; MMFP64: cvt.d.w {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_W_MM
+; MMR6: cvt.d.w {{.*}} # <MCInst #{{[0-9]+}} CVT_D64_W_MM
+ %1 = sitofp i32 %a to double
+ ret double %1
+}
+
+define float @cvt_s_d(double %a) {
+; MIPS32: cvt.s.d {{.*}} # <MCInst #{{[0-9]+}} CVT_S_D32
+; MIPS32FP64: cvt.s.d {{.*}} # <MCInst #{{[0-9]+}} CVT_S_D64
+; MM: cvt.s.d {{.*}} # <MCInst #{{[0-9]+}} CVT_S_D32_MM
+; MMFP64: cvt.s.d {{.*}} # <MCInst #{{[0-9]+}} CVT_S_D64_MM
+; MMR6: cvt.s.d {{.*}} # <MCInst #{{[0-9]+}} CVT_S_D64_MM
+ %1 = fptrunc double %a to float
+ ret float %1
+}
diff --git a/llvm/test/CodeGen/Mips/maxcallframesize.ll b/llvm/test/CodeGen/Mips/maxcallframesize.ll
new file mode 100644
index 00000000000..a980467eb29
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/maxcallframesize.ll
@@ -0,0 +1,17 @@
+; RUN: llc < %s -mtriple=mips-unknown-linux -stop-before=prologepilog | FileCheck %s
+
+; Test that maxCallFrameSize is being computed early on.
+
+@glob = external global i32*
+
+declare void @bar(i32*, [20000 x i8]* byval)
+
+define void @foo([20000 x i8]* %addr) {
+ %tmp = alloca [4 x i32], align 32
+ %tmp0 = getelementptr [4 x i32], [4 x i32]* %tmp, i32 0, i32 0
+ call void @bar(i32* %tmp0, [20000 x i8]* byval %addr)
+ ret void
+}
+
+; CHECK: adjustsStack: true
+; CHECK: maxCallFrameSize: 20008
OpenPOWER on IntegriCloud