diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index a5ecdb0e6bcc2..339f8f96c236b 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -895,7 +895,10 @@ enum : unsigned {
 
 // SBF specific e_flags
 enum : unsigned {
-  EF_SBF_V2 = 0x20,
+  EF_SBF_V0 = 0x00,
+  EF_SBF_V1 = 0x01,
+  EF_SBF_V2 = 0x02,
+  EF_SBF_V3 = 0x03,
 };
 
 // ELF Relocation types for SBF.
diff --git a/llvm/lib/Target/SBF/MCTargetDesc/SBFAsmBackend.cpp b/llvm/lib/Target/SBF/MCTargetDesc/SBFAsmBackend.cpp
index 2090878d20c1b..628a82d235440 100644
--- a/llvm/lib/Target/SBF/MCTargetDesc/SBFAsmBackend.cpp
+++ b/llvm/lib/Target/SBF/MCTargetDesc/SBFAsmBackend.cpp
@@ -26,7 +26,6 @@ class SBFAsmBackend : public MCAsmBackend {
 public:
   SBFAsmBackend(endianness Endian, const MCSubtargetInfo &STI)
       : MCAsmBackend(Endian),
-        isSBFv2(STI.getCPU() == "sbfv2"),
         relocAbs64(STI.hasFeature(SBF::FeatureRelocAbs64)) {}
   ~SBFAsmBackend() override = default;
 
@@ -50,7 +49,6 @@ class SBFAsmBackend : public MCAsmBackend {
   bool writeNopData(raw_ostream &OS, uint64_t Count,
                     const MCSubtargetInfo *STI) const override;
 private:
-  bool isSBFv2;
   bool relocAbs64;
 };
 
@@ -107,7 +105,7 @@ void SBFAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
 
 std::unique_ptr<MCObjectTargetWriter>
 SBFAsmBackend::createObjectTargetWriter() const {
-  return createSBFELFObjectWriter(0, relocAbs64, isSBFv2);
+  return createSBFELFObjectWriter(0, relocAbs64);
 }
 
 MCAsmBackend *llvm::createSBFAsmBackend(const Target &T,
diff --git a/llvm/lib/Target/SBF/MCTargetDesc/SBFELFObjectWriter.cpp b/llvm/lib/Target/SBF/MCTargetDesc/SBFELFObjectWriter.cpp
index ea5307ed13767..15c1ae681402d 100644
--- a/llvm/lib/Target/SBF/MCTargetDesc/SBFELFObjectWriter.cpp
+++ b/llvm/lib/Target/SBF/MCTargetDesc/SBFELFObjectWriter.cpp
@@ -22,7 +22,7 @@ namespace {
 
 class SBFELFObjectWriter : public MCELFObjectTargetWriter {
 public:
-  SBFELFObjectWriter(uint8_t OSABI, bool relocAbs64, bool isSBFv2);
+  SBFELFObjectWriter(uint8_t OSABI, bool relocAbs64);
   ~SBFELFObjectWriter() override = default;
 
 protected:
@@ -47,10 +47,8 @@ bool SBFELFObjectWriter::needsRelocateWithSymbol(const MCValue &Val,
   return true;
 }
 
-SBFELFObjectWriter::SBFELFObjectWriter(uint8_t OSABI,
-                                       bool relocAbs64, bool isSBFv2)
-  : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI,
-                            isSBFv2 ? ELF::EM_SBF : ELF::EM_BPF,
+SBFELFObjectWriter::SBFELFObjectWriter(uint8_t OSABI, bool relocAbs64)
+  : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI,ELF::EM_SBF,
                             /*HasRelocationAddend*/ false),
       relocAbs64(relocAbs64) {}
 
@@ -110,6 +108,6 @@ unsigned SBFELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
 }
 
 std::unique_ptr<MCObjectTargetWriter>
-llvm::createSBFELFObjectWriter(uint8_t OSABI, bool useRelocAbs64, bool isSBFv2) {
-  return std::make_unique<SBFELFObjectWriter>(OSABI, useRelocAbs64, isSBFv2);
+llvm::createSBFELFObjectWriter(uint8_t OSABI, bool useRelocAbs64) {
+  return std::make_unique<SBFELFObjectWriter>(OSABI, useRelocAbs64);
 }
diff --git a/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.cpp b/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.cpp
index e92e2fcb534e4..621145e116594 100644
--- a/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.cpp
+++ b/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.cpp
@@ -67,9 +67,18 @@ static MCStreamer *createSBFMCStreamer(const Triple &T, MCContext &Ctx,
   if (RelaxAll)
     S->getAssembler().setRelaxAll(true);
   const MCSubtargetInfo *STI = Ctx.getSubtargetInfo();
-  if (STI->getCPU() == "sbfv2") {
-    S->getAssembler().setELFHeaderEFlags(llvm::ELF::EF_SBF_V2);
+
+  StringRef CPU = STI->getCPU();
+  unsigned EFlag = llvm::ELF::EF_SBF_V0;
+  if (CPU == "v1") {
+    EFlag = llvm::ELF::EF_SBF_V1;
+  } else if (CPU == "v2") {
+    EFlag = llvm::ELF::EF_SBF_V2;
+  } else if (CPU == "v3") {
+    EFlag = llvm::ELF::EF_SBF_V3;
   }
+  S->getAssembler().setELFHeaderEFlags(EFlag);
+
   return S;
 }
 
diff --git a/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.h b/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.h
index f6cc55b67d247..99f04358160ed 100644
--- a/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.h
+++ b/llvm/lib/Target/SBF/MCTargetDesc/SBFMCTargetDesc.h
@@ -43,7 +43,7 @@ MCAsmBackend *createSBFbeAsmBackend(const Target &T, const MCSubtargetInfo &STI,
                                     const MCTargetOptions &Options);
 
 std::unique_ptr<MCObjectTargetWriter>
-createSBFELFObjectWriter(uint8_t OSABI, bool useRelocAbs64, bool isSBFv2);
+createSBFELFObjectWriter(uint8_t OSABI, bool useRelocAbs64);
 } // namespace llvm
 
 // Defines symbolic names for SBF registers.  This defines a mapping from
diff --git a/llvm/lib/Target/SBF/SBFSubtarget.cpp b/llvm/lib/Target/SBF/SBFSubtarget.cpp
index 5d3e24fef099c..d6821041a4f5d 100644
--- a/llvm/lib/Target/SBF/SBFSubtarget.cpp
+++ b/llvm/lib/Target/SBF/SBFSubtarget.cpp
@@ -36,10 +36,10 @@ SBFSubtarget &SBFSubtarget::initializeSubtargetDependencies(const Triple &TT,
 
 void SBFSubtarget::initializeEnvironment(const Triple &TT) {
   assert(TT.getArch() == Triple::sbf && "expected Triple::sbf");
-  HasJmpExt = false;
   UseDwarfRIS = false;
 
   // SBFv2 features
+  HasJmpExt = false;
   HasDynamicFrames = false;
   DisableNeg = false;
   ReverseSubImm = false;
@@ -50,24 +50,11 @@ void SBFSubtarget::initializeEnvironment(const Triple &TT) {
   HasAlu32 = false;
   HasExplicitSignExt = false;
   NewMemEncoding = false;
+  HasStaticSyscalls = false;
 }
 
 void SBFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
   ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS);
-
-  if (CPU == "v2") {
-    HasJmpExt = true;
-  }
-
-  if (CPU == "v3") {
-    HasJmpExt = true;
-    HasAlu32 = true;
-  }
-
-  if (CPU == "sbfv2") {
-    if (!HasDynamicFrames)
-      report_fatal_error("sbfv2 requires dynamic-frames\n", false);
-  }
 }
 
 SBFSubtarget::SBFSubtarget(const Triple &TT, const std::string &CPU,
diff --git a/llvm/lib/Target/SBF/SBFTargetFeatures.td b/llvm/lib/Target/SBF/SBFTargetFeatures.td
index a11b0aacbbd17..a1ff0b940a425 100644
--- a/llvm/lib/Target/SBF/SBFTargetFeatures.td
+++ b/llvm/lib/Target/SBF/SBFTargetFeatures.td
@@ -49,13 +49,18 @@ def FeatureExplicitSext : SubtargetFeature<"explicit-sext", "HasExplicitSignExt"
 def FeatureNewMemEncoding : SubtargetFeature<"mem-encoding", "NewMemEncoding",
                                        "true", "Enable the new encoding for memory instructions">;
 
+def FeatureJumpExt : SubtargetFeature<"jmp-ext", "HasJmpExt",
+                                       "true", "Enable jumps with less than and less than or equal">;
+
 class Proc<string Name, list<SubtargetFeature> Features>
  : Processor<Name, NoItineraries, Features>;
 
 def : Proc<"generic", []>;
-def : Proc<"v1", []>;
-def : Proc<"v2", []>;
-def : Proc<"v3", [ALU32]>;
-def : Proc<"sbfv2", [FeatureDynamicFrames, FeatureRelocAbs64, FeatureStaticSyscalls,
-                        FeatureDisableNeg, FeatureReverseSubImm, FeatureDisableLddw, FeatureCallxRegSrc,
-                          FeaturePqrInstr, FeatureExplicitSext]>;
\ No newline at end of file
+
+def : Proc<"v1", [FeatureDynamicFrames, FeatureStoreImm, FeatureJumpExt]>;
+def : Proc<"v2", [FeatureDynamicFrames, FeatureStoreImm, FeatureJumpExt, FeatureDisableLddw,
+                  FeatureNewMemEncoding, FeatureCallxRegSrc, FeaturePqrInstr, FeatureExplicitSext,
+                  FeatureDisableNeg, FeatureReverseSubImm, ALU32]>;
+def : Proc<"v3", [FeatureDynamicFrames, FeatureStoreImm, FeatureJumpExt, FeatureDisableLddw,
+                  FeatureNewMemEncoding, FeatureCallxRegSrc, FeaturePqrInstr, FeatureExplicitSext,
+                  FeatureDisableNeg, FeatureReverseSubImm, ALU32, FeatureStaticSyscalls, FeatureRelocAbs64]>;
\ No newline at end of file
diff --git a/llvm/test/CodeGen/BPF/reloc-abs64-sbf.ll b/llvm/test/CodeGen/BPF/reloc-abs64-sbf.ll
deleted file mode 100644
index 46318a1c36878..0000000000000
--- a/llvm/test/CodeGen/BPF/reloc-abs64-sbf.ll
+++ /dev/null
@@ -1,20 +0,0 @@
-; RUN: llc -march=sbf -filetype=obj < %s | llvm-objdump -r - | tee -i /tmp/foo | FileCheck --check-prefix=CHECK-RELOC-BPF %s
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj < %s | llvm-objdump -r - | tee -i /tmp/foo | FileCheck --check-prefix=CHECK-RELOC-SBFv2 %s
-
-@.str = private unnamed_addr constant [25 x i8] c"reloc_64_relative_data.c\00", align 1
-@FILE = dso_local constant i64 ptrtoint ([25 x i8]* @.str to i64), align 8
-
-; Function Attrs: noinline nounwind optnone
-define dso_local i64 @entrypoint(i8* %input) #0 {
-entry:
-  %input.addr = alloca i8*, align 8
-  store i8* %input, i8** %input.addr, align 8
-  %0 = load volatile i64, i64* @FILE, align 8
-  ret i64 %0
-}
-
-; CHECK-RELOC-BPF:   RELOCATION RECORDS FOR [.data.rel.ro]:
-; CHECK-RELOC-BPF:   0000000000000000 R_BPF_64_64 .L.str
-
-; CHECK-RELOC-SBFv2: RELOCATION RECORDS FOR [.data.rel.ro]:
-; CHECK-RELOC-SBFv2: 0000000000000000 R_SBF_64_ABS64 .L.str
diff --git a/llvm/test/CodeGen/SBF/32-bit-subreg-alu.ll b/llvm/test/CodeGen/SBF/32-bit-subreg-alu.ll
index 91183a6a09ead..6713375dbfa4d 100644
--- a/llvm/test/CodeGen/SBF/32-bit-subreg-alu.ll
+++ b/llvm/test/CodeGen/SBF/32-bit-subreg-alu.ll
@@ -1,5 +1,5 @@
-; RUN: llc -O2 -march=sbf -mattr=+alu32 < %s | FileCheck %s
-; RUN: llc -O2 -march=sbf -mcpu=v3 < %s | FileCheck %s
+; RUN: llc -O2 -march=sbf -mattr=+alu32 < %s | FileCheck --check-prefixes=CHECK,CHECK-V0 %s
+; RUN: llc -O2 -march=sbf -mcpu=v3 < %s | FileCheck --check-prefixes=CHECK,CHECK-V3 %s
 ;
 ; int mov(int a)
 ; {
@@ -130,7 +130,8 @@
 define dso_local i32 @mov(i32 returned %a) local_unnamed_addr #0 {
 entry:
   ret i32 %a
-; CHECK: mov32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V0: mov32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V3: mov64 w{{[0-9]+}}, w{{[0-9]+}}
 }
 
 ; Function Attrs: norecurse nounwind readnone
@@ -208,7 +209,8 @@ entry:
 define dso_local i32 @rem(i32 %a, i32 %b) local_unnamed_addr #0 {
 entry:
   %rem = urem i32 %a, %b
-; CHECK: mod32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V0: mod32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V3: urem32 w{{[0-9]+}}, w{{[0-9]+}}
   ret i32 %rem
 }
 
@@ -216,7 +218,8 @@ entry:
 define dso_local i32 @rem_i(i32 %a) local_unnamed_addr #0 {
 entry:
   %rem = urem i32 %a, 15
-; CHECK: mod32 w{{[0-9]+}}, 15
+; CHECK-V0: mod32 w{{[0-9]+}}, 15
+; CHECK-V3: urem32 w{{[0-9]+}}, 15
   ret i32 %rem
 }
 
@@ -320,6 +323,7 @@ entry:
 define dso_local i32 @neg(i32 %a) local_unnamed_addr #0 {
 entry:
   %sub = sub nsw i32 0, %a
-; CHECK: mov32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V0: mov32 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-V3: mov64 w{{[0-9]+}}, w{{[0-9]+}}
   ret i32 %sub
 }
diff --git a/llvm/test/CodeGen/SBF/32-bit-subreg-peephole.ll b/llvm/test/CodeGen/SBF/32-bit-subreg-peephole.ll
index 6ade7e00390d0..325374059c60a 100644
--- a/llvm/test/CodeGen/SBF/32-bit-subreg-peephole.ll
+++ b/llvm/test/CodeGen/SBF/32-bit-subreg-peephole.ll
@@ -1,4 +1,4 @@
-; RUN: llc -O2 -march=sbf -mcpu=v2 -mattr=+alu32 < %s | FileCheck %s
+; RUN: llc -O2 -march=sbf -mcpu=v2 < %s | FileCheck %s
 ;
 ; long long select_u(unsigned a, unsigned b, long long c, long long d)
 ; {
@@ -47,7 +47,7 @@ define dso_local i64 @select_u(i32 %a, i32 %b, i64 %c, i64 %d) local_unnamed_add
 entry:
   %cmp = icmp ugt i32 %a, %b
   %c.d = select i1 %cmp, i64 %c, i64 %d
-; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
+; CHECK: mov64 r{{[0-9]+}}, r{{[0-9]+}}
 ; CHECK-NOT: lsh32 r{{[0-9]+}}, 32
 ; CHECK-NOT: rsh32 r{{[0-9]+}}, 32
 ; CHECK: {{jlt|jgt}}  r{{[0-9]+}}, r{{[0-9]+}},
@@ -59,7 +59,7 @@ define dso_local i64 @select_u_2(i32 %a, i64 %b, i64 %c, i64 %d) local_unnamed_a
 ; CHECK-LABEL: select_u_2:
 entry:
   %conv = zext i32 %a to i64
-; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
+; CHECK: mov64 r{{[0-9]+}}, r{{[0-9]+}}
 ; CHECK-NOT: lsh32 r{{[0-9]+}}, 32
 ; CHECK-NOT: rsh32 r{{[0-9]+}}, 32
   %cmp = icmp ugt i64 %conv, %b
@@ -73,8 +73,8 @@ define dso_local i64 @select_s(i32 %a, i32 %b, i64 %c, i64 %d) local_unnamed_add
 entry:
   %cmp = icmp sgt i32 %a, %b
   %c.d = select i1 %cmp, i64 %c, i64 %d
-; CHECK: lsh64 r{{[0-9]+}}, 32
-; CHECK-NEXT: arsh64 r{{[0-9]+}}, 32
+; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
+; CHECK-NEXT: mov32 r{{[0-9]+}}, w{{[0-9]+}}
 ; CHECK: {{jslt|jsgt}} r{{[0-9]+}}, r{{[0-9]+}},
   ret i64 %c.d
 }
@@ -88,11 +88,12 @@ entry:
   %cmp = icmp ult i32 %conv, 10
 ; %call comes from function call returning i64 so the high bits will need
 ; to be cleared.
-; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
+; CHECK: and32 w{{[0-9]+}}, -1
 ; CHECK-NOT: lsh32 r{{[0-9]+}}, 32
 ; CHECK-NOT: rsh32 r{{[0-9]+}}, 32
+; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
   %b.c = select i1 %cmp, i32 %b, i32 %c
-; CHECK: {{jlt|jgt}} r{{[0-9]+}}, {{[0-9]+}},
+; CHECK: {{jlt|jgt}} r{{[0-9]+}}, 10,
   ret i32 %b.c
 }
 
