[llvm] [Mips] Support "$sp" named register (PR #171793)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 02:12:58 PST 2025
https://github.com/yingopq created https://github.com/llvm/llvm-project/pull/171793
Because previous pr:
https://github.com/llvm/llvm-project/pull/136821 has test failures on builder llvm-clang-x86_64-expensive-checks-ubuntu when enable `-verify-machineinstrs`. So revert that pr.
This new pr change:
1. add `-verify-machineinstrs` in RUN command.
2. wirte register before reading to avoid error `Bad machine code: Using an undefined physical register`.
Fix #47656.
>From 3e41f3a8599a44e9d0f33c71196b788d4eb2f5f6 Mon Sep 17 00:00:00 2001
From: Ying Huang <ying.huang at oss.cipunited.com>
Date: Wed, 12 Nov 2025 04:43:31 -0500
Subject: [PATCH] [Mips] Support "$sp" named register
Because previous pr:
https://github.com/llvm/llvm-project/pull/136821 has test failures
on builder llvm-clang-x86_64-expensive-checks-ubuntu when enable
`-verify-machineinstrs`. So revert that pr.
This new pr change:
1. add `-verify-machineinstrs` in RUN command.
2. wirte register before reading to avoid error `Bad machine code:
Using an undefined physical register`.
Fix #47656.
---
llvm/lib/Target/Mips/MipsISelLowering.cpp | 102 +++++-
llvm/lib/Target/Mips/MipsISelLowering.h | 2 +
llvm/test/CodeGen/Mips/named-register-n32.ll | 359 +++++++++++++++++-
llvm/test/CodeGen/Mips/named-register-n64.ll | 359 +++++++++++++++++-
llvm/test/CodeGen/Mips/named-register-o32.ll | 361 ++++++++++++++++++-
5 files changed, 1143 insertions(+), 40 deletions(-)
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp
index 2fd73275721b1..09ca39aae7877 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp
@@ -72,6 +72,8 @@
#include <cstdint>
#include <deque>
#include <iterator>
+#include <regex>
+#include <string>
#include <utility>
#include <vector>
@@ -4938,25 +4940,101 @@ MipsTargetLowering::emitPseudoD_SELECT(MachineInstr &MI,
return BB;
}
+// Copies the function MipsAsmParser::matchCPURegisterName.
+int MipsTargetLowering::getCPURegisterIndex(StringRef Name) const {
+ int CC;
+
+ CC = StringSwitch<unsigned>(Name)
+ .Case("zero", 0)
+ .Case("at", 1)
+ .Case("AT", 1)
+ .Case("a0", 4)
+ .Case("a1", 5)
+ .Case("a2", 6)
+ .Case("a3", 7)
+ .Case("v0", 2)
+ .Case("v1", 3)
+ .Case("s0", 16)
+ .Case("s1", 17)
+ .Case("s2", 18)
+ .Case("s3", 19)
+ .Case("s4", 20)
+ .Case("s5", 21)
+ .Case("s6", 22)
+ .Case("s7", 23)
+ .Case("k0", 26)
+ .Case("k1", 27)
+ .Case("gp", 28)
+ .Case("sp", 29)
+ .Case("fp", 30)
+ .Case("s8", 30)
+ .Case("ra", 31)
+ .Case("t0", 8)
+ .Case("t1", 9)
+ .Case("t2", 10)
+ .Case("t3", 11)
+ .Case("t4", 12)
+ .Case("t5", 13)
+ .Case("t6", 14)
+ .Case("t7", 15)
+ .Case("t8", 24)
+ .Case("t9", 25)
+ .Default(-1);
+
+ if (!(ABI.IsN32() || ABI.IsN64()))
+ return CC;
+
+ // Although SGI documentation just cuts out t0-t3 for n32/n64,
+ // GNU pushes the values of t0-t3 to override the o32/o64 values for t4-t7
+ // We are supporting both cases, so for t0-t3 we'll just push them to t4-t7.
+ if (8 <= CC && CC <= 11)
+ CC += 4;
+
+ if (CC == -1)
+ CC = StringSwitch<unsigned>(Name)
+ .Case("a4", 8)
+ .Case("a5", 9)
+ .Case("a6", 10)
+ .Case("a7", 11)
+ .Case("kt0", 26)
+ .Case("kt1", 27)
+ .Default(-1);
+
+ return CC;
+}
+
// FIXME? Maybe this could be a TableGen attribute on some registers and
// this table could be generated automatically from RegInfo.
Register
MipsTargetLowering::getRegisterByName(const char *RegName, LLT VT,
const MachineFunction &MF) const {
- // The Linux kernel uses $28 and sp.
- if (Subtarget.isGP64bit()) {
- Register Reg = StringSwitch<Register>(RegName)
- .Case("$28", Mips::GP_64)
- .Case("sp", Mips::SP_64)
- .Default(Register());
- return Reg;
+ // 1. Delete symbol '$'.
+ std::string newRegName = RegName;
+ if (StringRef(RegName).starts_with("$"))
+ newRegName = StringRef(RegName).substr(1);
+
+ // 2. Get register index value.
+ std::smatch matchResult;
+ int regIdx;
+ static const std::regex matchStr("^[0-9]*$");
+ if (std::regex_match(newRegName, matchResult, matchStr))
+ regIdx = std::stoi(newRegName);
+ else {
+ newRegName = StringRef(newRegName).lower();
+ regIdx = getCPURegisterIndex(StringRef(newRegName));
+ }
+
+ // 3. Get register.
+ if (regIdx >= 0 && regIdx < 32) {
+ const MCRegisterInfo *MRI = MF.getContext().getRegisterInfo();
+ const MCRegisterClass &RC = Subtarget.isGP64bit()
+ ? MRI->getRegClass(Mips::GPR64RegClassID)
+ : MRI->getRegClass(Mips::GPR32RegClassID);
+ return RC.getRegister(regIdx);
}
- Register Reg = StringSwitch<Register>(RegName)
- .Case("$28", Mips::GP)
- .Case("sp", Mips::SP)
- .Default(Register());
- return Reg;
+ report_fatal_error(
+ Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
}
MachineBasicBlock *MipsTargetLowering::emitLDR_W(MachineInstr &MI,
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h
index 25a0bf9b797d5..02152fce5e57f 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.h
+++ b/llvm/lib/Target/Mips/MipsISelLowering.h
@@ -717,6 +717,8 @@ class TargetRegisterClass;
return true;
}
+ int getCPURegisterIndex(StringRef Name) const;
+
/// Emit a sign-extension using sll/sra, seb, or seh appropriately.
MachineBasicBlock *emitSignExtendToI32InReg(MachineInstr &MI,
MachineBasicBlock *BB,
diff --git a/llvm/test/CodeGen/Mips/named-register-n32.ll b/llvm/test/CodeGen/Mips/named-register-n32.ll
index 112e04e14b2ac..ab7a91e9e7cb9 100644
--- a/llvm/test/CodeGen/Mips/named-register-n32.ll
+++ b/llvm/test/CodeGen/Mips/named-register-n32.ll
@@ -1,29 +1,370 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls \
-; RUN: -target-abi n32 < %s | FileCheck %s
+; RUN: -target-abi n32 -verify-machineinstrs < %s | FileCheck %s
declare i64 @llvm.read_register.i64(metadata)
-define i64 @get_gp() {
-; CHECK-LABEL: get_gp:
+define i64 @get_zero() {
+; CHECK-LABEL: get_zero:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
-; CHECK-NEXT: move $2, $gp
+; CHECK-NEXT: move $2, $zero
%1 = call i64 @llvm.read_register.i64(metadata !0)
ret i64 %1
}
+define i64 @get_at() {
+; CHECK-LABEL: get_at:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $1, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $1
+ call void @llvm.write_register.i64(metadata !{!"$1"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !1)
+ ret i64 %1
+}
+
+define i64 @get_v0() {
+; CHECK-LABEL: get_v0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+ call void @llvm.write_register.i64(metadata !{!"$2"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !2)
+ ret i64 %1
+}
+
+define i64 @get_v1() {
+; CHECK-LABEL: get_v1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $3, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $3
+ call void @llvm.write_register.i64(metadata !{!"$3"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !3)
+ ret i64 %1
+}
+
+define i64 @get_a0() {
+; CHECK-LABEL: get_a0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $4, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $4
+ call void @llvm.write_register.i64(metadata !{!"$4"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !4)
+ ret i64 %1
+}
+
+define i64 @get_a1() {
+; CHECK-LABEL: get_a1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $5, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $5
+ call void @llvm.write_register.i64(metadata !{!"$5"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !5)
+ ret i64 %1
+}
+
+define i64 @get_a2() {
+; CHECK-LABEL: get_a2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $6, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $6
+ call void @llvm.write_register.i64(metadata !{!"$6"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !6)
+ ret i64 %1
+}
+
+define i64 @get_a3() {
+; CHECK-LABEL: get_a3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $7, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $7
+ call void @llvm.write_register.i64(metadata !{!"$7"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !7)
+ ret i64 %1
+}
+
+define i64 @get_t0() {
+; CHECK-LABEL: get_t0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $12, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $12
+ call void @llvm.write_register.i64(metadata !{!"$12"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !8)
+ ret i64 %1
+}
+
+define i64 @get_t1() {
+; CHECK-LABEL: get_t1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $13, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $13
+ call void @llvm.write_register.i64(metadata !{!"$13"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !9)
+ ret i64 %1
+}
+
+define i64 @get_t2() {
+; CHECK-LABEL: get_t2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $14, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $14
+ call void @llvm.write_register.i64(metadata !{!"$14"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !10)
+ ret i64 %1
+}
+
+define i64 @get_t3() {
+; CHECK-LABEL: get_t3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $15, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $15
+ call void @llvm.write_register.i64(metadata !{!"$15"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !11)
+ ret i64 %1
+}
+
+define i64 @get_t4() {
+; CHECK-LABEL: get_t4:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $12, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $12
+ call void @llvm.write_register.i64(metadata !{!"$12"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !12)
+ ret i64 %1
+}
+
+define i64 @get_t5() {
+; CHECK-LABEL: get_t5:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $13, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $13
+ call void @llvm.write_register.i64(metadata !{!"$13"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !13)
+ ret i64 %1
+}
+
+define i64 @get_t6() {
+; CHECK-LABEL: get_t6:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $14, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $14
+ call void @llvm.write_register.i64(metadata !{!"$14"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !14)
+ ret i64 %1
+}
+
+define i64 @get_t7() {
+; CHECK-LABEL: get_t7:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $15, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $15
+ call void @llvm.write_register.i64(metadata !{!"$15"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !15)
+ ret i64 %1
+}
+
+define i64 @get_s0() {
+; CHECK-LABEL: get_s0:
+; CHECK: # %bb.0:
+; CHECK: addiu $16, $zero, 0
+; CHECK-NEXT: move $2, $16
+ call void @llvm.write_register.i64(metadata !{!"$16"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !16)
+ ret i64 %1
+}
+
+define i64 @get_s1() {
+; CHECK-LABEL: get_s1:
+; CHECK: # %bb.0:
+; CHECK: addiu $17, $zero, 0
+; CHECK-NEXT: move $2, $17
+ call void @llvm.write_register.i64(metadata !{!"$17"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !17)
+ ret i64 %1
+}
+
+define i64 @get_s2() {
+; CHECK-LABEL: get_s2:
+; CHECK: # %bb.0:
+; CHECK: addiu $18, $zero, 0
+; CHECK-NEXT: move $2, $18
+ call void @llvm.write_register.i64(metadata !{!"$18"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !18)
+ ret i64 %1
+}
+
+define i64 @get_s3() {
+; CHECK-LABEL: get_s3:
+; CHECK: # %bb.0:
+; CHECK: addiu $19, $zero, 0
+; CHECK-NEXT: move $2, $19
+ call void @llvm.write_register.i64(metadata !{!"$19"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !19)
+ ret i64 %1
+}
+
+define i64 @get_s4() {
+; CHECK-LABEL: get_s4:
+; CHECK: # %bb.0:
+; CHECK: addiu $20, $zero, 0
+; CHECK-NEXT: move $2, $20
+ call void @llvm.write_register.i64(metadata !{!"$20"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !20)
+ ret i64 %1
+}
+
+define i64 @get_s5() {
+; CHECK-LABEL: get_s5:
+; CHECK: # %bb.0:
+; CHECK: addiu $21, $zero, 0
+; CHECK-NEXT: move $2, $21
+ call void @llvm.write_register.i64(metadata !{!"$21"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !21)
+ ret i64 %1
+}
+
+define i64 @get_s6() {
+; CHECK-LABEL: get_s6:
+; CHECK: # %bb.0:
+; CHECK: addiu $22, $zero, 0
+; CHECK-NEXT: move $2, $22
+ call void @llvm.write_register.i64(metadata !{!"$22"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !22)
+ ret i64 %1
+}
+
+define i64 @get_s7() {
+; CHECK-LABEL: get_s7:
+; CHECK: # %bb.0:
+; CHECK: addiu $23, $zero, 0
+; CHECK-NEXT: move $2, $23
+ call void @llvm.write_register.i64(metadata !{!"$23"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !23)
+ ret i64 %1
+}
+
+define i64 @get_t8() {
+; CHECK-LABEL: get_t8:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $24, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $24
+ call void @llvm.write_register.i64(metadata !{!"$24"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !24)
+ ret i64 %1
+}
+
+define i64 @get_t9() {
+; CHECK-LABEL: get_t9:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $25, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $25
+ call void @llvm.write_register.i64(metadata !{!"$25"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !25)
+ ret i64 %1
+}
+
+define i64 @get_k0() {
+; CHECK-LABEL: get_k0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $26
+ %1 = call i64 @llvm.read_register.i64(metadata !26)
+ ret i64 %1
+}
+
+define i64 @get_k1() {
+; CHECK-LABEL: get_k1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $27
+ %1 = call i64 @llvm.read_register.i64(metadata !27)
+ ret i64 %1
+}
+
+define i64 @get_$gp() {
+; CHECK-LABEL: get_$gp:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $gp
+ %1 = call i64 @llvm.read_register.i64(metadata !28)
+ ret i64 %1
+}
+
define i64 @get_sp() {
; CHECK-LABEL: get_sp:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
; CHECK-NEXT: move $2, $sp
- %1 = call i64 @llvm.read_register.i64(metadata !1)
+ %1 = call i64 @llvm.read_register.i64(metadata !29)
+ ret i64 %1
+}
+
+define i64 @get_fp() {
+; CHECK-LABEL: get_fp:
+; CHECK: # %bb.0:
+; CHECK: addiu $fp, $zero, 0
+; CHECK-NEXT: move $2, $fp
+ call void @llvm.write_register.i64(metadata !{!"$30"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !30)
+ ret i64 %1
+}
+
+define i64 @get_ra() {
+; CHECK-LABEL: get_ra:
+; CHECK: # %bb.0:
+; CHECK: addiu $ra, $zero, 0
+; CHECK-NEXT: move $2, $ra
+ call void @llvm.write_register.i64(metadata !{!"$31"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !31)
ret i64 %1
}
-!llvm.named.register.$28 = !{!0}
-!llvm.named.register.sp = !{!1}
+!llvm.named.register = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31}
-!0 = !{!"$28"}
-!1 = !{!"sp"}
+!0 = !{!"$zero"}
+!1 = !{!"$at"}
+!2 = !{!"$v0"}
+!3 = !{!"$v1"}
+!4 = !{!"$a0"}
+!5 = !{!"$a1"}
+!6 = !{!"$a2"}
+!7 = !{!"$a3"}
+!8 = !{!"$t0"}
+!9 = !{!"$t1"}
+!10 = !{!"$t2"}
+!11 = !{!"$t3"}
+!12 = !{!"$t4"}
+!13 = !{!"$t5"}
+!14 = !{!"$t6"}
+!15 = !{!"$t7"}
+!16 = !{!"$s0"}
+!17 = !{!"$s1"}
+!18 = !{!"$s2"}
+!19 = !{!"$s3"}
+!20 = !{!"$s4"}
+!21 = !{!"$s5"}
+!22 = !{!"$s6"}
+!23 = !{!"$s7"}
+!24 = !{!"$t8"}
+!25 = !{!"$t9"}
+!26 = !{!"$k0"}
+!27 = !{!"$k1"}
+!28 = !{!"$gp"}
+!29 = !{!"$sp"}
+!30 = !{!"$fp"}
+!31 = !{!"$ra"}
diff --git a/llvm/test/CodeGen/Mips/named-register-n64.ll b/llvm/test/CodeGen/Mips/named-register-n64.ll
index 42d9ba1e1f15c..d886e98d76df9 100644
--- a/llvm/test/CodeGen/Mips/named-register-n64.ll
+++ b/llvm/test/CodeGen/Mips/named-register-n64.ll
@@ -1,29 +1,370 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips64 -relocation-model=static -mattr=+noabicalls \
-; RUN: < %s | FileCheck %s
+; RUN: -verify-machineinstrs < %s | FileCheck %s
declare i64 @llvm.read_register.i64(metadata)
-define i64 @get_gp() {
-; CHECK-LABEL: get_gp:
+define i64 @get_zero() {
+; CHECK-LABEL: get_zero:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
-; CHECK-NEXT: move $2, $gp
+; CHECK-NEXT: move $2, $zero
%1 = call i64 @llvm.read_register.i64(metadata !0)
ret i64 %1
}
+define i64 @get_at() {
+; CHECK-LABEL: get_at:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $1, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $1
+ call void @llvm.write_register.i64(metadata !{!"$1"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !1)
+ ret i64 %1
+}
+
+define i64 @get_v0() {
+; CHECK-LABEL: get_v0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+ call void @llvm.write_register.i64(metadata !{!"$2"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !2)
+ ret i64 %1
+}
+
+define i64 @get_v1() {
+; CHECK-LABEL: get_v1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $3, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $3
+ call void @llvm.write_register.i64(metadata !{!"$3"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !3)
+ ret i64 %1
+}
+
+define i64 @get_a0() {
+; CHECK-LABEL: get_a0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $4, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $4
+ call void @llvm.write_register.i64(metadata !{!"$4"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !4)
+ ret i64 %1
+}
+
+define i64 @get_a1() {
+; CHECK-LABEL: get_a1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $5, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $5
+ call void @llvm.write_register.i64(metadata !{!"$5"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !5)
+ ret i64 %1
+}
+
+define i64 @get_a2() {
+; CHECK-LABEL: get_a2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $6, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $6
+ call void @llvm.write_register.i64(metadata !{!"$6"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !6)
+ ret i64 %1
+}
+
+define i64 @get_a3() {
+; CHECK-LABEL: get_a3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $7, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $7
+ call void @llvm.write_register.i64(metadata !{!"$7"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !7)
+ ret i64 %1
+}
+
+define i64 @get_t0() {
+; CHECK-LABEL: get_t0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $12, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $12
+ call void @llvm.write_register.i64(metadata !{!"$12"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !8)
+ ret i64 %1
+}
+
+define i64 @get_t1() {
+; CHECK-LABEL: get_t1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $13, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $13
+ call void @llvm.write_register.i64(metadata !{!"$13"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !9)
+ ret i64 %1
+}
+
+define i64 @get_t2() {
+; CHECK-LABEL: get_t2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $14, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $14
+ call void @llvm.write_register.i64(metadata !{!"$14"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !10)
+ ret i64 %1
+}
+
+define i64 @get_t3() {
+; CHECK-LABEL: get_t3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $15, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $15
+ call void @llvm.write_register.i64(metadata !{!"$15"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !11)
+ ret i64 %1
+}
+
+define i64 @get_t4() {
+; CHECK-LABEL: get_t4:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $12, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $12
+ call void @llvm.write_register.i64(metadata !{!"$12"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !12)
+ ret i64 %1
+}
+
+define i64 @get_t5() {
+; CHECK-LABEL: get_t5:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $13, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $13
+ call void @llvm.write_register.i64(metadata !{!"$13"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !13)
+ ret i64 %1
+}
+
+define i64 @get_t6() {
+; CHECK-LABEL: get_t6:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $14, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $14
+ call void @llvm.write_register.i64(metadata !{!"$14"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !14)
+ ret i64 %1
+}
+
+define i64 @get_t7() {
+; CHECK-LABEL: get_t7:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $15, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $15
+ call void @llvm.write_register.i64(metadata !{!"$15"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !15)
+ ret i64 %1
+}
+
+define i64 @get_s0() {
+; CHECK-LABEL: get_s0:
+; CHECK: # %bb.0:
+; CHECK: addiu $16, $zero, 0
+; CHECK-NEXT: move $2, $16
+ call void @llvm.write_register.i64(metadata !{!"$16"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !16)
+ ret i64 %1
+}
+
+define i64 @get_s1() {
+; CHECK-LABEL: get_s1:
+; CHECK: # %bb.0:
+; CHECK: addiu $17, $zero, 0
+; CHECK-NEXT: move $2, $17
+ call void @llvm.write_register.i64(metadata !{!"$17"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !17)
+ ret i64 %1
+}
+
+define i64 @get_s2() {
+; CHECK-LABEL: get_s2:
+; CHECK: # %bb.0:
+; CHECK: addiu $18, $zero, 0
+; CHECK-NEXT: move $2, $18
+ call void @llvm.write_register.i64(metadata !{!"$18"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !18)
+ ret i64 %1
+}
+
+define i64 @get_s3() {
+; CHECK-LABEL: get_s3:
+; CHECK: # %bb.0:
+; CHECK: addiu $19, $zero, 0
+; CHECK-NEXT: move $2, $19
+ call void @llvm.write_register.i64(metadata !{!"$19"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !19)
+ ret i64 %1
+}
+
+define i64 @get_s4() {
+; CHECK-LABEL: get_s4:
+; CHECK: # %bb.0:
+; CHECK: addiu $20, $zero, 0
+; CHECK-NEXT: move $2, $20
+ call void @llvm.write_register.i64(metadata !{!"$20"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !20)
+ ret i64 %1
+}
+
+define i64 @get_s5() {
+; CHECK-LABEL: get_s5:
+; CHECK: # %bb.0:
+; CHECK: addiu $21, $zero, 0
+; CHECK-NEXT: move $2, $21
+ call void @llvm.write_register.i64(metadata !{!"$21"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !21)
+ ret i64 %1
+}
+
+define i64 @get_s6() {
+; CHECK-LABEL: get_s6:
+; CHECK: # %bb.0:
+; CHECK: addiu $22, $zero, 0
+; CHECK-NEXT: move $2, $22
+ call void @llvm.write_register.i64(metadata !{!"$22"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !22)
+ ret i64 %1
+}
+
+define i64 @get_s7() {
+; CHECK-LABEL: get_s7:
+; CHECK: # %bb.0:
+; CHECK: addiu $23, $zero, 0
+; CHECK-NEXT: move $2, $23
+ call void @llvm.write_register.i64(metadata !{!"$23"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !23)
+ ret i64 %1
+}
+
+define i64 @get_t8() {
+; CHECK-LABEL: get_t8:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $24, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $24
+ call void @llvm.write_register.i64(metadata !{!"$24"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !24)
+ ret i64 %1
+}
+
+define i64 @get_t9() {
+; CHECK-LABEL: get_t9:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $25, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $25
+ call void @llvm.write_register.i64(metadata !{!"$25"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !25)
+ ret i64 %1
+}
+
+define i64 @get_k0() {
+; CHECK-LABEL: get_k0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $26
+ %1 = call i64 @llvm.read_register.i64(metadata !26)
+ ret i64 %1
+}
+
+define i64 @get_k1() {
+; CHECK-LABEL: get_k1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $27
+ %1 = call i64 @llvm.read_register.i64(metadata !27)
+ ret i64 %1
+}
+
+define i64 @get_$gp() {
+; CHECK-LABEL: get_$gp:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $gp
+ %1 = call i64 @llvm.read_register.i64(metadata !28)
+ ret i64 %1
+}
+
define i64 @get_sp() {
; CHECK-LABEL: get_sp:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
; CHECK-NEXT: move $2, $sp
- %1 = call i64 @llvm.read_register.i64(metadata !1)
+ %1 = call i64 @llvm.read_register.i64(metadata !29)
+ ret i64 %1
+}
+
+define i64 @get_fp() {
+; CHECK-LABEL: get_fp:
+; CHECK: # %bb.0:
+; CHECK: addiu $fp, $zero, 0
+; CHECK-NEXT: move $2, $fp
+ call void @llvm.write_register.i64(metadata !{!"$30"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !30)
+ ret i64 %1
+}
+
+define i64 @get_ra() {
+; CHECK-LABEL: get_ra:
+; CHECK: # %bb.0:
+; CHECK: addiu $ra, $zero, 0
+; CHECK-NEXT: move $2, $ra
+ call void @llvm.write_register.i64(metadata !{!"$31"}, i64 0)
+ %1 = call i64 @llvm.read_register.i64(metadata !31)
ret i64 %1
}
-!llvm.named.register.$28 = !{!0}
-!llvm.named.register.sp = !{!1}
+!llvm.named.register = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31}
-!0 = !{!"$28"}
-!1 = !{!"sp"}
+!0 = !{!"$zero"}
+!1 = !{!"$at"}
+!2 = !{!"$v0"}
+!3 = !{!"$v1"}
+!4 = !{!"$a0"}
+!5 = !{!"$a1"}
+!6 = !{!"$a2"}
+!7 = !{!"$a3"}
+!8 = !{!"$t0"}
+!9 = !{!"$t1"}
+!10 = !{!"$t2"}
+!11 = !{!"$t3"}
+!12 = !{!"$t4"}
+!13 = !{!"$t5"}
+!14 = !{!"$t6"}
+!15 = !{!"$t7"}
+!16 = !{!"$s0"}
+!17 = !{!"$s1"}
+!18 = !{!"$s2"}
+!19 = !{!"$s3"}
+!20 = !{!"$s4"}
+!21 = !{!"$s5"}
+!22 = !{!"$s6"}
+!23 = !{!"$s7"}
+!24 = !{!"$t8"}
+!25 = !{!"$t9"}
+!26 = !{!"$k0"}
+!27 = !{!"$k1"}
+!28 = !{!"$gp"}
+!29 = !{!"$sp"}
+!30 = !{!"$fp"}
+!31 = !{!"$ra"}
diff --git a/llvm/test/CodeGen/Mips/named-register-o32.ll b/llvm/test/CodeGen/Mips/named-register-o32.ll
index 280c56e4db6a4..8ec4842ef2753 100644
--- a/llvm/test/CodeGen/Mips/named-register-o32.ll
+++ b/llvm/test/CodeGen/Mips/named-register-o32.ll
@@ -1,29 +1,370 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips -relocation-model=static -mattr=+noabicalls \
-; RUN: < %s | FileCheck %s
+; RUN: -verify-machineinstrs < %s | FileCheck %s
-declare i32 @llvm.read_register.i32(metadata)
+declare i32 @llvm.read_register.i64(metadata)
-define i32 @get_gp() {
-; CHECK-LABEL: get_gp:
+define i32 @get_zero() {
+; CHECK-LABEL: get_zero:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
-; CHECK-NEXT: move $2, $gp
+; CHECK-NEXT: move $2, $zero
%1 = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %1
}
+define i32 @get_at() {
+; CHECK-LABEL: get_at:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $1, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $1
+ call void @llvm.write_register.i32(metadata !{!"$1"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !1)
+ ret i32 %1
+}
+
+define i32 @get_v0() {
+; CHECK-LABEL: get_v0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+ call void @llvm.write_register.i32(metadata !{!"$2"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !2)
+ ret i32 %1
+}
+
+define i32 @get_v1() {
+; CHECK-LABEL: get_v1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $3, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $3
+ call void @llvm.write_register.i32(metadata !{!"$3"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !3)
+ ret i32 %1
+}
+
+define i32 @get_a0() {
+; CHECK-LABEL: get_a0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $4, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $4
+ call void @llvm.write_register.i32(metadata !{!"$4"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !4)
+ ret i32 %1
+}
+
+define i32 @get_a1() {
+; CHECK-LABEL: get_a1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $5, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $5
+ call void @llvm.write_register.i32(metadata !{!"$5"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !5)
+ ret i32 %1
+}
+
+define i32 @get_a2() {
+; CHECK-LABEL: get_a2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $6, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $6
+ call void @llvm.write_register.i32(metadata !{!"$6"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !6)
+ ret i32 %1
+}
+
+define i32 @get_a3() {
+; CHECK-LABEL: get_a3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $7, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $7
+ call void @llvm.write_register.i32(metadata !{!"$7"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !7)
+ ret i32 %1
+}
+
+define i32 @get_t0() {
+; CHECK-LABEL: get_t0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $8, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $8
+ call void @llvm.write_register.i32(metadata !{!"$8"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !8)
+ ret i32 %1
+}
+
+define i32 @get_t1() {
+; CHECK-LABEL: get_t1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $9, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $9
+ call void @llvm.write_register.i32(metadata !{!"$9"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !9)
+ ret i32 %1
+}
+
+define i32 @get_t2() {
+; CHECK-LABEL: get_t2:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $10, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $10
+ call void @llvm.write_register.i32(metadata !{!"$10"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !10)
+ ret i32 %1
+}
+
+define i32 @get_t3() {
+; CHECK-LABEL: get_t3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $11, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $11
+ call void @llvm.write_register.i32(metadata !{!"$11"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !11)
+ ret i32 %1
+}
+
+define i32 @get_t4() {
+; CHECK-LABEL: get_t4:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $12, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $12
+ call void @llvm.write_register.i32(metadata !{!"$12"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !12)
+ ret i32 %1
+}
+
+define i32 @get_t5() {
+; CHECK-LABEL: get_t5:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $13, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $13
+ call void @llvm.write_register.i32(metadata !{!"$13"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !13)
+ ret i32 %1
+}
+
+define i32 @get_t6() {
+; CHECK-LABEL: get_t6:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $14, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $14
+ call void @llvm.write_register.i32(metadata !{!"$14"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !14)
+ ret i32 %1
+}
+
+define i32 @get_t7() {
+; CHECK-LABEL: get_t7:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $15, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $15
+ call void @llvm.write_register.i32(metadata !{!"$15"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !15)
+ ret i32 %1
+}
+
+define i32 @get_s0() {
+; CHECK-LABEL: get_s0:
+; CHECK: # %bb.0:
+; CHECK: addiu $16, $zero, 0
+; CHECK-NEXT: move $2, $16
+ call void @llvm.write_register.i32(metadata !{!"$16"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !16)
+ ret i32 %1
+}
+
+define i32 @get_s1() {
+; CHECK-LABEL: get_s1:
+; CHECK: # %bb.0:
+; CHECK: addiu $17, $zero, 0
+; CHECK-NEXT: move $2, $17
+ call void @llvm.write_register.i32(metadata !{!"$17"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !17)
+ ret i32 %1
+}
+
+define i32 @get_s2() {
+; CHECK-LABEL: get_s2:
+; CHECK: # %bb.0:
+; CHECK: addiu $18, $zero, 0
+; CHECK-NEXT: move $2, $18
+ call void @llvm.write_register.i32(metadata !{!"$18"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !18)
+ ret i32 %1
+}
+
+define i32 @get_s3() {
+; CHECK-LABEL: get_s3:
+; CHECK: # %bb.0:
+; CHECK: addiu $19, $zero, 0
+; CHECK-NEXT: move $2, $19
+ call void @llvm.write_register.i32(metadata !{!"$19"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !19)
+ ret i32 %1
+}
+
+define i32 @get_s4() {
+; CHECK-LABEL: get_s4:
+; CHECK: # %bb.0:
+; CHECK: addiu $20, $zero, 0
+; CHECK-NEXT: move $2, $20
+ call void @llvm.write_register.i32(metadata !{!"$20"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !20)
+ ret i32 %1
+}
+
+define i32 @get_s5() {
+; CHECK-LABEL: get_s5:
+; CHECK: # %bb.0:
+; CHECK: addiu $21, $zero, 0
+; CHECK-NEXT: move $2, $21
+ call void @llvm.write_register.i32(metadata !{!"$21"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !21)
+ ret i32 %1
+}
+
+define i32 @get_s6() {
+; CHECK-LABEL: get_s6:
+; CHECK: # %bb.0:
+; CHECK: addiu $22, $zero, 0
+; CHECK-NEXT: move $2, $22
+ call void @llvm.write_register.i32(metadata !{!"$22"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !22)
+ ret i32 %1
+}
+
+define i32 @get_s7() {
+; CHECK-LABEL: get_s7:
+; CHECK: # %bb.0:
+; CHECK: addiu $23, $zero, 0
+; CHECK-NEXT: move $2, $23
+ call void @llvm.write_register.i32(metadata !{!"$23"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !23)
+ ret i32 %1
+}
+
+define i32 @get_t8() {
+; CHECK-LABEL: get_t8:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $24, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $24
+ call void @llvm.write_register.i32(metadata !{!"$24"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !24)
+ ret i32 %1
+}
+
+define i32 @get_t9() {
+; CHECK-LABEL: get_t9:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addiu $25, $zero, 0
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $25
+ call void @llvm.write_register.i32(metadata !{!"$25"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !25)
+ ret i32 %1
+}
+
+define i32 @get_k0() {
+; CHECK-LABEL: get_k0:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $26
+ %1 = call i32 @llvm.read_register.i32(metadata !26)
+ ret i32 %1
+}
+
+define i32 @get_k1() {
+; CHECK-LABEL: get_k1:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $27
+ %1 = call i32 @llvm.read_register.i32(metadata !27)
+ ret i32 %1
+}
+
+define i32 @get_$gp() {
+; CHECK-LABEL: get_$gp:
+; CHECK: # %bb.0:
+; CHECK-NEXT: jr $ra
+; CHECK-NEXT: move $2, $gp
+ %1 = call i32 @llvm.read_register.i32(metadata !28)
+ ret i32 %1
+}
+
define i32 @get_sp() {
; CHECK-LABEL: get_sp:
; CHECK: # %bb.0:
; CHECK-NEXT: jr $ra
; CHECK-NEXT: move $2, $sp
- %1 = call i32 @llvm.read_register.i32(metadata !1)
+ %1 = call i32 @llvm.read_register.i32(metadata !29)
+ ret i32 %1
+}
+
+define i32 @get_fp() {
+; CHECK-LABEL: get_fp:
+; CHECK: # %bb.0:
+; CHECK: addiu $fp, $zero, 0
+; CHECK-NEXT: move $2, $fp
+ call void @llvm.write_register.i32(metadata !{!"$30"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !30)
+ ret i32 %1
+}
+
+define i32 @get_ra() {
+; CHECK-LABEL: get_ra:
+; CHECK: # %bb.0:
+; CHECK: addiu $ra, $zero, 0
+; CHECK-NEXT: move $2, $ra
+ call void @llvm.write_register.i32(metadata !{!"$31"}, i32 0)
+ %1 = call i32 @llvm.read_register.i32(metadata !31)
ret i32 %1
}
-!llvm.named.register.$28 = !{!0}
-!llvm.named.register.sp = !{!1}
+!llvm.named.register = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31}
-!0 = !{!"$28"}
-!1 = !{!"sp"}
+!0 = !{!"$zero"}
+!1 = !{!"$at"}
+!2 = !{!"$v0"}
+!3 = !{!"$v1"}
+!4 = !{!"$a0"}
+!5 = !{!"$a1"}
+!6 = !{!"$a2"}
+!7 = !{!"$a3"}
+!8 = !{!"$t0"}
+!9 = !{!"$t1"}
+!10 = !{!"$t2"}
+!11 = !{!"$t3"}
+!12 = !{!"$t4"}
+!13 = !{!"$t5"}
+!14 = !{!"$t6"}
+!15 = !{!"$t7"}
+!16 = !{!"$s0"}
+!17 = !{!"$s1"}
+!18 = !{!"$s2"}
+!19 = !{!"$s3"}
+!20 = !{!"$s4"}
+!21 = !{!"$s5"}
+!22 = !{!"$s6"}
+!23 = !{!"$s7"}
+!24 = !{!"$t8"}
+!25 = !{!"$t9"}
+!26 = !{!"$k0"}
+!27 = !{!"$k1"}
+!28 = !{!"$gp"}
+!29 = !{!"$sp"}
+!30 = !{!"$fp"}
+!31 = !{!"$ra"}
More information about the llvm-commits
mailing list