Skip to content

Conversation

@andreisfr
Copy link
Contributor

Implement Xtensa Mul16, Mul32, Mul32High and Div32 Options.

@llvmbot llvmbot added llvm:mc Machine (object) code backend:Xtensa labels Mar 20, 2025
@llvmbot
Copy link
Member

llvmbot commented Mar 20, 2025

@llvm/pr-subscribers-mc

Author: Andrei Safronov (andreisfr)

Changes

Implement Xtensa Mul16, Mul32, Mul32High and Div32 Options.


Patch is 59.62 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/132157.diff

9 Files Affected:

  • (modified) llvm/lib/Target/Xtensa/XtensaFeatures.td (+20)
  • (modified) llvm/lib/Target/Xtensa/XtensaISelLowering.cpp (+25-7)
  • (modified) llvm/lib/Target/Xtensa/XtensaInstrInfo.td (+30)
  • (modified) llvm/lib/Target/Xtensa/XtensaSubtarget.h (+8)
  • (modified) llvm/test/CodeGen/Xtensa/div.ll (+336-30)
  • (modified) llvm/test/CodeGen/Xtensa/mul.ll (+515)
  • (added) llvm/test/CodeGen/Xtensa/rem.ll (+49)
  • (added) llvm/test/MC/Xtensa/div.s (+24)
  • (added) llvm/test/MC/Xtensa/mul.s (+29)
diff --git a/llvm/lib/Target/Xtensa/XtensaFeatures.td b/llvm/lib/Target/Xtensa/XtensaFeatures.td
index 184828cd253f3..d2e0a711a3575 100644
--- a/llvm/lib/Target/Xtensa/XtensaFeatures.td
+++ b/llvm/lib/Target/Xtensa/XtensaFeatures.td
@@ -22,3 +22,23 @@ def FeatureBoolean          : SubtargetFeature<"bool", "HasBoolean", "true",
                                                "Enable Xtensa Boolean extension">;
 def HasBoolean              : Predicate<"Subtarget->hasBoolean()">,
                                          AssemblerPredicate<(all_of FeatureBoolean)>;
+
+def FeatureMul16            : SubtargetFeature<"mul16", "HasMul16", "true",
+                                               "Enable Xtensa Mul16 option">;
+def HasMul16                : Predicate<"Subtarget->hasMul16()">,
+                                         AssemblerPredicate<(all_of FeatureMul16)>;
+
+def FeatureMul32            : SubtargetFeature<"mul32", "HasMul32", "true",
+                                               "Enable Xtensa Mul32 option">;
+def HasMul32                : Predicate<"Subtarget->hasMul32()">,
+                                         AssemblerPredicate<(all_of FeatureMul32)>;
+
+def FeatureMul32High        : SubtargetFeature<"mul32high", "HasMul32High", "true",
+                                               "Enable Xtensa Mul32High option">;
+def HasMul32High            : Predicate<"Subtarget->hasMul32High()">,
+                                         AssemblerPredicate<(all_of FeatureMul32High)>;
+
+def FeatureDiv32            : SubtargetFeature<"div32", "HasDiv32", "true",
+                                               "Enable Xtensa Div32 option">;
+def HasDiv32                : Predicate<"Subtarget->hasDiv32()">,
+                                         AssemblerPredicate<(all_of FeatureDiv32)>;
diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
index 57f0cbbc36c24..0b0e41c1c7b4e 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
@@ -106,16 +106,34 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
   setCondCodeAction(ISD::SETUGT, MVT::i32, Expand);
   setCondCodeAction(ISD::SETULE, MVT::i32, Expand);
 
-  setOperationAction(ISD::MUL, MVT::i32, Expand);
-  setOperationAction(ISD::MULHU, MVT::i32, Expand);
-  setOperationAction(ISD::MULHS, MVT::i32, Expand);
+  if (Subtarget.hasMul32())
+    setOperationAction(ISD::MUL, MVT::i32, Legal);
+  else
+    setOperationAction(ISD::MUL, MVT::i32, Expand);
+
+  if (Subtarget.hasMul32High()) {
+    setOperationAction(ISD::MULHU, MVT::i32, Legal);
+    setOperationAction(ISD::MULHS, MVT::i32, Legal);
+  } else {
+    setOperationAction(ISD::MULHU, MVT::i32, Expand);
+    setOperationAction(ISD::MULHS, MVT::i32, Expand);
+  }
+
   setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand);
   setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand);
 
-  setOperationAction(ISD::SDIV, MVT::i32, Expand);
-  setOperationAction(ISD::UDIV, MVT::i32, Expand);
-  setOperationAction(ISD::SREM, MVT::i32, Expand);
-  setOperationAction(ISD::UREM, MVT::i32, Expand);
+  if (Subtarget.hasDiv32()) {
+    setOperationAction(ISD::SDIV, MVT::i32, Legal);
+    setOperationAction(ISD::UDIV, MVT::i32, Legal);
+    setOperationAction(ISD::SREM, MVT::i32, Legal);
+    setOperationAction(ISD::UREM, MVT::i32, Legal);
+  } else {
+    setOperationAction(ISD::SDIV, MVT::i32, Expand);
+    setOperationAction(ISD::UDIV, MVT::i32, Expand);
+    setOperationAction(ISD::SREM, MVT::i32, Expand);
+    setOperationAction(ISD::UREM, MVT::i32, Expand);
+  }
+
   setOperationAction(ISD::SDIVREM, MVT::i32, Expand);
   setOperationAction(ISD::UDIVREM, MVT::i32, Expand);
 