@@ -103,7 +104,7 @@ define dso_local i32* @inc_p(i32* readnone %p, i32 %a) local_unnamed_addr #0 {
 ; CHECK-LABEL: inc_p:
 entry:
   %idx.ext = zext i32 %a to i64
-; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
+; CHECK: mov64 r{{[0-9]+}}, r{{[0-9]+}}
 ; CHECK-NOT: lsh32 r{{[0-9]+}}, 32
 ; CHECK-NOT: rsh32 r{{[0-9]+}}, 32
   %add.ptr = getelementptr inbounds i32, i32* %p, i64 %idx.ext
@@ -117,8 +118,8 @@ entry:
   %cmp = icmp sgt i32 %call, 6
 ; The shifts can't be optimized out because %call comes from function call
 ; return i32 so the high bits might be invalid.
-; CHECK: lsh64 r{{[0-9]+}}, 32
-; CHECK-NEXT: arsh64 r{{[0-9]+}}, 32
+; CHECK: mov64 w{{[0-9]+}}, w{{[0-9]+}}
+; CHECK: mov32 r{{[0-9]+}}, w{{[0-9]+}}
   %cond = zext i1 %cmp to i32
 ; CHECK: {{jslt|jsgt}} r{{[0-9]+}}, {{[0-9]+}},
   ret i32 %cond
