Skip to content

[MIPS] Add FeatureMSA to i6400 and i6500 cores #134985

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
May 7, 2025
4 changes: 2 additions & 2 deletions llvm/lib/Target/Mips/Mips.td
Original file line number Diff line number Diff line change
Expand Up @@ -242,11 +242,11 @@ def ImplP5600 : SubtargetFeature<"p5600", "ProcImpl",
// same CPU architecture.
def ImplI6400
: SubtargetFeature<"i6400", "ProcImpl", "MipsSubtarget::CPU::I6400",
"MIPS I6400 Processor", [FeatureMips64r6]>;
"MIPS I6400 Processor", [FeatureMips64r6, FeatureMSA]>;

def ImplI6500
: SubtargetFeature<"i6500", "ProcImpl", "MipsSubtarget::CPU::I6500",
"MIPS I6500 Processor", [FeatureMips64r6]>;
"MIPS I6500 Processor", [FeatureMips64r6, FeatureMSA]>;

class Proc<string Name, list<SubtargetFeature> Features>
: ProcessorModel<Name, MipsGenericModel, Features>;
Expand Down
69 changes: 69 additions & 0 deletions llvm/test/CodeGen/Mips/msa/i6500.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
; Test the MSA intrinsics that are encoded with the SPECIAL instruction format.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we use update_llc_test_checks.py to maintain this test?

Copy link
Contributor Author

@mgoudar mgoudar Apr 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have written driver test mips-cpus.c instead of codegen as you suggested.
as mips-cpus.c test, we need to enable MSA feature via -mmsa flag. I think we need to enable this as part of i6500 cpu flag by default via driver. please suggest.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have enabled MSA feature from driver also when -mcpu i6500/i6400 is specified. Also I have added codegen test to verify MSA instructions when i650/i6400 cpu is specified. please review


; RUN: llc -mtriple=mips-elf -mcpu=i6500 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS32
; RUN: llc -mtriple=mips64-elf -mcpu=i6500 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS64
; RUN: llc -mtriple=mips-elf -mcpu=i6500 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS32
; RUN: llc -mtriple=mips64-elf -mcpu=i6500 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS64
; RUN: llc -mtriple=mips64-elf -mcpu=i6500 -mattr=-msa < %s | \
; RUN: FileCheck %s --check-prefix=NO-DSLA
; RUN: llc -mtriple=mips-elf -mcpu=i6400 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS32
; RUN: llc -mtriple=mips64-elf -mcpu=i6400 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS64
; RUN: llc -mtriple=mips-elf -mcpu=i6400 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS32
; RUN: llc -mtriple=mips64-elf -mcpu=i6400 < %s | \
; RUN: FileCheck %s --check-prefix=MIPS64
; RUN: llc -mtriple=mips64-elf -mcpu=i6400 -mattr=-msa < %s | \
; RUN: FileCheck %s --check-prefix=NO-DSLA

define i32 @llvm_mips_lsa_test(i32 %a, i32 %b) nounwind {
entry:
%0 = tail call i32 @llvm.mips.lsa(i32 %a, i32 %b, i32 2)
ret i32 %0
}

declare i32 @llvm.mips.lsa(i32, i32, i32) nounwind

; MIPS32: llvm_mips_lsa_test:
; MIPS32: lsa {{\$[0-9]+}}, $5, $4, 2
; MIPS32: .size llvm_mips_lsa_test

define i32 @lsa_test(i32 %a, i32 %b) nounwind {
entry:
%0 = shl i32 %b, 2
%1 = add i32 %a, %0
ret i32 %1
}

; MIPS32: lsa_test:
; MIPS32: lsa {{\$[0-9]+}}, $5, $4, 2
; MIPS32: .size lsa_test

define i64 @llvm_mips_dlsa_test(i64 %a, i64 %b) nounwind {
entry:
%0 = tail call i64 @llvm.mips.dlsa(i64 %a, i64 %b, i32 2)
ret i64 %0
}

declare i64 @llvm.mips.dlsa(i64, i64, i32) nounwind

; MIPS64: llvm_mips_dlsa_test:
; MIPS64: dlsa {{\$[0-9]+}}, $5, $4, 2
; MIPS64: .size llvm_mips_dlsa_test
; NO-DSLA-NOT: dlsa {{\$[0-9]+}}, $5, $4, 2
define i64 @dlsa_test(i64 %a, i64 %b) nounwind {
entry:
%0 = shl i64 %b, 2
%1 = add i64 %a, %0
ret i64 %1
}

; MIPS64: dlsa_test:
; MIPS64: dlsa {{\$[0-9]+}}, $5, $4, 2
; MIPS64: .size dlsa_test
; NO-DSLA-NOT: dlsa {{\$[0-9]+}}, $5, $4, 2
Loading