Subzero: Make -reg-use and -reg-exclude specific to register class.
The main feature here is that when listing a register via the -reg-use or -reg-exclude option, we can limit the effect to a single register class, instead of applying it across all register classes. Example:
pnacl-sz -reg-use i32:eax,i32:ecx,i32:edx -reg-exclude f32:xmm0
Note that without the register class prefix, behavior is the same as before, specifically that the restriction applies to all register classes.
This requires a few high-level changes:
1. We need a mechanism to name *all* register classes, not just the standard ones that map to IceType values.
2. While we're at it, give standard types a more usable name, e.g. "v4i32" instead of "<4 x i32>".
3. Since we've commandeered ":" as the class/register token separator, we change ARM i64 register pair names from e.g. "r0:r1" to "r0r1".
The motivation is that for register allocator torture testing, we'd like to drastically restrict the registers available to e.g. the extensively-used i32 register class, while not overly restricting the seldom-used i32to8 register class (which reflects the set of i32 registers that may trivially truncate to i8).
BUG= none
R=kschimpf@google.com
Review URL: https://codereview.chromium.org/1614273002 .
diff --git a/src/IceTypes.def b/src/IceTypes.def
index 0d4ec86..a1a2552 100644
--- a/src/IceTypes.def
+++ b/src/IceTypes.def
@@ -26,7 +26,7 @@
#define TARGETARCH_TABLE \
/* enum value, printable string, is_elf64, e_machine, e_flags */ \
X(Target_X8632, "x86-32", false, EM_386, 0) \
- X(Target_X8664, "x86-64", true, EM_X86_64, 0) \
+ X(Target_X8664, "x86-64", true, EM_X86_64, 0) \
X(Target_ARM32, "arm32", false, EM_ARM, EF_ARM_EABI_VER5) \
X(Target_ARM64, "arm64", true, EM_AARCH64, 0) \
X(Target_MIPS32,"mips32", false, EM_MIPS, 0) \
@@ -34,23 +34,24 @@
#define ICETYPE_TABLE \
/* enum value, log_2(size), align, # elts, element type, */ \
- /* printable string (size and alignment in bytes) */ \
- X(void, -1, 0, 1, void, "void") \
- X(i1, 0, 1, 1, i1, "i1") \
- X(i8, 0, 1, 1, i8, "i8") \
- X(i16, 1, 1, 1, i16, "i16") \
- X(i32, 2, 1, 1, i32, "i32") \
- X(i64, 3, 1, 1, i64, "i64") \
- X(f32, 2, 4, 1, f32, "float") \
- X(f64, 3, 8, 1, f64, "double") \
- X(v4i1, 4, 1, 4, i1, "<4 x i1>") \
- X(v8i1, 4, 1, 8, i1, "<8 x i1>") \
- X(v16i1, 4, 1, 16, i1, "<16 x i1>") \
- X(v16i8, 4, 1, 16, i8, "<16 x i8>") \
- X(v8i16, 4, 2, 8, i16, "<8 x i16>") \
- X(v4i32, 4, 4, 4, i32, "<4 x i32>") \
- X(v4f32, 4, 4, 4, f32, "<4 x float>") \
-//#define X(tag, sizeLog2, align, elts, elty, str)
+ /* printable string (size and alignment in bytes), */ \
+ /* register class string */ \
+ X(void, -1, 0, 1, void, "void", "void") \
+ X(i1, 0, 1, 1, i1, "i1", "i1") \
+ X(i8, 0, 1, 1, i8, "i8", "i8") \
+ X(i16, 1, 1, 1, i16, "i16", "i16") \
+ X(i32, 2, 1, 1, i32, "i32", "i32") \
+ X(i64, 3, 1, 1, i64, "i64", "i64") \
+ X(f32, 2, 4, 1, f32, "float", "f32") \
+ X(f64, 3, 8, 1, f64, "double", "f64") \
+ X(v4i1, 4, 1, 4, i1, "<4 x i1>", "v4i1") \
+ X(v8i1, 4, 1, 8, i1, "<8 x i1>", "v8ii") \
+ X(v16i1, 4, 1, 16, i1, "<16 x i1>", "v16i1") \
+ X(v16i8, 4, 1, 16, i8, "<16 x i8>", "v16i8") \
+ X(v8i16, 4, 2, 8, i16, "<8 x i16>", "v8i16") \
+ X(v4i32, 4, 4, 4, i32, "<4 x i32>", "v4i32") \
+ X(v4f32, 4, 4, 4, f32, "<4 x float>", "v4f32") \
+//#define X(tag, sizeLog2, align, elts, elty, str, rcstr)
// Dictionary:
// V - Is vector type.