diff --git a/llvm/test/CodeGen/SBF/CORE/simplifypatable-nullptr.ll b/llvm/test/CodeGen/SBF/CORE/simplifypatable-nullptr.ll
index 162f98a5902fa..c92249161de63 100644
--- a/llvm/test/CodeGen/SBF/CORE/simplifypatable-nullptr.ll
+++ b/llvm/test/CodeGen/SBF/CORE/simplifypatable-nullptr.ll
@@ -41,7 +41,7 @@ entry:
   br i1 %tobool.not, label %if.end, label %cleanup, !dbg !42
 
 ; CHECK-LABEL: test
-; CHECK:       ldxdw r1, [r1 + 8]
+; CHECK:       ldxdw r1, [r1 + 0]
 ; CHECK:       jne r1, 0,
 
 if.end:                                           ; preds = %entry
@@ -53,7 +53,8 @@ if.end:                                           ; preds = %entry
   %tobool1.not = icmp eq ptr %7, null, !dbg !46
   br i1 %tobool1.not, label %if.then2, label %cleanup, !dbg !48
 
-; CHECK:       mov64 r1, 8
+; CHECK:       mov32 r1,
+; CHECK:       hor64 r1,
 ; CHECK:       ldxdw r1, [r1 + 0]
 ; CHECK:       jne r1, 0,
 
diff --git a/llvm/test/CodeGen/SBF/call_internal.ll b/llvm/test/CodeGen/SBF/call_internal.ll
index 8b181c5c07e77..d4e1dc7844fd4 100644
--- a/llvm/test/CodeGen/SBF/call_internal.ll
+++ b/llvm/test/CodeGen/SBF/call_internal.ll
@@ -1,7 +1,7 @@
 ; RUN: llc < %s -march=sbf --show-mc-encoding | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-V0 %s
 ; RUN: llc -march=sbf --filetype=obj -o - %s | llvm-objdump -d - | FileCheck --check-prefixes=CHECK-OBJ,CHECK-OBJ-V0 %s
-; RUN: llc < %s -march=sbf -mcpu=sbfv2 --show-mc-encoding | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-V3 %s
-; RUN: llc -march=sbf -mcpu=sbfv2 --filetype=obj -o - %s | llvm-objdump -d -
+; RUN: llc < %s -march=sbf -mcpu=v3 --show-mc-encoding | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-V3 %s
+; RUN: llc -march=sbf -mcpu=v3 --filetype=obj -o - %s | llvm-objdump -d -
 ;                                       | FileCheck --check-prefixes=CHECK-OBJ,CHECK-OBJ-V3 %s
 
 @.str = private unnamed_addr constant [5 x i8] c"foo\0A\00", align 1
diff --git a/llvm/test/CodeGen/SBF/callx.ll b/llvm/test/CodeGen/SBF/callx.ll
index bebcf4a11d4cb..5923cdc155843 100644
--- a/llvm/test/CodeGen/SBF/callx.ll
+++ b/llvm/test/CodeGen/SBF/callx.ll
@@ -1,6 +1,6 @@
 ; RUN: llc < %s -march=sbf --show-mc-encoding \
-; RUN:      | FileCheck %s -check-prefixes=CHECK-v1
-; RUN: llc < %s -march=sbf --mcpu=sbfv2 --show-mc-encoding \
+; RUN:      | FileCheck %s -check-prefixes=CHECK-v0
+; RUN: llc < %s -march=sbf --mcpu=v2 --show-mc-encoding \
 ; RUN:      | FileCheck %s -check-prefixes=CHECK-v2
 ; source:
 ;   int test(int (*f)(void)) { return f(); }
@@ -9,7 +9,7 @@
 define dso_local i32 @test(i32 ()* nocapture %f) local_unnamed_addr #0 {
 entry:
   %call = tail call i32 %f() #1
-; CHECK-v1: callx r{{[0-9]+}} # encoding: [0x8d,0x00,0x00,0x00,0x0{{[0-9]|a|b}},0x00,0x00,0x00]
+; CHECK-v0: callx r{{[0-9]+}} # encoding: [0x8d,0x00,0x00,0x00,0x0{{[0-9]|a|b}},0x00,0x00,0x00]
 ; CHECK-v2: callx r{{[0-9]+}} # encoding: [0x8d,0x{{[0-9]}}0,0x00,0x00,0x00,0x00,0x00,0x00]
   ret i32 %call
 }
diff --git a/llvm/test/CodeGen/SBF/cc_args.ll b/llvm/test/CodeGen/SBF/cc_args.ll
index 13cee14aa0373..8803133f57406 100644
--- a/llvm/test/CodeGen/SBF/cc_args.ll
+++ b/llvm/test/CodeGen/SBF/cc_args.ll
@@ -1,18 +1,18 @@
-; RUN: llc < %s -march=sbf -show-mc-encoding | FileCheck --check-prefix=CHECK-v1 %s
-; RUN: llc < %s -march=sbf -mcpu=sbfv2 -show-mc-encoding | FileCheck --check-prefix=CHECK-v2 %s
+; RUN: llc < %s -march=sbf -show-mc-encoding | FileCheck --check-prefix=CHECK-v0 %s
+; RUN: llc < %s -march=sbf -mcpu=v2 -show-mc-encoding | FileCheck --check-prefix=CHECK-v2 %s
 
 define void @test() #0 {
 entry:
 ; CHECK-LABEL: test:
 