diff --git a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
index 1f397e3ecac35..23f2298b55c96 100644
--- a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
+++ b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
@@ -850,6 +850,36 @@ let Constraints = "$dr = $r,@earlyclobber $dr" in {
                    "movt\t$r, $s, $t", []>, Requires<[HasBoolean]>;
 }
 
+//===----------------------------------------------------------------------===//
+// Mul16 Instructions
+//===----------------------------------------------------------------------===//
+
+let Predicates = [HasMul16] in {
+  def MUL16S : RRR_Inst<0x00, 0x01, 0x0D, (outs AR:$r), (ins AR:$s, AR:$t),
+                       "mul16s\t$r, $s, $t", []>;
+  def MUL16U : RRR_Inst<0x00, 0x01, 0x0C, (outs AR:$r), (ins AR:$s, AR:$t),
+                       "mul16u\t$r, $s, $t", []>;
+}
+
+//===----------------------------------------------------------------------===//
+// Mul32 Instructions
+//===----------------------------------------------------------------------===//
+
+def MULL  : ArithLogic_RRR<0x08, 0x02, "mull", mul, 1>, Requires<[HasMul32]>;
+def MULUH : ArithLogic_RRR<0x0A, 0x02, "muluh", mulhu, 1>, Requires<[HasMul32High]>;
+def MULSH : ArithLogic_RRR<0x0B, 0x02, "mulsh", mulhs, 1>, Requires<[HasMul32High]>;
+
+//===----------------------------------------------------------------------===//
+// Div32 Instructions
+//===----------------------------------------------------------------------===//
+
+let Predicates = [HasDiv32] in {
+  def QUOS : ArithLogic_RRR<0x0D, 0x02, "quos", sdiv>;
+  def QUOU : ArithLogic_RRR<0x0C, 0x02, "quou", udiv>;
+  def REMS : ArithLogic_RRR<0x0F, 0x02, "rems", srem>;
+  def REMU : ArithLogic_RRR<0x0E, 0x02, "remu", urem>;
+}
+
 //===----------------------------------------------------------------------===//
 // DSP Instructions
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/Xtensa/XtensaSubtarget.h b/llvm/lib/Target/Xtensa/XtensaSubtarget.h
index 770f73905b337..3c3c49dd716df 100644
--- a/llvm/lib/Target/Xtensa/XtensaSubtarget.h
+++ b/llvm/lib/Target/Xtensa/XtensaSubtarget.h
@@ -66,6 +66,14 @@ class XtensaSubtarget : public XtensaGenSubtargetInfo {
 
   bool hasDensity() const { return HasDensity; }
 
+  bool hasMul16() const { return HasMul16; }
+
+  bool hasMul32() const { return HasMul32; }
+
+  bool hasMul32High() const { return HasMul32High; }
+
+  bool hasDiv32() const { return HasDiv32; }
+
   bool hasMAC16() const { return HasMAC16; }
 
   bool hasWindowed() const { return HasWindowed; }
diff --git a/llvm/test/CodeGen/Xtensa/div.ll b/llvm/test/CodeGen/Xtensa/div.ll
index 8d51c571efb4c..48630e3960b9a 100644
--- a/llvm/test/CodeGen/Xtensa/div.ll
+++ b/llvm/test/CodeGen/Xtensa/div.ll
@@ -1,10 +1,13 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
 ; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
 ; RUN:   | FileCheck -check-prefix=XTENSA %s
+; RUN: llc -mtriple=xtensa -mattr=+div32 -verify-machineinstrs < %s \
+; RUN: | FileCheck -check-prefix=XTENSA-DIV %s
 
 define i32 @udiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-LABEL: udiv:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI0_0
@@ -13,13 +16,19 @@ define i32 @udiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    quou a2, a2, a3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, %b
   ret i32 %1
 }
 
 define i32 @udiv_constant(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a3, 5
@@ -29,21 +38,34 @@ define i32 @udiv_constant(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 5
+; XTENSA-DIV-NEXT:    quou a2, a2, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, 5
   ret i32 %1
 }
 
 define i32 @udiv_pow2(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_pow2:
-; XTENSA:         srli a2, a2, 3
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    srli a2, a2, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    srli a2, a2, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, 8
   ret i32 %1
 }
 
 define i32 @udiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a3, a2, a2
@@ -54,13 +76,20 @@ define i32 @udiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 10
+; XTENSA-DIV-NEXT:    quou a2, a8, a2
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 10, %a
   ret i32 %1
 }
 
 define i64 @udiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-LABEL: udiv64:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI4_0
