extern AMD64Instr* genSpill_AMD64 ( HReg rreg, Int offset, Bool );
extern AMD64Instr* genReload_AMD64 ( HReg rreg, Int offset, Bool );
extern void getAllocableRegs_AMD64 ( Int*, HReg** );
-extern HInstrArray* iselBB_AMD64 ( IRBB*, VexArchInfo* );
+extern HInstrArray* iselBB_AMD64 ( IRBB*, VexArch, VexArchInfo* );
#endif /* ndef __LIBVEX_HOST_AMD64_HDEFS_H */
/* Translate an entire BB to amd64 code. */
-HInstrArray* iselBB_AMD64 ( IRBB* bb, VexArchInfo* archinfo_host )
+HInstrArray* iselBB_AMD64 ( IRBB* bb, VexArch arch_host,
+ VexArchInfo* archinfo_host )
{
Int i, j;
HReg hreg, hregHI;
UInt hwcaps_host = archinfo_host->hwcaps;
/* sanity ... */
+ vassert(arch_host == VexArchAMD64);
vassert(0 == (hwcaps_host & ~(VEX_HWCAPS_AMD64_SSE3)));
/* Make up an initial environment to use. */
extern PPCInstr* genSpill_PPC ( HReg rreg, UShort offsetB, Bool mode64 );
extern PPCInstr* genReload_PPC ( HReg rreg, UShort offsetB, Bool mode64 );
extern void getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
-extern HInstrArray* iselBB_PPC ( IRBB*, VexArchInfo* );
+extern HInstrArray* iselBB_PPC ( IRBB*, VexArch, VexArchInfo* );
#endif /* ndef __LIBVEX_HOST_PPC_HDEFS_H */
/* Translate an entire BB to ppc code. */
-HInstrArray* iselBB_PPC ( IRBB* bb, VexArchInfo* archinfo_host )
+HInstrArray* iselBB_PPC ( IRBB* bb, VexArch arch_host,
+ VexArchInfo* archinfo_host )
{
Int i, j;
HReg hreg, hregHI;
ISelEnv* env;
UInt hwcaps_host = archinfo_host->hwcaps;
Bool mode64 = False;
- Bool is32, is64;
UInt mask32, mask64;
- /* Figure out whether we're being ppc32 or ppc64 today. */
+ vassert(arch_host == VexArchPPC32 || arch_host == VexArchPPC64);
+ mode64 = arch_host == VexArchPPC64;
+
+ /* do some sanity checks */
mask32 = VEX_HWCAPS_PPC32_F | VEX_HWCAPS_PPC32_V
| VEX_HWCAPS_PPC32_FX | VEX_HWCAPS_PPC32_GX;
- is32 = (hwcaps_host & mask32) > 0;
-
mask64 = VEX_HWCAPS_PPC64_V
| VEX_HWCAPS_PPC64_FX | VEX_HWCAPS_PPC64_GX;
- is64 = (hwcaps_host & mask64) > 0;
-
- if (is32 && !is64)
- mode64 = False;
- else if (is64 && !is32)
- mode64 = True;
- else
- vpanic("iselBB_PPC: illegal subarch");
+ if (mode64) {
+ vassert((hwcaps_host & mask32) == 0);
+ } else {
+ vassert((hwcaps_host & mask64) == 0);
+ }
/* Make up an initial environment to use. */
env = LibVEX_Alloc(sizeof(ISelEnv));
extern X86Instr* genSpill_X86 ( HReg rreg, Int offset, Bool );
extern X86Instr* genReload_X86 ( HReg rreg, Int offset, Bool );
extern void getAllocableRegs_X86 ( Int*, HReg** );
-extern HInstrArray* iselBB_X86 ( IRBB*, VexArchInfo* );
+extern HInstrArray* iselBB_X86 ( IRBB*, VexArch, VexArchInfo* );
#endif /* ndef __LIBVEX_HOST_X86_HDEFS_H */
/* Translate an entire BB to x86 code. */
-HInstrArray* iselBB_X86 ( IRBB* bb, VexArchInfo* archinfo_host )
+HInstrArray* iselBB_X86 ( IRBB* bb, VexArch arch_host,
+ VexArchInfo* archinfo_host )
{
Int i, j;
HReg hreg, hregHI;
UInt hwcaps_host = archinfo_host->hwcaps;
/* sanity ... */
+ vassert(arch_host == VexArchX86);
vassert(0 == (hwcaps_host & ~(VEX_HWCAPS_X86_SSE1
|VEX_HWCAPS_X86_SSE2
|VEX_HWCAPS_X86_SSE3)));
HInstr* (*genReload) ( HReg, Int, Bool );
void (*ppInstr) ( HInstr*, Bool );
void (*ppReg) ( HReg );
- HInstrArray* (*iselBB) ( IRBB*, VexArchInfo* );
+ HInstrArray* (*iselBB) ( IRBB*, VexArch, VexArchInfo* );
Int (*emit) ( UChar*, Int, HInstr*, Bool, void* );
IRExpr* (*specHelper) ( HChar*, IRExpr** );
Bool (*preciseMemExnsFn) ( Int, Int );
" Instruction selection "
"------------------------\n");
- vcode = iselBB ( irbb, &vta->archinfo_host );
+ vcode = iselBB ( irbb, vta->arch_host, &vta->archinfo_host );
vexAllocSanityCheck();