-; CHECK-v1: mov64 r1, 123 # encoding: [0xb7,0x01,0x00,0x00,0x7b,0x00,0x00,0x00]
-; CHECK-v2: mov64 r1, 123
-; CHECK-v1: call f_i16
+; CHECK-v0: mov64 r1, 123 # encoding: [0xb7,0x01,0x00,0x00,0x7b,0x00,0x00,0x00]
+; CHECK-v2: mov32 w1, 123
+; CHECK-v0: call f_i16
   call void @f_i16(i16 123)
 
-; CHECK-v1: mov64 r1, 12345678 # encoding: [0xb7,0x01,0x00,0x00,0x4e,0x61,0xbc,0x00]
-; CHECK-v2: mov64 r1, 12345678
-; CHECK-v1: call f_i32
+; CHECK-v0: mov64 r1, 12345678 # encoding: [0xb7,0x01,0x00,0x00,0x4e,0x61,0xbc,0x00]
+; CHECK-v2: mov32 w1, 12345678
+; CHECK-v0: call f_i32
   call void @f_i32(i32 12345678)
 
 ; 72623859790382856 = 0x0102030405060708
@@ -22,19 +22,19 @@ entry:
 ; CHECK-v2: mov32 r1, 84281096  # encoding: [0xb4,0x01,0x00,0x00,0x08,0x07,0x06,0x05]
 ; CHECK-v2: hor64 r1, 16909060  # encoding: [0xf7,0x01,0x00,0x00,0x04,0x03,0x02,0x01]
 
-; CHECK-v1: lddw r1, 72623859790382856 # encoding: [0x18,0x01,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x00,0x00,0x00,0x04,0x03,0x02,0x01]
-; CHECK-v1: call f_i64
+; CHECK-v0: lddw r1, 72623859790382856 # encoding: [0x18,0x01,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x00,0x00,0x00,0x04,0x03,0x02,0x01]
+; CHECK-v0: call f_i64
   call void @f_i64(i64 72623859790382856)
 
-; CHECK-v1: mov64 r1, 1234
-; CHECK-v1: mov64 r2, 5678
-; CHECK-v1: call f_i32_i32
+; CHECK-v0: mov64 r1, 1234
+; CHECK-v0: mov64 r2, 5678
+; CHECK-v0: call f_i32_i32
   call void @f_i32_i32(i32 1234, i32 5678)
 
-; CHECK-v1: mov64 r1, 2
-; CHECK-v1: mov64 r2, 3
-; CHECK-v1: mov64 r3, 4
-; CHECK-v1: call f_i16_i32_i16
+; CHECK-v0: mov64 r1, 2
+; CHECK-v0: mov64 r2, 3
+; CHECK-v0: mov64 r3, 4
+; CHECK-v0: call f_i16_i32_i16
   call void @f_i16_i32_i16(i16 2, i32 3, i16 4)
 
 ; 7262385979038285 = 0x0019CD1A00809A4D
@@ -43,10 +43,10 @@ entry:
 ; CHECK-v2: mov32 r2, 8428109
 ; CHECK-v2: hor64 r2, 1690906
 
-; CHECK-v1: mov64 r1, 5
-; CHECK-v1: lddw r2, 7262385979038285
-; CHECK-v1: mov64 r3, 6
-; CHECK-v1: call f_i16_i64_i16
+; CHECK-v0: mov64 r1, 5
+; CHECK-v0: lddw r2, 7262385979038285
+; CHECK-v0: mov64 r3, 6
+; CHECK-v0: call f_i16_i64_i16
   call void @f_i16_i64_i16(i16 5, i64 7262385979038285, i16 6)
 
   ret void
@@ -57,53 +57,53 @@ entry:
 @g_i64 = common global i64 0, align 4
 
 define void @f_i16(i16 %a) #0 {
-; CHECK-v1: f_i16:
-; CHECK-v1: stxh [r2 + 0], r1 # encoding: [0x6b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
+; CHECK-v0: f_i16:
+; CHECK-v0: stxh [r2 + 0], r1 # encoding: [0x6b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
   store volatile i16 %a, i16* @g_i16, align 2
   ret void
 }
 
 define void @f_i32(i32 %a) #0 {
-; CHECK-v1: f_i32:
-; CHECK-v1: stxw [r2 + 0], r1 # encoding: [0x63,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
+; CHECK-v0: f_i32:
+; CHECK-v0: stxw [r2 + 0], r1 # encoding: [0x63,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
   store volatile i32 %a, i32* @g_i32, align 2
   ret void
 }
 
 define void @f_i64(i64 %a) #0 {
-; CHECK-v1: f_i64:
-; CHECK-v1: stxdw [r2 + 0], r1  # encoding: [0x7b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
+; CHECK-v0: f_i64:
+; CHECK-v0: stxdw [r2 + 0], r1  # encoding: [0x7b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
   store volatile i64 %a, i64* @g_i64, align 2
   ret void
 }
 
 define void @f_i32_i32(i32 %a, i32 %b) #0 {
-; CHECK-v1: f_i32_i32:
-; CHECK-v1: stxw [r3 + 0], r1
+; CHECK-v0: f_i32_i32:
+; CHECK-v0: stxw [r3 + 0], r1
   store volatile i32 %a, i32* @g_i32, align 4
-; CHECK-v1: stxw [r3 + 0], r2
+; CHECK-v0: stxw [r3 + 0], r2
   store volatile i32 %b, i32* @g_i32, align 4
   ret void
 }
 
 define void @f_i16_i32_i16(i16 %a, i32 %b, i16 %c) #0 {
-; CHECK-v1: f_i16_i32_i16:
-; CHECK-v1: stxh [r4 + 0], r1
+; CHECK-v0: f_i16_i32_i16:
+; CHECK-v0: stxh [r4 + 0], r1
   store volatile i16 %a, i16* @g_i16, align 2
-; CHECK-v1: stxw [r1 + 0], r2
+; CHECK-v0: stxw [r1 + 0], r2
   store volatile i32 %b, i32* @g_i32, align 4
-; CHECK-v1: stxh [r4 + 0], r3
+; CHECK-v0: stxh [r4 + 0], r3
   store volatile i16 %c, i16* @g_i16, align 2
   ret void
 }
 
 define void @f_i16_i64_i16(i16 %a, i64 %b, i16 %c) #0 {
-; CHECK-v1: f_i16_i64_i16:
-; CHECK-v1: stxh [r4 + 0], r1
+; CHECK-v0: f_i16_i64_i16:
+; CHECK-v0: stxh [r4 + 0], r1
   store volatile i16 %a, i16* @g_i16, align 2
-; CHECK-v1: stxdw [r1 + 0], r2 # encoding: [0x7b,0x21,0x00,0x00,0x00,0x00,0x00,0x00]
+; CHECK-v0: stxdw [r1 + 0], r2 # encoding: [0x7b,0x21,0x00,0x00,0x00,0x00,0x00,0x00]
   store volatile i64 %b, i64* @g_i64, align 8
-; CHECK-v1: stxh [r4 + 0], r3
+; CHECK-v0: stxh [r4 + 0], r3
   store volatile i16 %c, i16* @g_i16, align 2
   ret void
 }
diff --git a/llvm/test/CodeGen/SBF/many_args_new_conv.ll b/llvm/test/CodeGen/SBF/many_args_new_conv.ll
index 0fe748a6266f0..6cd295e00bfd4 100644
--- a/llvm/test/CodeGen/SBF/many_args_new_conv.ll
+++ b/llvm/test/CodeGen/SBF/many_args_new_conv.ll
@@ -1,5 +1,5 @@
-; RUN: llc -O2 -march=sbf -mcpu=sbfv2 < %s | FileCheck %s
-; RUN: llc -O2 -march=sbf -mcpu=sbfv2 -mattr=+mem-encoding < %s | FileCheck %s
+; RUN: llc -O2 -march=sbf -mcpu=v1 < %s | FileCheck %s
+; RUN: llc -O2 -march=sbf -mcpu=v1 -mattr=+mem-encoding < %s | FileCheck %s
 
 ; Function Attrs: nounwind uwtable
 define i32 @caller_no_alloca(i32 %a, i32 %b, i32 %c) #0 {
@@ -10,16 +10,11 @@ entry:
 ; CHECK-NOT: add64 r10
 
 ; Saving arguments on the stack