@@ -69,13 +98,26 @@ define i64 @udiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI4_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 %a, %b
   ret i64 %1
 }
 
 define i64 @udiv64_constant(i64 %a) nounwind {
 ; XTENSA-LABEL: udiv64_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a4, 5
@@ -86,13 +128,28 @@ define i64 @udiv64_constant(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    movi a4, 5
+; XTENSA-DIV-NEXT:    movi a5, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI5_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 %a, 5
   ret i64 %1
 }
 
 define i64 @udiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-LABEL: udiv64_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a5, a3, a3
@@ -105,13 +162,30 @@ define i64 @udiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    or a5, a3, a3
+; XTENSA-DIV-NEXT:    or a4, a2, a2
+; XTENSA-DIV-NEXT:    movi a2, 10
+; XTENSA-DIV-NEXT:    movi a3, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI6_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 10, %a
   ret i64 %1
 }
 
 define i8 @udiv8(i8 %a, i8 %b) nounwind {
 ; XTENSA-LABEL: udiv8:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -123,13 +197,22 @@ define i8 @udiv8(i8 %a, i8 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a9, a3, a8
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, %b
   ret i8 %1
 }
 
 define i8 @udiv8_constant(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -141,23 +224,40 @@ define i8 @udiv8_constant(i8 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 5
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, 5
   ret i8 %1
 }
 
 define i8 @udiv8_pow2(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_pow2:
-; XTENSA:         movi a8, 248
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    movi a8, 248
 ; XTENSA-NEXT:    and a8, a2, a8
 ; XTENSA-NEXT:    srli a2, a8, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 248
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    srli a2, a8, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, 8
   ret i8 %1
 }
 
 define i8 @udiv8_constant_lhs(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -169,13 +269,22 @@ define i8 @udiv8_constant_lhs(i8 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 10
+; XTENSA-DIV-NEXT:    quou a2, a9, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 10, %a
   ret i8 %1
 }
 
 define i16 @udiv16(i16 %a, i16 %b) nounwind {
 ; XTENSA-LABEL: udiv16:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI11_0
@@ -187,13 +296,22 @@ define i16 @udiv16(i16 %a, i16 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI11_0
+; XTENSA-DIV-NEXT:    and a9, a3, a8
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, %b
   ret i16 %1
 }
 
 define i16 @udiv16_constant(i16 %a) nounwind {
 ; XTENSA-LABEL: udiv16_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI12_0
@@ -205,23 +323,40 @@ define i16 @udiv16_constant(i16 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI12_0
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 5
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, 5
   ret i16 %1
 }
 
 define i16 @udiv16_pow2(i16 %a) nounwind {
 ; XTENSA-LABEL: udiv16_pow2:
-; XTENSA:         l32r a8, .LCPI13_0
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    l32r a8, .LCPI13_0
 ; XTENSA-NEXT:    and a8, a2, a8
 ; XTENSA-NEXT:    srli a2, a8, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI13_0
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    srli a2, a8, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, 8
   ret i16 %1
 }
 
 define i32 @sdiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-LABEL: sdiv:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI14_0
@@ -230,13 +365,19 @@ define i32 @sdiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    quos a2, a2, a3
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i32 %a, %b
   ret i32 %1
 }
 
 define i32 @sdiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-LABEL: sdiv_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a3, a2, a2
@@ -247,13 +388,20 @@ define i32 @sdiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, -10
+; XTENSA-DIV-NEXT:    quos a2, a8, a2
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i32 -10, %a
   ret i32 %1
 }
 
 define i64 @sdiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-LABEL: sdiv64:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI16_0
@@ -262,13 +410,26 @@ define i64 @sdiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv64:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI16_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i64 %a, %b
   ret i64 %1
 }
 
 define i64 @sdiv64_constant(i64 %a) nounwind {
 ; XTENSA-LABEL: sdiv64_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a4, 5
@@ -279,13 +440,28 @@ define i64 @sdiv64_constant(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv64_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    movi a4, 5
+; XTENSA-DIV-NEXT:    movi a5, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI17_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i64 %a, 5
   ret i64 %1
 }
 
 define i64 @sdiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-LABEL: sdiv64_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; ...
[truncated]

@llvmbot
Copy link
Member

llvmbot commented Mar 20, 2025

@llvm/pr-subscribers-backend-xtensa

Author: Andrei Safronov (andreisfr)

Changes

Implement Xtensa Mul16, Mul32, Mul32High and Div32 Options.


Patch is 59.62 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/132157.diff

9 Files Affected:

  • (modified) llvm/lib/Target/Xtensa/XtensaFeatures.td (+20)
  • (modified) llvm/lib/Target/Xtensa/XtensaISelLowering.cpp (+25-7)
  • (modified) llvm/lib/Target/Xtensa/XtensaInstrInfo.td (+30)
  • (modified) llvm/lib/Target/Xtensa/XtensaSubtarget.h (+8)
  • (modified) llvm/test/CodeGen/Xtensa/div.ll (+336-30)
  • (modified) llvm/test/CodeGen/Xtensa/mul.ll (+515)
  • (added) llvm/test/CodeGen/Xtensa/rem.ll (+49)
  • (added) llvm/test/MC/Xtensa/div.s (+24)
  • (added) llvm/test/MC/Xtensa/mul.s (+29)
diff --git a/llvm/lib/Target/Xtensa/XtensaFeatures.td b/llvm/lib/Target/Xtensa/XtensaFeatures.td
index 184828cd253f3..d2e0a711a3575 100644
--- a/llvm/lib/Target/Xtensa/XtensaFeatures.td
+++ b/llvm/lib/Target/Xtensa/XtensaFeatures.td
@@ -22,3 +22,23 @@ def FeatureBoolean          : SubtargetFeature<"bool", "HasBoolean", "true",
                                                "Enable Xtensa Boolean extension">;
 def HasBoolean              : Predicate<"Subtarget->hasBoolean()">,
                                          AssemblerPredicate<(all_of FeatureBoolean)>;
+
+def FeatureMul16            : SubtargetFeature<"mul16", "HasMul16", "true",
+                                               "Enable Xtensa Mul16 option">;
+def HasMul16                : Predicate<"Subtarget->hasMul16()">,
+                                         AssemblerPredicate<(all_of FeatureMul16)>;
+
+def FeatureMul32            : SubtargetFeature<"mul32", "HasMul32", "true",
+                                               "Enable Xtensa Mul32 option">;
+def HasMul32                : Predicate<"Subtarget->hasMul32()">,
+                                         AssemblerPredicate<(all_of FeatureMul32)>;
+
+def FeatureMul32High        : SubtargetFeature<"mul32high", "HasMul32High", "true",
+                                               "Enable Xtensa Mul32High option">;
+def HasMul32High            : Predicate<"Subtarget->hasMul32High()">,
+                                         AssemblerPredicate<(all_of FeatureMul32High)>;
+
+def FeatureDiv32            : SubtargetFeature<"div32", "HasDiv32", "true",
+                                               "Enable Xtensa Div32 option">;
+def HasDiv32                : Predicate<"Subtarget->hasDiv32()">,
+                                         AssemblerPredicate<(all_of FeatureDiv32)>;
diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
index 57f0cbbc36c24..0b0e41c1c7b4e 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
@@ -106,16 +106,34 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
   setCondCodeAction(ISD::SETUGT, MVT::i32, Expand);
   setCondCodeAction(ISD::SETULE, MVT::i32, Expand);
 
-  setOperationAction(ISD::MUL, MVT::i32, Expand);
-  setOperationAction(ISD::MULHU, MVT::i32, Expand);
-  setOperationAction(ISD::MULHS, MVT::i32, Expand);
+  if (Subtarget.hasMul32())
+    setOperationAction(ISD::MUL, MVT::i32, Legal);
+  else
+    setOperationAction(ISD::MUL, MVT::i32, Expand);
+
+  if (Subtarget.hasMul32High()) {
+    setOperationAction(ISD::MULHU, MVT::i32, Legal);
+    setOperationAction(ISD::MULHS, MVT::i32, Legal);
+  } else {
+    setOperationAction(ISD::MULHU, MVT::i32, Expand);
+    setOperationAction(ISD::MULHS, MVT::i32, Expand);
+  }
+
   setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand);
   setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand);
 
-  setOperationAction(ISD::SDIV, MVT::i32, Expand);
-  setOperationAction(ISD::UDIV, MVT::i32, Expand);
-  setOperationAction(ISD::SREM, MVT::i32, Expand);
-  setOperationAction(ISD::UREM, MVT::i32, Expand);
+  if (Subtarget.hasDiv32()) {
+    setOperationAction(ISD::SDIV, MVT::i32, Legal);
+    setOperationAction(ISD::UDIV, MVT::i32, Legal);
+    setOperationAction(ISD::SREM, MVT::i32, Legal);
+    setOperationAction(ISD::UREM, MVT::i32, Legal);
+  } else {
+    setOperationAction(ISD::SDIV, MVT::i32, Expand);
+    setOperationAction(ISD::UDIV, MVT::i32, Expand);
+    setOperationAction(ISD::SREM, MVT::i32, Expand);
+    setOperationAction(ISD::UREM, MVT::i32, Expand);
+  }
+
   setOperationAction(ISD::SDIVREM, MVT::i32, Expand);
   setOperationAction(ISD::UDIVREM, MVT::i32, Expand);
 
diff --git a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
index 1f397e3ecac35..23f2298b55c96 100644
--- a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
+++ b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td
@@ -850,6 +850,36 @@ let Constraints = "$dr = $r,@earlyclobber $dr" in {
                    "movt\t$r, $s, $t", []>, Requires<[HasBoolean]>;
 }
 
+//===----------------------------------------------------------------------===//
+// Mul16 Instructions
+//===----------------------------------------------------------------------===//
+
+let Predicates = [HasMul16] in {
+  def MUL16S : RRR_Inst<0x00, 0x01, 0x0D, (outs AR:$r), (ins AR:$s, AR:$t),
+                       "mul16s\t$r, $s, $t", []>;
+  def MUL16U : RRR_Inst<0x00, 0x01, 0x0C, (outs AR:$r), (ins AR:$s, AR:$t),
+                       "mul16u\t$r, $s, $t", []>;
+}
+
+//===----------------------------------------------------------------------===//
+// Mul32 Instructions
+//===----------------------------------------------------------------------===//
+
+def MULL  : ArithLogic_RRR<0x08, 0x02, "mull", mul, 1>, Requires<[HasMul32]>;
+def MULUH : ArithLogic_RRR<0x0A, 0x02, "muluh", mulhu, 1>, Requires<[HasMul32High]>;
+def MULSH : ArithLogic_RRR<0x0B, 0x02, "mulsh", mulhs, 1>, Requires<[HasMul32High]>;
+
+//===----------------------------------------------------------------------===//
+// Div32 Instructions
+//===----------------------------------------------------------------------===//
+
+let Predicates = [HasDiv32] in {
+  def QUOS : ArithLogic_RRR<0x0D, 0x02, "quos", sdiv>;
+  def QUOU : ArithLogic_RRR<0x0C, 0x02, "quou", udiv>;
+  def REMS : ArithLogic_RRR<0x0F, 0x02, "rems", srem>;
+  def REMU : ArithLogic_RRR<0x0E, 0x02, "remu", urem>;
+}
+
 //===----------------------------------------------------------------------===//
 // DSP Instructions
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/Xtensa/XtensaSubtarget.h b/llvm/lib/Target/Xtensa/XtensaSubtarget.h
index 770f73905b337..3c3c49dd716df 100644
--- a/llvm/lib/Target/Xtensa/XtensaSubtarget.h
+++ b/llvm/lib/Target/Xtensa/XtensaSubtarget.h
@@ -66,6 +66,14 @@ class XtensaSubtarget : public XtensaGenSubtargetInfo {
 
   bool hasDensity() const { return HasDensity; }
 
+  bool hasMul16() const { return HasMul16; }
+
+  bool hasMul32() const { return HasMul32; }
+
+  bool hasMul32High() const { return HasMul32High; }
+
+  bool hasDiv32() const { return HasDiv32; }
+
   bool hasMAC16() const { return HasMAC16; }
 
   bool hasWindowed() const { return HasWindowed; }
diff --git a/llvm/test/CodeGen/Xtensa/div.ll b/llvm/test/CodeGen/Xtensa/div.ll
index 8d51c571efb4c..48630e3960b9a 100644
--- a/llvm/test/CodeGen/Xtensa/div.ll
+++ b/llvm/test/CodeGen/Xtensa/div.ll
@@ -1,10 +1,13 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
 ; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
 ; RUN:   | FileCheck -check-prefix=XTENSA %s
+; RUN: llc -mtriple=xtensa -mattr=+div32 -verify-machineinstrs < %s \
+; RUN: | FileCheck -check-prefix=XTENSA-DIV %s
 
 define i32 @udiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-LABEL: udiv:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI0_0
@@ -13,13 +16,19 @@ define i32 @udiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    quou a2, a2, a3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, %b
   ret i32 %1
 }
 
 define i32 @udiv_constant(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a3, 5
@@ -29,21 +38,34 @@ define i32 @udiv_constant(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 5
+; XTENSA-DIV-NEXT:    quou a2, a2, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, 5
   ret i32 %1
 }
 
 define i32 @udiv_pow2(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_pow2:
-; XTENSA:         srli a2, a2, 3
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    srli a2, a2, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    srli a2, a2, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 %a, 8
   ret i32 %1
 }
 
 define i32 @udiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-LABEL: udiv_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a3, a2, a2
@@ -54,13 +76,20 @@ define i32 @udiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 10
+; XTENSA-DIV-NEXT:    quou a2, a8, a2
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i32 10, %a
   ret i32 %1
 }
 
 define i64 @udiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-LABEL: udiv64:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI4_0
@@ -69,13 +98,26 @@ define i64 @udiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI4_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 %a, %b
   ret i64 %1
 }
 
 define i64 @udiv64_constant(i64 %a) nounwind {
 ; XTENSA-LABEL: udiv64_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a4, 5
@@ -86,13 +128,28 @@ define i64 @udiv64_constant(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    movi a4, 5
+; XTENSA-DIV-NEXT:    movi a5, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI5_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 %a, 5
   ret i64 %1
 }
 
 define i64 @udiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-LABEL: udiv64_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a5, a3, a3
@@ -105,13 +162,30 @@ define i64 @udiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv64_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    or a5, a3, a3
+; XTENSA-DIV-NEXT:    or a4, a2, a2
+; XTENSA-DIV-NEXT:    movi a2, 10
+; XTENSA-DIV-NEXT:    movi a3, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI6_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i64 10, %a
   ret i64 %1
 }
 
 define i8 @udiv8(i8 %a, i8 %b) nounwind {
 ; XTENSA-LABEL: udiv8:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -123,13 +197,22 @@ define i8 @udiv8(i8 %a, i8 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a9, a3, a8
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, %b
   ret i8 %1
 }
 
 define i8 @udiv8_constant(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -141,23 +224,40 @@ define i8 @udiv8_constant(i8 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 5
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, 5
   ret i8 %1
 }
 
 define i8 @udiv8_pow2(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_pow2:
-; XTENSA:         movi a8, 248
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    movi a8, 248
 ; XTENSA-NEXT:    and a8, a2, a8
 ; XTENSA-NEXT:    srli a2, a8, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 248
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    srli a2, a8, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 %a, 8
   ret i8 %1
 }
 
 define i8 @udiv8_constant_lhs(i8 %a) nounwind {
 ; XTENSA-LABEL: udiv8_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a8, 255
@@ -169,13 +269,22 @@ define i8 @udiv8_constant_lhs(i8 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv8_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, 255
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 10
+; XTENSA-DIV-NEXT:    quou a2, a9, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i8 10, %a
   ret i8 %1
 }
 
 define i16 @udiv16(i16 %a, i16 %b) nounwind {
 ; XTENSA-LABEL: udiv16:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI11_0
@@ -187,13 +296,22 @@ define i16 @udiv16(i16 %a, i16 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI11_0
+; XTENSA-DIV-NEXT:    and a9, a3, a8
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, %b
   ret i16 %1
 }
 
 define i16 @udiv16_constant(i16 %a) nounwind {
 ; XTENSA-LABEL: udiv16_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI12_0
@@ -205,23 +323,40 @@ define i16 @udiv16_constant(i16 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI12_0
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    movi a9, 5
+; XTENSA-DIV-NEXT:    quou a2, a8, a9
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, 5
   ret i16 %1
 }
 
 define i16 @udiv16_pow2(i16 %a) nounwind {
 ; XTENSA-LABEL: udiv16_pow2:
-; XTENSA:         l32r a8, .LCPI13_0
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    l32r a8, .LCPI13_0
 ; XTENSA-NEXT:    and a8, a2, a8
 ; XTENSA-NEXT:    srli a2, a8, 3
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: udiv16_pow2:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI13_0
+; XTENSA-DIV-NEXT:    and a8, a2, a8
+; XTENSA-DIV-NEXT:    srli a2, a8, 3
+; XTENSA-DIV-NEXT:    ret
   %1 = udiv i16 %a, 8
   ret i16 %1
 }
 
 define i32 @sdiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-LABEL: sdiv:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI14_0
@@ -230,13 +365,19 @@ define i32 @sdiv(i32 %a, i32 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    quos a2, a2, a3
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i32 %a, %b
   ret i32 %1
 }
 
 define i32 @sdiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-LABEL: sdiv_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    or a3, a2, a2
@@ -247,13 +388,20 @@ define i32 @sdiv_constant_lhs(i32 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv_constant_lhs:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    movi a8, -10
+; XTENSA-DIV-NEXT:    quos a2, a8, a2
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i32 -10, %a
   ret i32 %1
 }
 
 define i64 @sdiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-LABEL: sdiv64:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    l32r a8, .LCPI16_0
@@ -262,13 +410,26 @@ define i64 @sdiv64(i64 %a, i64 %b) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv64:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI16_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i64 %a, %b
   ret i64 %1
 }
 
 define i64 @sdiv64_constant(i64 %a) nounwind {
 ; XTENSA-LABEL: sdiv64_constant:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
 ; XTENSA-NEXT:    movi a4, 5
@@ -279,13 +440,28 @@ define i64 @sdiv64_constant(i64 %a) nounwind {
 ; XTENSA-NEXT:    addi a8, a1, 16
 ; XTENSA-NEXT:    or a1, a8, a8
 ; XTENSA-NEXT:    ret
+;
+; XTENSA-DIV-LABEL: sdiv64_constant:
+; XTENSA-DIV:       # %bb.0:
+; XTENSA-DIV-NEXT:    addi a8, a1, -16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-DIV-NEXT:    movi a4, 5
+; XTENSA-DIV-NEXT:    movi a5, 0
+; XTENSA-DIV-NEXT:    l32r a8, .LCPI17_0
+; XTENSA-DIV-NEXT:    callx0 a8
+; XTENSA-DIV-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-DIV-NEXT:    addi a8, a1, 16
+; XTENSA-DIV-NEXT:    or a1, a8, a8
+; XTENSA-DIV-NEXT:    ret
   %1 = sdiv i64 %a, 5
   ret i64 %1
 }
 
 define i64 @sdiv64_constant_lhs(i64 %a) nounwind {
 ; XTENSA-LABEL: sdiv64_constant_lhs:
-; XTENSA:         addi a8, a1, -16
+; XTENSA:       # %bb.0:
+; XTENSA-NEXT:    addi a8, a1, -16
 ; ...
[truncated]

@andreisfr andreisfr requested review from MaskRay and arsenm March 21, 2025 16:28
@andreisfr
Copy link
Contributor Author

@arsenm , @MaskRay could you PTAL?

; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=XTENSA %s
; RUN: llc -mtriple=xtensa -mattr=+div32 -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=XTENSA-DIV %s
Copy link
Member

Choose a reason for hiding this comment

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

Indent continulation lines by 2 spaces

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you very much for comments. I rebased current version on main branch to resolve conflicts and fixed indent.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Also I fixed "callw.ll" test, because code generation changed a bit in main branch.

}

bool hasDensity() const { return HasDensity; }

Copy link
Member

Choose a reason for hiding this comment

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

I think it's not necessary to add a blank line between all the trivial functions.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Fixed.

Implement Xtensa Mul16, Mul32, Mul32High and Div32 Options.
Also fix callw test.
@andreisfr andreisfr merged commit 5ad32fa into llvm:main Apr 18, 2025
11 checks passed
@llvm-ci
Copy link
Collaborator

llvm-ci commented Apr 18, 2025

LLVM Buildbot has detected a new failure on builder lldb-aarch64-ubuntu running on linaro-lldb-aarch64-ubuntu while building llvm at step 6 "test".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/59/builds/16281

Here is the relevant piece of the build log for the reference
Step 6 (test) failure: build (failure)
...
PASS: lldb-api :: tools/lldb-dap/databreakpoint/TestDAP_setDataBreakpoints.py (1167 of 2125)
PASS: lldb-api :: tools/lldb-dap/instruction-breakpoint/TestDAP_instruction_breakpoint.py (1168 of 2125)
PASS: lldb-api :: tools/lldb-dap/disconnect/TestDAP_disconnect.py (1169 of 2125)
PASS: lldb-api :: tools/lldb-dap/io/TestDAP_io.py (1170 of 2125)
PASS: lldb-api :: tools/lldb-dap/locations/TestDAP_locations.py (1171 of 2125)
PASS: lldb-api :: tools/lldb-dap/cancel/TestDAP_cancel.py (1172 of 2125)
PASS: lldb-api :: terminal/TestEditline.py (1173 of 2125)
PASS: lldb-api :: tools/lldb-dap/output/TestDAP_output.py (1174 of 2125)
PASS: lldb-api :: tools/lldb-dap/optimized/TestDAP_optimized.py (1175 of 2125)
UNRESOLVED: lldb-api :: tools/lldb-dap/memory/TestDAP_memory.py (1176 of 2125)
******************** TEST 'lldb-api :: tools/lldb-dap/memory/TestDAP_memory.py' FAILED ********************
Script:
--
/usr/bin/python3.10 /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/dotest.py -u CXXFLAGS -u CFLAGS --env LLVM_LIBS_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./lib --env LLVM_INCLUDE_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/include --env LLVM_TOOLS_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin --arch aarch64 --build-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex --lldb-module-cache-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-lldb/lldb-api --clang-module-cache-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-clang/lldb-api --executable /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/lldb --compiler /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/clang --dsymutil /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/dsymutil --make /usr/bin/gmake --llvm-tools-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin --lldb-obj-root /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/tools/lldb --lldb-libs-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./lib /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/tools/lldb-dap/memory -p TestDAP_memory.py
--
Exit Code: 1

Command Output (stdout):
--
lldb version 21.0.0git (https://github.com/llvm/llvm-project.git revision 5ad32fa6973638a091891942939933a41cbb2162)
  clang revision 5ad32fa6973638a091891942939933a41cbb2162
  llvm revision 5ad32fa6973638a091891942939933a41cbb2162
Skipping the following test categories: ['libc++', 'dsym', 'gmodules', 'debugserver', 'objc']

--
Command Output (stderr):
--
========= DEBUG ADAPTER PROTOCOL LOGS =========
1744997605.186235189 --> (stdin/stdout) {"command":"initialize","type":"request","arguments":{"adapterID":"lldb-native","clientID":"vscode","columnsStartAt1":true,"linesStartAt1":true,"locale":"en-us","pathFormat":"path","supportsRunInTerminalRequest":true,"supportsVariablePaging":true,"supportsVariableType":true,"supportsStartDebuggingRequest":true,"supportsProgressReporting":true,"$__lldb_sourceInitFile":false},"seq":1}
1744997605.188238859 <-- (stdin/stdout) {"body":{"$__lldb_version":"lldb version 21.0.0git (https://github.com/llvm/llvm-project.git revision 5ad32fa6973638a091891942939933a41cbb2162)\n  clang revision 5ad32fa6973638a091891942939933a41cbb2162\n  llvm revision 5ad32fa6973638a091891942939933a41cbb2162","completionTriggerCharacters":["."," ","\t"],"exceptionBreakpointFilters":[{"default":false,"filter":"cpp_catch","label":"C++ Catch"},{"default":false,"filter":"cpp_throw","label":"C++ Throw"},{"default":false,"filter":"objc_catch","label":"Objective-C Catch"},{"default":false,"filter":"objc_throw","label":"Objective-C Throw"}],"supportTerminateDebuggee":true,"supportsBreakpointLocationsRequest":true,"supportsCancelRequest":true,"supportsCompletionsRequest":true,"supportsConditionalBreakpoints":true,"supportsConfigurationDoneRequest":true,"supportsDataBreakpoints":true,"supportsDelayedStackTraceLoading":true,"supportsDisassembleRequest":true,"supportsEvaluateForHovers":true,"supportsExceptionInfoRequest":true,"supportsExceptionOptions":true,"supportsFunctionBreakpoints":true,"supportsHitConditionalBreakpoints":true,"supportsInstructionBreakpoints":true,"supportsLogPoints":true,"supportsModulesRequest":true,"supportsReadMemoryRequest":true,"supportsRestartRequest":true,"supportsSetVariable":true,"supportsStepInTargetsRequest":true,"supportsSteppingGranularity":true,"supportsValueFormattingOptions":true},"command":"initialize","request_seq":1,"seq":0,"success":true,"type":"response"}
1744997605.188461304 --> (stdin/stdout) {"command":"launch","type":"request","arguments":{"program":"/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/tools/lldb-dap/memory/TestDAP_memory.test_memory_refs_evaluate/a.out","initCommands":["settings clear -all","settings set symbols.enable-external-lookup false","settings set target.inherit-tcc true","settings set target.disable-aslr false","settings set target.detach-on-error false","settings set target.auto-apply-fixits false","settings set plugin.process.gdb-remote.packet-timeout 60","settings set symbols.clang-modules-cache-path \"/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-lldb/lldb-api\"","settings set use-color false","settings set show-statusline false"],"disableASLR":false,"enableAutoVariableSummaries":false,"enableSyntheticChildDebugging":false,"displayExtendedBacktrace":false,"commandEscapePrefix":null},"seq":2}
1744997605.188661337 <-- (stdin/stdout) {"body":{"category":"console","output":"Running initCommands:\n"},"event":"output","seq":0,"type":"event"}
1744997605.188696623 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings clear -all\n"},"event":"output","seq":0,"type":"event"}
1744997605.188707829 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set symbols.enable-external-lookup false\n"},"event":"output","seq":0,"type":"event"}
1744997605.188717604 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set target.inherit-tcc true\n"},"event":"output","seq":0,"type":"event"}
1744997605.188725948 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set target.disable-aslr false\n"},"event":"output","seq":0,"type":"event"}
1744997605.188734293 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set target.detach-on-error false\n"},"event":"output","seq":0,"type":"event"}
1744997605.188742161 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set target.auto-apply-fixits false\n"},"event":"output","seq":0,"type":"event"}
1744997605.188750505 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set plugin.process.gdb-remote.packet-timeout 60\n"},"event":"output","seq":0,"type":"event"}
1744997605.188771009 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set symbols.clang-modules-cache-path \"/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-lldb/lldb-api\"\n"},"event":"output","seq":0,"type":"event"}
1744997605.188779593 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set use-color false\n"},"event":"output","seq":0,"type":"event"}
1744997605.188787460 <-- (stdin/stdout) {"body":{"category":"console","output":"(lldb) settings set show-statusline false\n"},"event":"output","seq":0,"type":"event"}
1744997605.264503479 <-- (stdin/stdout) {"command":"launch","request_seq":2,"seq":0,"success":true,"type":"response"}
1744997605.264550447 <-- (stdin/stdout) {"body":{"isLocalProcess":true,"name":"/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/tools/lldb-dap/memory/TestDAP_memory.test_memory_refs_evaluate/a.out","startMethod":"launch","systemProcessId":479866},"event":"process","seq":0,"type":"event"}
1744997605.264560699 <-- (stdin/stdout) {"event":"initialized","seq":0,"type":"event"}
1744997605.264882088 --> (stdin/stdout) {"command":"setBreakpoints","type":"request","arguments":{"source":{"name":"main.cpp","path":"main.cpp"},"sourceModified":false,"lines":[4],"breakpoints":[{"line":4}]},"seq":3}
1744997605.266186714 <-- (stdin/stdout) {"body":{"breakpoint":{"column":3,"id":1,"instructionReference":"0xAAAAE90C0734","line":5,"verified":true},"reason":"changed"},"event":"breakpoint","seq":0,"type":"event"}
1744997605.266262531 <-- (stdin/stdout) {"body":{"breakpoints":[{"column":3,"id":1,"instructionReference":"0xAAAAE90C0734","line":5,"source":{"name":"main.cpp","path":"main.cpp"},"verified":true}]},"command":"setBreakpoints","request_seq":3,"seq":0,"success":true,"type":"response"}
1744997605.266401291 --> (stdin/stdout) {"command":"configurationDone","type":"request","arguments":{},"seq":4}

IanWood1 pushed a commit to IanWood1/llvm-project that referenced this pull request May 6, 2025
Implement Xtensa Mul16, Mul32, Mul32High and Div32 Options. Also fix callw test.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:Xtensa llvm:mc Machine (object) code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants