|
@@ -31,7 +31,7 @@
|
|
# define TCG_TARGET_REG_BITS 32
|
|
# define TCG_TARGET_REG_BITS 32
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#define TCG_TARGET_NB_REGS 32
|
|
|
|
|
|
+#define TCG_TARGET_NB_REGS 64
|
|
#define TCG_TARGET_INSN_UNIT_SIZE 4
|
|
#define TCG_TARGET_INSN_UNIT_SIZE 4
|
|
#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
|
|
#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
|
|
|
|
|
|
@@ -45,12 +45,33 @@ typedef enum {
|
|
TCG_REG_R24, TCG_REG_R25, TCG_REG_R26, TCG_REG_R27,
|
|
TCG_REG_R24, TCG_REG_R25, TCG_REG_R26, TCG_REG_R27,
|
|
TCG_REG_R28, TCG_REG_R29, TCG_REG_R30, TCG_REG_R31,
|
|
TCG_REG_R28, TCG_REG_R29, TCG_REG_R30, TCG_REG_R31,
|
|
|
|
|
|
|
|
+ TCG_REG_V0, TCG_REG_V1, TCG_REG_V2, TCG_REG_V3,
|
|
|
|
+ TCG_REG_V4, TCG_REG_V5, TCG_REG_V6, TCG_REG_V7,
|
|
|
|
+ TCG_REG_V8, TCG_REG_V9, TCG_REG_V10, TCG_REG_V11,
|
|
|
|
+ TCG_REG_V12, TCG_REG_V13, TCG_REG_V14, TCG_REG_V15,
|
|
|
|
+ TCG_REG_V16, TCG_REG_V17, TCG_REG_V18, TCG_REG_V19,
|
|
|
|
+ TCG_REG_V20, TCG_REG_V21, TCG_REG_V22, TCG_REG_V23,
|
|
|
|
+ TCG_REG_V24, TCG_REG_V25, TCG_REG_V26, TCG_REG_V27,
|
|
|
|
+ TCG_REG_V28, TCG_REG_V29, TCG_REG_V30, TCG_REG_V31,
|
|
|
|
+
|
|
TCG_REG_CALL_STACK = TCG_REG_R1,
|
|
TCG_REG_CALL_STACK = TCG_REG_R1,
|
|
TCG_AREG0 = TCG_REG_R27
|
|
TCG_AREG0 = TCG_REG_R27
|
|
} TCGReg;
|
|
} TCGReg;
|
|
|
|
|
|
-extern bool have_isa_2_06;
|
|
|
|
-extern bool have_isa_3_00;
|
|
|
|
|
|
+typedef enum {
|
|
|
|
+ tcg_isa_base,
|
|
|
|
+ tcg_isa_2_06,
|
|
|
|
+ tcg_isa_2_07,
|
|
|
|
+ tcg_isa_3_00,
|
|
|
|
+} TCGPowerISA;
|
|
|
|
+
|
|
|
|
+extern TCGPowerISA have_isa;
|
|
|
|
+extern bool have_altivec;
|
|
|
|
+extern bool have_vsx;
|
|
|
|
+
|
|
|
|
+#define have_isa_2_06 (have_isa >= tcg_isa_2_06)
|
|
|
|
+#define have_isa_2_07 (have_isa >= tcg_isa_2_07)
|
|
|
|
+#define have_isa_3_00 (have_isa >= tcg_isa_3_00)
|
|
|
|
|
|
/* optional instructions automatically implemented */
|
|
/* optional instructions automatically implemented */
|
|
#define TCG_TARGET_HAS_ext8u_i32 0 /* andi */
|
|
#define TCG_TARGET_HAS_ext8u_i32 0 /* andi */
|
|
@@ -126,6 +147,30 @@ extern bool have_isa_3_00;
|
|
#define TCG_TARGET_HAS_mulsh_i64 1
|
|
#define TCG_TARGET_HAS_mulsh_i64 1
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * While technically Altivec could support V64, it has no 64-bit store
|
|
|
|
+ * instruction and substituting two 32-bit stores makes the generated
|
|
|
|
+ * code quite large.
|
|
|
|
+ */
|
|
|
|
+#define TCG_TARGET_HAS_v64 have_vsx
|
|
|
|
+#define TCG_TARGET_HAS_v128 have_altivec
|
|
|
|
+#define TCG_TARGET_HAS_v256 0
|
|
|
|
+
|
|
|
|
+#define TCG_TARGET_HAS_andc_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_orc_vec have_isa_2_07
|
|
|
|
+#define TCG_TARGET_HAS_not_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_neg_vec have_isa_3_00
|
|
|
|
+#define TCG_TARGET_HAS_abs_vec 0
|
|
|
|
+#define TCG_TARGET_HAS_shi_vec 0
|
|
|
|
+#define TCG_TARGET_HAS_shs_vec 0
|
|
|
|
+#define TCG_TARGET_HAS_shv_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_cmp_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_mul_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_sat_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_minmax_vec 1
|
|
|
|
+#define TCG_TARGET_HAS_bitsel_vec have_vsx
|
|
|
|
+#define TCG_TARGET_HAS_cmpsel_vec 0
|
|
|
|
+
|
|
void flush_icache_range(uintptr_t start, uintptr_t stop);
|
|
void flush_icache_range(uintptr_t start, uintptr_t stop);
|
|
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t);
|
|
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t);
|
|
|
|
|