-; CHECK: mov64 r4, 55
-; CHECK: stxdw [r10 - 32], r4
-; CHECK: mov64 r4, 60
-; CHECK: stxdw [r10 - 40], r4
-; CHECK: mov64 r4, 50
-; CHECK: stxdw [r10 - 24], r4
-; CHECK: mov64 r4, 4
-; CHECK: stxdw [r10 - 16], r4
-; CHECK: mov64 r4, 3
-; CHECK: stxdw [r10 - 8], r4
+; CHECK: stdw [r10 - 32], 55
+; CHECK: stdw [r10 - 40], 60
+; CHECK: stdw [r10 - 24], 50
+; CHECK: stdw [r10 - 16], 4
+; CHECK: stdw [r10 - 8], 3
 ; CHECK: mov64 r4, 1
 ; CHECK: mov64 r5, 2
 ; CHECK: call callee_alloca
@@ -35,22 +30,17 @@ define i32 @caller_alloca(i32 %a, i32 %b, i32 %c) #0 {
 ; CHECK: ldxw r1, [r10 + 60]
 
 ; Saving arguments in the callee's frame
-; CHECK: mov64 r4, 55
 
 ; Offset in the callee: frame_size - 32
-; CHECK: stxdw [r10 - 32], r4
-; CHECK: mov64 r4, 60
+; CHECK: stdw [r10 - 32], 55
 ; Offset in the callee: frame_size - 40
-; CHECK: stxdw [r10 - 40], r4
-; CHECK: mov64 r4, 50
+; CHECK: stdw [r10 - 40], 60
 ; Offset in the callee: frame_size - 24
-; CHECK: stxdw [r10 - 24], r4
-; CHECK: mov64 r4, 4
+; CHECK: stdw [r10 - 24], 50
 ; Offset in the callee: frame_size - 16
-; CHECK: stxdw [r10 - 16], r4
-; CHECK: mov64 r4, 3
+; CHECK: stdw [r10 - 16], 4
 ; Offset in the callee: frame_size - 8
-; CHECK: stxdw [r10 - 8], r4
+; CHECK: stdw [r10 - 8], 3
 ; CHECK: mov64 r4, 1
 ; CHECK: mov64 r5, 2
 ; CHECK: call callee_no_alloca
diff --git a/llvm/test/CodeGen/SBF/objdump_cond_op.ll b/llvm/test/CodeGen/SBF/objdump_cond_op.ll
index ecabfee937e28..627f60f00876d 100644
--- a/llvm/test/CodeGen/SBF/objdump_cond_op.ll
+++ b/llvm/test/CodeGen/SBF/objdump_cond_op.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
+; RUN: llc -march=sbf -mcpu=v2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
 
 ; Source Code:
 ; int gbl;
@@ -25,48 +25,45 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {
   %6 = shl i32 %5, 1
   %7 = mul i32 %6, %5
   br label %13
-; CHECK: lsh64 r1, 0x20
-; CHECK: rsh64 r1, 0x20
-; CHECK: jne r1, 0x2, +0x6 <LBB0_2>
+; CHECK: mov32 w3, w1
+; CHECK: jne r3, 0x2, +0x6 <LBB0_2>
 
 ; <label>:8:                                      ; preds = %2
   %9 = icmp eq i32 %0, %1
   %10 = load i32, i32* @gbl, align 4
   br i1 %9, label %15, label %11
 
-; CHECK: mov32 r1, 0x0
+; CHECK: mov32 w1, 0x0
 ; CHECK: hor64 r1, 0x0
-; CHECK: ldxw r0, [r1 + 0x0]
-; CHECK: mul64 r0, r0
-; CHECK: lsh64 r0, 0x1
-; CHECK: ja +0x7 <LBB0_4>
+; CHECK: ldxw w0, [r1 + 0x0]
+; CHECK: lmul32 w0, w0
+; CHECK: lsh32 w0, 0x1
+; CHECK: ja +0x5 <LBB0_4>
 
 ; <label>:11:                                     ; preds = %8
   %12 = shl nsw i32 %10, 2
   br label %13
 
 ; CHECK-LABEL: <LBB0_2>:
-; CHECK: mov32 r3, 0x0
+; CHECK: mov32 w3, 0x0
 ; CHECK: hor64 r3, 0x0
-; CHECK: ldxw r0, [r3 + 0x0]
-; CHECK: lsh64 r2, 0x20
-; CHECK: rsh64 r2, 0x20
+; CHECK: ldxw w0, [r3 + 0x0]
 ; CHECK: jeq r1, r2, +0x4 <LBB0_5>
-; CHECK: lsh64 r0, 0x2
+; CHECK: lsh32 w0, 0x2
 
 ; <label>:13:                                     ; preds = %4, %11
   %14 = phi i32 [ %12, %11 ], [ %7, %4 ]
   store i32 %14, i32* @gbl, align 4
   br label %15
 ; CHECK-LABEL: <LBB0_4>:
-; CHECK: mov32 r1, 0x0
+; CHECK: mov32 w1, 0x0
 ; CHECK: hor64 r1, 0x0
-; CHECK: stxw [r1 + 0x0], r0
+; CHECK: stxw [r1 + 0x0], w0
 
 ; <label>:15:                                     ; preds = %8, %13
   %16 = phi i32 [ %14, %13 ], [ %10, %8 ]
   ret i32 %16
 ; CHECK-LABEL: <LBB0_5>:
-; CHECK: return
+; CHECK: exit
 }
 attributes #0 = { norecurse nounwind }
diff --git a/llvm/test/CodeGen/SBF/objdump_cond_op_2.ll b/llvm/test/CodeGen/SBF/objdump_cond_op_2.ll
index 085d617baa792..4f01d8b2d452a 100644
--- a/llvm/test/CodeGen/SBF/objdump_cond_op_2.ll
+++ b/llvm/test/CodeGen/SBF/objdump_cond_op_2.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
+; RUN: llc -march=sbf -mcpu=v1 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
 
 ; Source Code:
 ; int test(int a, int b) {
@@ -27,12 +27,12 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {
   %12 = icmp slt i32 %10, %11
   br i1 %12, label %5, label %13
 ; CHECK: mov64 r1, r3
-; CHECK: jsgt r2, r3, -0xa <LBB0_1>
+; CHECK: jslt r3, r2, -0xa <LBB0_1>
 
 ; <label>:13:                                     ; preds = %5, %2
   %14 = phi i32 [ 0, %2 ], [ %9, %5 ]
   ret i32 %14
 ; CHECK-LABEL: <LBB0_2>:
-; CHECK: return
+; CHECK: exit
 }
 attributes #0 = { norecurse nounwind readnone }
diff --git a/llvm/test/CodeGen/SBF/objdump_imm_hex.ll b/llvm/test/CodeGen/SBF/objdump_imm_hex.ll
index a840258825c79..00f4b7c494345 100644
--- a/llvm/test/CodeGen/SBF/objdump_imm_hex.ll
+++ b/llvm/test/CodeGen/SBF/objdump_imm_hex.ll
@@ -1,6 +1,6 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck --check-prefix=CHECK-DEC %s
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -d --print-imm-hex - | FileCheck --check-prefix=CHECK-HEX %s
-; RUN: llc < %s -march=sbf -mcpu=sbfv2 -show-mc-encoding | FileCheck --check-prefix=CHECK-REL %s
+; RUN: llc -march=sbf -mcpu=v2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck --check-prefix=CHECK-DEC %s
+; RUN: llc -march=sbf -mcpu=v2 -filetype=obj -o - %s | llvm-objdump -d --print-imm-hex - | FileCheck --check-prefix=CHECK-HEX %s
+; RUN: llc < %s -march=sbf -mcpu=v2 -show-mc-encoding | FileCheck --check-prefix=CHECK-REL %s
 
 ; Source Code:
 ; int gbl;
@@ -26,38 +26,38 @@ define i32 @test(i64, i64) local_unnamed_addr #0 {
 ; CHECK-LABEL: test
   %3 = icmp eq i64 %0, -6067004223159161907
   br i1 %3, label %4, label %8
-; CHECK-DEC: b4 03 00 00 cd ab cd ab	mov32 r3, -0x54325433
+; CHECK-DEC: b4 03 00 00 cd ab cd ab	mov32 w3, -0x54325433
 ; CHECK-DEC: f7 03 00 00 cd ab cd ab	hor64 r3, -0x54325433
 ; CHECK-DEC: 5d 31 07 00 00 00 00 00         jne r1, r3, +0x7
-; CHECK-HEX: b4 03 00 00 cd ab cd ab	mov32 r3, -0x54325433
+; CHECK-HEX: b4 03 00 00 cd ab cd ab	mov32 w3, -0x54325433
 ; CHECK-HEX: f7 03 00 00 cd ab cd ab	hor64 r3, -0x54325433
 ; CHECK-HEX: 5d 31 07 00 00 00 00 00         jne r1, r3, +0x7
 
 ; <label>:4:                                      ; preds = %2
-; CHECK-DEC: b4 01 00 00 00 00 00 00	mov32 r1, 0x0
+; CHECK-DEC: b4 01 00 00 00 00 00 00	mov32 w1, 0x0
 ; CHECK-DEC: f7 01 00 00 00 00 00 00	hor64 r1, 0x0
-; CHECK-HEX: b4 01 00 00 00 00 00 00	mov32 r1, 0x0
+; CHECK-HEX: b4 01 00 00 00 00 00 00	mov32 w1, 0x0
 ; CHECK-HEX: f7 01 00 00 00 00 00 00	hor64 r1, 0x0
 ; CHECK-REL:   fixup A - offset: 0, value: gbl, kind: FK_SecRel_8
   %5 = load i32, i32* @gbl, align 4
   %6 = shl i32 %5, 1
-; CHECK-DEC: 67 01 00 00 01 00 00 00         lsh64 r1, 0x1
-; CHECK-HEX: 67 01 00 00 01 00 00 00         lsh64 r1, 0x1
+; CHECK-DEC: 64 01 00 00 01 00 00 00         lsh32 w1, 0x1
+; CHECK-HEX: 64 01 00 00 01 00 00 00         lsh32 w1, 0x1
   %7 = mul i32 %6, %5
   br label %13
 
 ; <label>:8:                                      ; preds = %2
   %9 = icmp eq i64 %1, 188899839028173
-; CHECK-DEC: b4 01 00 00 cd ab cd ab	mov32 r1, -0x54325433
+; CHECK-DEC: b4 01 00 00 cd ab cd ab	mov32 w1, -0x54325433
 ; CHECK-DEC: f7 01 00 00 cd ab 00 00	hor64 r1, 0xabcd
-; CHECK-HEX: b4 01 00 00 cd ab cd ab	mov32 r1, -0x54325433
+; CHECK-HEX: b4 01 00 00 cd ab cd ab	mov32 w1, -0x54325433
 ; CHECK-HEX: f7 01 00 00 cd ab 00 00	hor64 r1, 0xabcd
   br i1 %9, label %10, label %16
 
 ; <label>:10:                                     ; preds = %8
-; CHECK-DEC: b4 01 00 00 00 00 00 00	mov32 r1, 0x0
+; CHECK-DEC: b4 01 00 00 00 00 00 00	mov32 w1, 0x0
 ; CHECK-DEC: f7 01 00 00 00 00 00 00	hor64 r1, 0x0
-; CHECK-HEX: b4 01 00 00 00 00 00 00	mov32 r1, 0x0
+; CHECK-HEX: b4 01 00 00 00 00 00 00	mov32 w1, 0x0
 ; CHECK-HEX: f7 01 00 00 00 00 00 00	hor64 r1, 0x0
 ; CHECK-REL: fixup A - offset: 0, value: gbl, kind: FK_SecRel_8
   %11 = load i32, i32* @gbl, align 4
@@ -68,8 +68,8 @@ define i32 @test(i64, i64) local_unnamed_addr #0 {
   %14 = phi i32 [ %12, %10 ], [ %7, %4 ]
   %15 = phi i32 [ 2, %10 ], [ 1, %4 ]
   store i32 %14, i32* @gbl, align 4
-; CHECK-DEC: 63 12 00 00 00 00 00 00         stxw [r2 + 0x0], r1
-; CHECK-HEX: 63 12 00 00 00 00 00 00         stxw [r2 + 0x0], r1
+; CHECK-DEC: 8f 12 00 00 00 00 00 00         stxw [r2 + 0x0], w1
+; CHECK-HEX: 8f 12 00 00 00 00 00 00         stxw [r2 + 0x0], w1
   br label %16
 
 ; <label>:16:                                     ; preds = %13, %8
diff --git a/llvm/test/CodeGen/SBF/objdump_static_var.ll b/llvm/test/CodeGen/SBF/objdump_static_var.ll
index f65e775e3afc7..ec5c87e4e2a8e 100644
--- a/llvm/test/CodeGen/SBF/objdump_static_var.ll
+++ b/llvm/test/CodeGen/SBF/objdump_static_var.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -dr - | FileCheck --check-prefix=CHECK %s
+; RUN: llc -march=sbf -mcpu=v2 -filetype=obj -o - %s | llvm-objdump -dr - | FileCheck --check-prefix=CHECK %s
 
 ; src:
 ;   static volatile long a = 2;
@@ -10,20 +10,20 @@
 ; Function Attrs: norecurse nounwind
 define dso_local i32 @test() local_unnamed_addr #0 {
   %1 = load volatile i64, i64* @a, align 8, !tbaa !2
-; CHECK: mov32 r1, 0x0
+; CHECK: mov32 w1, 0x0
 ; CHECK: R_SBF_64_64	a
 ; CHECK: hor64 r1, 0x0
 ; CHECK: ldxdw r1, [r1 + 0x0]
   %2 = load volatile i32, i32* @b, align 4, !tbaa !6
-; CHECK: mov32 r2, 0x0
+; CHECK: mov32 w2, 0x0
 ; CHECK: R_SBF_64_64	b
 ; CHECK: hor64 r2, 0x0
-; CHECK: ldxw r0, [r2 + 0x0]
+; CHECK: ldxw w0, [r2 + 0x0]
   %3 = trunc i64 %1 to i32
   %4 = add i32 %2, %3
-; CHECK: add64 r0, r1
+; CHECK: add32 w0, w1
   ret i32 %4
-; CHECK: return
+; CHECK: exit
 }
 
 attributes #0 = { norecurse nounwind }
diff --git a/llvm/test/CodeGen/SBF/objdump_trivial.ll b/llvm/test/CodeGen/SBF/objdump_trivial.ll
index 4cc2140198338..388c3be7a373b 100644
--- a/llvm/test/CodeGen/SBF/objdump_trivial.ll
+++ b/llvm/test/CodeGen/SBF/objdump_trivial.ll
@@ -1,6 +1,6 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
+; RUN: llc -march=sbf -mcpu=v3 -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
 
-; CHECK: jsgt r2, r1,
+; CHECK: jslt r1, 0x0,
 ; CHECK: call 0x1
 ; CHECK: return
 ; CHECK: call 0x2
diff --git a/llvm/test/CodeGen/SBF/pqr-class.ll b/llvm/test/CodeGen/SBF/pqr-class.ll
index 5e43b15b84c2a..279ec819d0834 100644
--- a/llvm/test/CodeGen/SBF/pqr-class.ll
+++ b/llvm/test/CodeGen/SBF/pqr-class.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -mattr=+alu32 < %s | FileCheck --check-prefix=CHECK-v2 %s
+; RUN: llc -march=sbf -mcpu=v2 -mattr=+alu32 < %s | FileCheck --check-prefix=CHECK-v2 %s
 ; RUN: llc -march=sbf -mattr=+alu32 < %s | FileCheck --check-prefix=CHECK-v1 %s
 
 ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
diff --git a/llvm/test/CodeGen/SBF/reloc-3.ll b/llvm/test/CodeGen/SBF/reloc-3.ll
index c9cecf6e1564e..8c7dc7fb86d73 100644
--- a/llvm/test/CodeGen/SBF/reloc-3.ll
+++ b/llvm/test/CodeGen/SBF/reloc-3.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj -o %t.el < %s
+; RUN: llc -march=sbf -mcpu=v3 -filetype=obj -o %t.el < %s
 ; RUN: llvm-readelf -r %t.el | FileCheck %s
 
 ; source code:
