|
@@ -146,3 +146,123 @@ symbol = value
|
|
|
#define PREF(hint,addr) \
|
|
|
.set push; \
|
|
|
.set mips4; \
|
|
|
+ pref hint, addr; \
|
|
|
+ .set pop
|
|
|
+
|
|
|
+#define PREFX(hint,addr) \
|
|
|
+ .set push; \
|
|
|
+ .set mips4; \
|
|
|
+ prefx hint, addr; \
|
|
|
+ .set pop
|
|
|
+
|
|
|
+#else /* !CONFIG_CPU_HAS_PREFETCH */
|
|
|
+
|
|
|
+#define PREF(hint, addr)
|
|
|
+#define PREFX(hint, addr)
|
|
|
+
|
|
|
+#endif /* !CONFIG_CPU_HAS_PREFETCH */
|
|
|
+
|
|
|
+/*
|
|
|
+ * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
|
|
|
+ */
|
|
|
+#if (_MIPS_ISA == _MIPS_ISA_MIPS1)
|
|
|
+#define MOVN(rd, rs, rt) \
|
|
|
+ .set push; \
|
|
|
+ .set reorder; \
|
|
|
+ beqz rt, 9f; \
|
|
|
+ move rd, rs; \
|
|
|
+ .set pop; \
|
|
|
+9:
|
|
|
+#define MOVZ(rd, rs, rt) \
|
|
|
+ .set push; \
|
|
|
+ .set reorder; \
|
|
|
+ bnez rt, 9f; \
|
|
|
+ move rd, rs; \
|
|
|
+ .set pop; \
|
|
|
+9:
|
|
|
+#endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
|
|
|
+#if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
|
|
|
+#define MOVN(rd, rs, rt) \
|
|
|
+ .set push; \
|
|
|
+ .set noreorder; \
|
|
|
+ bnezl rt, 9f; \
|
|
|
+ move rd, rs; \
|
|
|
+ .set pop; \
|
|
|
+9:
|
|
|
+#define MOVZ(rd, rs, rt) \
|
|
|
+ .set push; \
|
|
|
+ .set noreorder; \
|
|
|
+ beqzl rt, 9f; \
|
|
|
+ move rd, rs; \
|
|
|
+ .set pop; \
|
|
|
+9:
|
|
|
+#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
|
|
|
+#if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
|
|
|
+ (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
|
|
|
+#define MOVN(rd, rs, rt) \
|
|
|
+ movn rd, rs, rt
|
|
|
+#define MOVZ(rd, rs, rt) \
|
|
|
+ movz rd, rs, rt
|
|
|
+#endif /* MIPS IV, MIPS V, MIPS32 or MIPS64 */
|
|
|
+
|
|
|
+/*
|
|
|
+ * Stack alignment
|
|
|
+ */
|
|
|
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
|
|
|
+#define ALSZ 7
|
|
|
+#define ALMASK ~7
|
|
|
+#endif
|
|
|
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
|
|
|
+#define ALSZ 15
|
|
|
+#define ALMASK ~15
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * Macros to handle different pointer/register sizes for 32/64-bit code
|
|
|
+ */
|
|
|
+
|
|
|
+/*
|
|
|
+ * Size of a register
|
|
|
+ */
|
|
|
+#ifdef __mips64
|
|
|
+#define SZREG 8
|
|
|
+#else
|
|
|
+#define SZREG 4
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * Use the following macros in assemblercode to load/store registers,
|
|
|
+ * pointers etc.
|
|
|
+ */
|
|
|
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
|
|
|
+#define REG_S sw
|
|
|
+#define REG_L lw
|
|
|
+#define REG_SUBU subu
|
|
|
+#define REG_ADDU addu
|
|
|
+#endif
|
|
|
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
|
|
|
+#define REG_S sd
|
|
|
+#define REG_L ld
|
|
|
+#define REG_SUBU dsubu
|
|
|
+#define REG_ADDU daddu
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * How to add/sub/load/store/shift C int variables.
|
|
|
+ */
|
|
|
+#if (_MIPS_SZINT == 32)
|
|
|
+#define INT_ADD add
|
|
|
+#define INT_ADDU addu
|
|
|
+#define INT_ADDI addi
|
|
|
+#define INT_ADDIU addiu
|
|
|
+#define INT_SUB sub
|
|
|
+#define INT_SUBU subu
|
|
|
+#define INT_L lw
|
|
|
+#define INT_S sw
|
|
|
+#define INT_SLL sll
|
|
|
+#define INT_SLLV sllv
|
|
|
+#define INT_SRL srl
|
|
|
+#define INT_SRLV srlv
|
|
|
+#define INT_SRA sra
|
|
|
+#define INT_SRAV srav
|
|
|
+#endif
|