diff --git a/llvm/test/CodeGen/SBF/reloc-abs64-sbf.ll b/llvm/test/CodeGen/SBF/reloc-abs64-sbf.ll
index 46318a1c36878..a55b1307a8fd8 100644
--- a/llvm/test/CodeGen/SBF/reloc-abs64-sbf.ll
+++ b/llvm/test/CodeGen/SBF/reloc-abs64-sbf.ll
@@ -1,5 +1,5 @@
 ; RUN: llc -march=sbf -filetype=obj < %s | llvm-objdump -r - | tee -i /tmp/foo | FileCheck --check-prefix=CHECK-RELOC-BPF %s
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj < %s | llvm-objdump -r - | tee -i /tmp/foo | FileCheck --check-prefix=CHECK-RELOC-SBFv2 %s
+; RUN: llc -march=sbf -mcpu=v3 -filetype=obj < %s | llvm-objdump -r - | tee -i /tmp/foo | FileCheck --check-prefix=CHECK-RELOC-SBFv3 %s
 
 @.str = private unnamed_addr constant [25 x i8] c"reloc_64_relative_data.c\00", align 1
 @FILE = dso_local constant i64 ptrtoint ([25 x i8]* @.str to i64), align 8
@@ -14,7 +14,7 @@ entry:
 }
 
 ; CHECK-RELOC-BPF:   RELOCATION RECORDS FOR [.data.rel.ro]:
-; CHECK-RELOC-BPF:   0000000000000000 R_BPF_64_64 .L.str
+; CHECK-RELOC-BPF:   0000000000000000 R_SBF_64_64 .L.str
 
-; CHECK-RELOC-SBFv2: RELOCATION RECORDS FOR [.data.rel.ro]:
-; CHECK-RELOC-SBFv2: 0000000000000000 R_SBF_64_ABS64 .L.str
+; CHECK-RELOC-SBFv3: RELOCATION RECORDS FOR [.data.rel.ro]:
+; CHECK-RELOC-SBFv3: 0000000000000000 R_SBF_64_ABS64 .L.str
diff --git a/llvm/test/CodeGen/SBF/reloc-btf.ll b/llvm/test/CodeGen/SBF/reloc-btf.ll
index 61cdd1460005d..579fba7cc99ac 100644
--- a/llvm/test/CodeGen/SBF/reloc-btf.ll
+++ b/llvm/test/CodeGen/SBF/reloc-btf.ll
@@ -1,4 +1,4 @@
-; RUN: llc -sbf-enable-btf-emission -march=sbf -mcpu=sbfv2 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s
+; RUN: llc -sbf-enable-btf-emission -march=sbf -mcpu=v3 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s
 
 ; Function Attrs: norecurse nounwind readnone
 define dso_local i32 @test() local_unnamed_addr #0 !dbg !7 {
diff --git a/llvm/test/CodeGen/SBF/reloc.ll b/llvm/test/CodeGen/SBF/reloc.ll
index 524a3da9db836..9c0b789151321 100644
--- a/llvm/test/CodeGen/SBF/reloc.ll
+++ b/llvm/test/CodeGen/SBF/reloc.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=sbfv2 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s
+; RUN: llc -march=sbf -mcpu=v3 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s
 
 %struct.bpf_context = type { i64, i64, i64, i64, i64, i64, i64 }
 %struct.sk_buff = type { i64, i64, i64, i64, i64, i64, i64 }
diff --git a/llvm/test/CodeGen/SBF/sdiv.ll b/llvm/test/CodeGen/SBF/sdiv.ll
index e00f751f8fc66..0be998ca25dc0 100644
--- a/llvm/test/CodeGen/SBF/sdiv.ll
+++ b/llvm/test/CodeGen/SBF/sdiv.ll
@@ -1,10 +1,10 @@
 ; RUN: llc -march=sbf < %s | FileCheck %s -check-prefixes=CHECK-SBF
-; RUN: llc -march=sbf -mcpu=sbfv2 < %s | FileCheck %s -check-prefixes=CHECK-SBFV2
+; RUN: llc -march=sbf -mcpu=v2 < %s | FileCheck %s -check-prefixes=CHECK-SBFV2
 
 ; Function Attrs: norecurse nounwind readnone
 define i32 @test(i32 %len) #0 {
   %1 = sdiv i32 %len, 15
 ; CHECK-SBF: call __divdi3
-; CHECK-SBFV2: sdiv64 r0, 15
+; CHECK-SBFV2: sdiv32 w0, 15
   ret i32 %1
 }
diff --git a/llvm/test/CodeGen/SBF/select_ri.ll b/llvm/test/CodeGen/SBF/select_ri.ll
index b21274085ce97..b9d710e268d46 100644
--- a/llvm/test/CodeGen/SBF/select_ri.ll
+++ b/llvm/test/CodeGen/SBF/select_ri.ll
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=sbf -mcpu=v2 -verify-machineinstrs | FileCheck %s
+; RUN: llc < %s -march=sbf -mcpu=v1 -verify-machineinstrs | FileCheck %s
 ;
 ; Source file:
 ; int b, c;
diff --git a/llvm/test/CodeGen/SBF/spill-alu32.ll b/llvm/test/CodeGen/SBF/spill-alu32.ll
index d8c6ebf83cb31..ed96651a8b491 100644
--- a/llvm/test/CodeGen/SBF/spill-alu32.ll
+++ b/llvm/test/CodeGen/SBF/spill-alu32.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=sbf -mcpu=v3 < %s | FileCheck %s
+; RUN: llc -march=sbf -mcpu=v2 < %s | FileCheck %s
 ;
 ; Source code:
 ;   void foo(int, int, int, long, int);
@@ -17,11 +17,11 @@ entry:
   tail call void @foo(i32 %a, i32 %b, i32 %c, i64 %d, i32 %e) #2
   tail call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{memory}"() #2
 
-; CHECK:        stxw [r10 - 8], w5
-; CHECK:        stxdw [r10 - 16], r4
-; CHECK:        stxw [r10 - 24], w3
-; CHECK:        stxw [r10 - 32], w2
-; CHECK:        stxw [r10 - 40], w1
+; CHECK:        stxw [r10 + 56], w5
+; CHECK:        stxdw [r10 + 48], r4
+; CHECK:        stxw [r10 + 40], w3
+; CHECK:        stxw [r10 + 32], w2
+; CHECK:        stxw [r10 + 24], w1
 ; CHECK:        call foo
 
   tail call void @foo(i32 %a, i32 %b, i32 %c, i64 %d, i32 %e) #2
diff --git a/llvm/test/CodeGen/SBF/sub_reversed_immediate.ll b/llvm/test/CodeGen/SBF/sub_reversed_immediate.ll
index 8040eb767b728..9aff3ce8b3d8b 100644
--- a/llvm/test/CodeGen/SBF/sub_reversed_immediate.ll
+++ b/llvm/test/CodeGen/SBF/sub_reversed_immediate.ll
@@ -1,5 +1,5 @@
 ; RUN: llc < %s -march=sbf -mattr=+alu32 | FileCheck  --check-prefix=CHECK-v1 %s
-; RUN: llc < %s -march=sbf -mattr=+alu32 -mcpu=sbfv2 | FileCheck  --check-prefix=CHECK-v2 %s
+; RUN: llc < %s -march=sbf -mcpu=v2 | FileCheck  --check-prefix=CHECK-v2 %s
 
 
 ; Function Attrs: norecurse nounwind readnone
diff --git a/llvm/test/MC/SBF/elf-flags.s b/llvm/test/MC/SBF/elf-flags.s
index 75089706a18e5..a0a975959ccbd 100644
--- a/llvm/test/MC/SBF/elf-flags.s
+++ b/llvm/test/MC/SBF/elf-flags.s
@@ -1,15 +1,31 @@
 # RUN: llvm-mc -triple=sbf-solana-solana -filetype=obj < %s \
 # RUN:   | llvm-readobj --file-headers - \
 # RUN:   | FileCheck -check-prefix=CHECK-NONE %s
-# RUN: llvm-mc -triple=sbf-solana-solana -mcpu=sbfv2 -filetype=obj < %s \
+# RUN: llvm-mc -triple=sbf-solana-solana -mcpu=v1 -filetype=obj < %s \
 # RUN:   | llvm-readobj --file-headers - \
-# RUN:   | FileCheck -check-prefix=CHECK-SBFV2 %s
+# RUN:   | FileCheck -check-prefix=CHECK-SBFV1 %s
+# RUN: llvm-mc -triple=sbf-solana-solana -mcpu=v1 -filetype=obj < %s \
+# RUN:   | llvm-readobj --file-headers - \
+# RUN:   | FileCheck -check-prefix=CHECK-SBFV1 %s
+# RUN: llvm-mc -triple=sbf-solana-solana -mcpu=v3 -filetype=obj < %s \
+# RUN:   | llvm-readobj --file-headers - \
+# RUN:   | FileCheck -check-prefix=CHECK-SBFV3 %s
+
 
 # CHECK-NONE:       Flags [ (0x0)
 # CHECK-NONE-NEXT:  ]
 
-# CHECK-SBFV2:       Flags [ (0x20)
-# CHECK-SBFV2-NEXT:    0x20
+# CHECK-SBFV1:       Flags [ (0x1)
+# CHECK-SBFV1-NEXT:    0x1
+# CHECK-SBFV1-NEXT:  ]
+
+# CHECK-SBFV2:       Flags [ (0x2)
+# CHECK-SBFV2-NEXT:    0x2
 # CHECK-SBFV2-NEXT:  ]
 
+# CHECK-SBFV3:       Flags [ (0x3)
+# CHECK-SBFV3-NEXT:    0x1
+# CHECK-SBFV3-NEXT:    0x2
+# CHECK-SBFV3-NEXT:  ]
+
 mov64 r0, r0
diff --git a/llvm/test/MC/SBF/elf-header.s b/llvm/test/MC/SBF/elf-header.s
index ab09d7ba99b24..526e7f729857f 100644
--- a/llvm/test/MC/SBF/elf-header.s
+++ b/llvm/test/MC/SBF/elf-header.s
@@ -1,4 +1,8 @@
-# RUN: llvm-mc %s -filetype=obj -triple=sbf-solana-solana --mcpu=sbfv2 | llvm-readobj -h - \
+# RUN: llvm-mc %s -filetype=obj -triple=sbf-solana-solana --mcpu=v1 | llvm-readobj -h - \
+# RUN:     | FileCheck %s
+# RUN: llvm-mc %s -filetype=obj -triple=sbf-solana-solana --mcpu=v2 | llvm-readobj -h - \
+# RUN:     | FileCheck %s
+# RUN: llvm-mc %s -filetype=obj -triple=sbf-solana-solana --mcpu=v3 | llvm-readobj -h - \
 # RUN:     | FileCheck %s
 
 # CHECK: Format: elf64-sbf
@@ -16,7 +20,3 @@
 # CHECK:   Type: Relocatable (0x1)
 # CHECK:   Machine: EM_SBF (0x107)
 # CHECK:   Version: 1
-# CHECK:   Flags [ (0x20)
-# CHECK:     0x20
-# CHECK:   ]
-# CHECK: }
diff --git a/llvm/test/MC/SBF/insn-unit-32.s b/llvm/test/MC/SBF/insn-unit-32.s
index b44bbc375f40e..a3ebffc61328c 100644
--- a/llvm/test/MC/SBF/insn-unit-32.s
+++ b/llvm/test/MC/SBF/insn-unit-32.s
@@ -1,6 +1,6 @@
-# RUN: llvm-mc -triple sbf --mcpu=sbfv2 -filetype=obj -o %t %s
-# RUN: llvm-objdump  -d -r %t | FileCheck %s --check-prefixes=CHECK,CHECK-alu64
-# RUN: llvm-objdump  --mattr=+alu32 -d -r %t | FileCheck %s --check-prefixes=CHECK,CHECK-alu32
+# RUN: llvm-mc -triple sbf -filetype=obj -o %t %s
+# RUN: llvm-objdump  -d -r %t | FileCheck %s
+# RUN: llvm-objdump  --mattr=+alu32 -d -r %t | FileCheck %s
 
 // ======== BPF_ALU Class ========
   neg32 w1    // BPF_NEG
@@ -51,8 +51,6 @@
 // CHECK: 64 06 00 00 3f 00 00 00      lsh32 w6, 0x3f
 // CHECK: 74 07 00 00 20 00 00 00      rsh32 w7, 0x20
 // CHECK: a4 08 00 00 00 00 00 00      xor32 w8, 0x0
-// CHECK-alu64: b4 09 00 00 01 00 00 00      mov32 r9, 0x1
-// CHECK-alu64: b4 09 00 00 ff ff ff ff      mov32 r9, -0x1
-// CHECK-alu32: b4 09 00 00 01 00 00 00      mov32 w9, 0x1
-// CHECK-alu32: b4 09 00 00 ff ff ff ff      mov32 w9, -0x1
+// CHECK: b4 09 00 00 01 00 00 00      mov32 w9, 0x1
+// CHECK: b4 09 00 00 ff ff ff ff      mov32 w9, -0x1
 // CHECK: c4 0a 00 00 40 00 00 00      arsh32 w10, 0x40
diff --git a/llvm/test/MC/SBF/sbf-jmp.s b/llvm/test/MC/SBF/sbf-jmp.s
index 308e40eeeceb4..a781f9b31d1f0 100644
--- a/llvm/test/MC/SBF/sbf-jmp.s
+++ b/llvm/test/MC/SBF/sbf-jmp.s
@@ -1,8 +1,8 @@
-# RUN: llvm-mc %s -triple=sbf-solana-solana --mcpu=sbfv2 --show-encoding \
+# RUN: llvm-mc %s -triple=sbf-solana-solana --mcpu=v3 --show-encoding \
 # RUN:     | FileCheck %s --check-prefix=CHECK-ASM-NEW
 # RUN: llvm-mc %s -triple=sbf-solana-solana --show-encoding \
 # RUN:     | FileCheck %s --check-prefix=CHECK-ASM-OLD
-# RUN: llvm-mc %s -triple=sbf-solana-solana --mcpu=sbfv2 -filetype=obj \
+# RUN: llvm-mc %s -triple=sbf-solana-solana --mcpu=v3 -filetype=obj \
 # RUN:     | llvm-objdump -d -r - \
 # RUN:     | FileCheck --check-prefix=CHECK-OBJ-NEW %s
 # RUN: llvm-mc %s -triple=sbf-solana-solana -filetype=obj \
diff --git a/llvm/test/MC/SBF/sbf-return-syscall.s b/llvm/test/MC/SBF/sbf-return-syscall.s
index 9f3b9ca00004a..1e13462e1b48a 100644
--- a/llvm/test/MC/SBF/sbf-return-syscall.s
+++ b/llvm/test/MC/SBF/sbf-return-syscall.s
@@ -1,4 +1,4 @@
-# RUN: llvm-mc -triple=sbf-solana-solana --mcpu=sbfv2 -filetype=obj -o %t %s
+# RUN: llvm-mc -triple=sbf-solana-solana --mcpu=v3 -filetype=obj -o %t %s
 # RUN: llvm-objdump -d -r %t | FileCheck --check-prefix=CHECK %s
 
 syscall 9
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 275433ade5076..d55b595b0c3e0 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -2447,11 +2447,22 @@ static void disassembleObject(ObjectFile *Obj, bool InlineRelocs) {
   }
 
   // The SBF target specifies the cpu type as an ELF flag, which is not parsed automatically in LLVM objdump.
-  // We must set the CPU type here so that the disassembler can decode the SBFv2 features correctly.
+  // We must set the CPU type here so that the disassembler can decode the newer SBF features correctly.
   if (MCPU.empty() && Obj->isELF() && Obj->getArch() == Triple::sbf) {
     const auto *Elf64 = dyn_cast<ELF64LEObjectFile>(Obj);
-    if (Elf64->getPlatformFlags() & ELF::EF_SBF_V2) {
-      MCPU = "sbfv2";
+    switch (Elf64->getPlatformFlags()) {
+      case llvm::ELF::EF_SBF_V1:
+        MCPU = "v1";
+        break;
+      case llvm::ELF::EF_SBF_V2:
+        MCPU = "v2";
+        break;
+      case llvm::ELF::EF_SBF_V3:
+        MCPU = "v3";
+        break;
+      default:
+        MCPU = "generic";
+        break;
     }
   }