<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[212970] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/212970">212970</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2017-02-24 14:50:00 -0800 (Fri, 24 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Move Arg::Type and Arg::Width out into the B3 namespace, since they are general concepts
https://bugs.webkit.org/show_bug.cgi?id=168833

Reviewed by Saam Barati.
        
I want to use the Air::Arg::Type and Air::Arg::Width concepts in B3. We are already
doing this a bit, and it's akward because of the namespacing. Throughout B3 we take the
approach that if something is not specific to Air, then it should be in the B3
namespace.
        
This moves Air::Arg::Type to B3::Bank. This moves Air::Arg::Width to B3::Width.
        
I renamed Arg::Type to Bank because there is already a B3::Type and because Arg::Type
was never really a type. Its purpose was always to identify register banks, and we use
this enum when the thing we care about is whether the value is most appropriate for
GPRs or FPRs.
        
I kept both as non-enum classes because I think that we've learned that terse compiler
code is a good thing. I don't want to say Bank::GP when I can say GP. With Width, the
argument is even stronger, since you cannot say Width::8 but you can say Width8.

* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* b3/B3Bank.cpp: Added.
(WTF::printInternal):
* b3/B3Bank.h: Added.
(JSC::B3::forEachBank):
(JSC::B3::bankForType):
* b3/B3CheckSpecial.cpp:
(JSC::B3::CheckSpecial::forEachArg):
* b3/B3LegalizeMemoryOffsets.cpp:
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::run):
(JSC::B3::Air::LowerToAir::tmp):
(JSC::B3::Air::LowerToAir::scaleForShl):
(JSC::B3::Air::LowerToAir::effectiveAddr):
(JSC::B3::Air::LowerToAir::addr):
(JSC::B3::Air::LowerToAir::createGenericCompare):
(JSC::B3::Air::LowerToAir::createBranch):
(JSC::B3::Air::LowerToAir::createCompare):
(JSC::B3::Air::LowerToAir::createSelect):
(JSC::B3::Air::LowerToAir::lower):
* b3/B3MemoryValue.cpp:
(JSC::B3::MemoryValue::accessWidth):
* b3/B3MemoryValue.h:
* b3/B3MoveConstants.cpp:
* b3/B3PatchpointSpecial.cpp:
(JSC::B3::PatchpointSpecial::forEachArg):
* b3/B3StackmapSpecial.cpp:
(JSC::B3::StackmapSpecial::forEachArgImpl):
* b3/B3Value.h:
* b3/B3Variable.h:
(JSC::B3::Variable::width):
(JSC::B3::Variable::bank):
* b3/B3WasmAddressValue.h:
* b3/B3Width.cpp: Added.
(WTF::printInternal):
* b3/B3Width.h: Added.
(JSC::B3::pointerWidth):
(JSC::B3::widthForType):
(JSC::B3::conservativeWidth):
(JSC::B3::minimumWidth):
(JSC::B3::bytes):
(JSC::B3::widthForBytes):
* b3/air/AirAllocateRegistersByGraphColoring.cpp:
* b3/air/AirAllocateStack.cpp:
(JSC::B3::Air::allocateStack):
* b3/air/AirArg.cpp:
(JSC::B3::Air::Arg::canRepresent):
(JSC::B3::Air::Arg::isCompatibleBank):
(JSC::B3::Air::Arg::isCompatibleType): Deleted.
* b3/air/AirArg.h:
(JSC::B3::Air::Arg::hasBank):
(JSC::B3::Air::Arg::bank):
(JSC::B3::Air::Arg::isBank):
(JSC::B3::Air::Arg::forEachTmp):
(JSC::B3::Air::Arg::forEachType): Deleted.
(JSC::B3::Air::Arg::pointerWidth): Deleted.
(JSC::B3::Air::Arg::typeForB3Type): Deleted.
(JSC::B3::Air::Arg::widthForB3Type): Deleted.
(JSC::B3::Air::Arg::conservativeWidth): Deleted.
(JSC::B3::Air::Arg::minimumWidth): Deleted.
(JSC::B3::Air::Arg::bytes): Deleted.
(JSC::B3::Air::Arg::widthForBytes): Deleted.
(JSC::B3::Air::Arg::hasType): Deleted.
(JSC::B3::Air::Arg::type): Deleted.
(JSC::B3::Air::Arg::isType): Deleted.
* b3/air/AirArgInlines.h:
(JSC::B3::Air::ArgThingHelper&lt;Tmp&gt;::forEach):
(JSC::B3::Air::ArgThingHelper&lt;Arg&gt;::forEach):
(JSC::B3::Air::ArgThingHelper&lt;Reg&gt;::forEach):
(JSC::B3::Air::Arg::forEach):
* b3/air/AirCCallSpecial.cpp:
(JSC::B3::Air::CCallSpecial::forEachArg):
* b3/air/AirCCallingConvention.cpp:
* b3/air/AirCode.cpp:
(JSC::B3::Air::Code::Code):
(JSC::B3::Air::Code::setRegsInPriorityOrder):
(JSC::B3::Air::Code::pinRegister):
* b3/air/AirCode.h:
(JSC::B3::Air::Code::regsInPriorityOrder):
(JSC::B3::Air::Code::newTmp):
(JSC::B3::Air::Code::numTmps):
(JSC::B3::Air::Code::regsInPriorityOrderImpl):
* b3/air/AirCustom.cpp:
(JSC::B3::Air::PatchCustom::isValidForm):
(JSC::B3::Air::ShuffleCustom::isValidForm):
* b3/air/AirCustom.h:
(JSC::B3::Air::PatchCustom::forEachArg):
(JSC::B3::Air::CCallCustom::forEachArg):
(JSC::B3::Air::ColdCCallCustom::forEachArg):
(JSC::B3::Air::ShuffleCustom::forEachArg):
(JSC::B3::Air::WasmBoundsCheckCustom::forEachArg):
* b3/air/AirDumpAsJS.cpp:
(JSC::B3::Air::dumpAsJS):
* b3/air/AirEliminateDeadCode.cpp:
(JSC::B3::Air::eliminateDeadCode):
* b3/air/AirEmitShuffle.cpp:
(JSC::B3::Air::emitShuffle):
* b3/air/AirEmitShuffle.h:
(JSC::B3::Air::ShufflePair::ShufflePair):
(JSC::B3::Air::ShufflePair::width):
* b3/air/AirFixObviousSpills.cpp:
* b3/air/AirFixPartialRegisterStalls.cpp:
(JSC::B3::Air::fixPartialRegisterStalls):
* b3/air/AirInst.cpp:
(JSC::B3::Air::Inst::hasArgEffects):
* b3/air/AirInst.h:
(JSC::B3::Air::Inst::forEachTmp):
* b3/air/AirInstInlines.h:
(JSC::B3::Air::Inst::forEach):
(JSC::B3::Air::Inst::forEachDef):
(JSC::B3::Air::Inst::forEachDefWithExtraClobberedRegs):
* b3/air/AirLiveness.h:
(JSC::B3::Air::TmpLivenessAdapter::numIndices):
(JSC::B3::Air::TmpLivenessAdapter::acceptsBank):
(JSC::B3::Air::TmpLivenessAdapter::valueToIndex):
(JSC::B3::Air::TmpLivenessAdapter::indexToValue):
(JSC::B3::Air::StackSlotLivenessAdapter::acceptsBank):
(JSC::B3::Air::RegLivenessAdapter::acceptsBank):
(JSC::B3::Air::AbstractLiveness::AbstractLiveness):
(JSC::B3::Air::AbstractLiveness::LocalCalc::execute):
(JSC::B3::Air::TmpLivenessAdapter::acceptsType): Deleted.
(JSC::B3::Air::StackSlotLivenessAdapter::acceptsType): Deleted.
(JSC::B3::Air::RegLivenessAdapter::acceptsType): Deleted.
* b3/air/AirLogRegisterPressure.cpp:
(JSC::B3::Air::logRegisterPressure):
* b3/air/AirLowerAfterRegAlloc.cpp:
(JSC::B3::Air::lowerAfterRegAlloc):
* b3/air/AirLowerMacros.cpp:
(JSC::B3::Air::lowerMacros):
* b3/air/AirPadInterference.cpp:
(JSC::B3::Air::padInterference):
* b3/air/AirReportUsedRegisters.cpp:
(JSC::B3::Air::reportUsedRegisters):
* b3/air/AirSpillEverything.cpp:
(JSC::B3::Air::spillEverything):
* b3/air/AirTmpInlines.h:
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::absoluteIndex): Deleted.
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::lastMachineRegisterIndex): Deleted.
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::tmpFromAbsoluteIndex): Deleted.
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::absoluteIndex): Deleted.
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::lastMachineRegisterIndex): Deleted.
(JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::tmpFromAbsoluteIndex): Deleted.
* b3/air/AirTmpWidth.cpp:
(JSC::B3::Air::TmpWidth::recompute):
* b3/air/AirTmpWidth.h:
(JSC::B3::Air::TmpWidth::width):
(JSC::B3::Air::TmpWidth::requiredWidth):
(JSC::B3::Air::TmpWidth::defWidth):
(JSC::B3::Air::TmpWidth::useWidth):
(JSC::B3::Air::TmpWidth::Widths::Widths):
* b3/air/AirUseCounts.h:
(JSC::B3::Air::UseCounts::UseCounts):
* b3/air/AirValidate.cpp:
* b3/air/opcode_generator.rb:
* b3/air/testair.cpp:
(JSC::B3::Air::compile): Deleted.
(JSC::B3::Air::invoke): Deleted.
(JSC::B3::Air::compileAndRun): Deleted.
(JSC::B3::Air::testSimple): Deleted.
(JSC::B3::Air::loadConstantImpl): Deleted.
(JSC::B3::Air::loadConstant): Deleted.
(JSC::B3::Air::loadDoubleConstant): Deleted.
(JSC::B3::Air::testShuffleSimpleSwap): Deleted.
(JSC::B3::Air::testShuffleSimpleShift): Deleted.
(JSC::B3::Air::testShuffleLongShift): Deleted.
(JSC::B3::Air::testShuffleLongShiftBackwards): Deleted.
(JSC::B3::Air::testShuffleSimpleRotate): Deleted.
(JSC::B3::Air::testShuffleSimpleBroadcast): Deleted.
(JSC::B3::Air::testShuffleBroadcastAllRegs): Deleted.
(JSC::B3::Air::testShuffleTreeShift): Deleted.
(JSC::B3::Air::testShuffleTreeShiftBackward): Deleted.
(JSC::B3::Air::testShuffleTreeShiftOtherBackward): Deleted.
(JSC::B3::Air::testShuffleMultipleShifts): Deleted.
(JSC::B3::Air::testShuffleRotateWithFringe): Deleted.
(JSC::B3::Air::testShuffleRotateWithFringeInWeirdOrder): Deleted.
(JSC::B3::Air::testShuffleRotateWithLongFringe): Deleted.
(JSC::B3::Air::testShuffleMultipleRotates): Deleted.
(JSC::B3::Air::testShuffleShiftAndRotate): Deleted.
(JSC::B3::Air::testShuffleShiftAllRegs): Deleted.
(JSC::B3::Air::testShuffleRotateAllRegs): Deleted.
(JSC::B3::Air::testShuffleSimpleSwap64): Deleted.
(JSC::B3::Air::testShuffleSimpleShift64): Deleted.
(JSC::B3::Air::testShuffleSwapMixedWidth): Deleted.
(JSC::B3::Air::testShuffleShiftMixedWidth): Deleted.
(JSC::B3::Air::testShuffleShiftMemory): Deleted.
(JSC::B3::Air::testShuffleShiftMemoryLong): Deleted.
(JSC::B3::Air::testShuffleShiftMemoryAllRegs): Deleted.
(JSC::B3::Air::testShuffleShiftMemoryAllRegs64): Deleted.
(JSC::B3::Air::combineHiLo): Deleted.
(JSC::B3::Air::testShuffleShiftMemoryAllRegsMixedWidth): Deleted.
(JSC::B3::Air::testShuffleRotateMemory): Deleted.
(JSC::B3::Air::testShuffleRotateMemory64): Deleted.
(JSC::B3::Air::testShuffleRotateMemoryMixedWidth): Deleted.
(JSC::B3::Air::testShuffleRotateMemoryAllRegs64): Deleted.
(JSC::B3::Air::testShuffleRotateMemoryAllRegsMixedWidth): Deleted.
(JSC::B3::Air::testShuffleSwapDouble): Deleted.
(JSC::B3::Air::testShuffleShiftDouble): Deleted.
(JSC::B3::Air::testX86VMULSD): Deleted.
(JSC::B3::Air::testX86VMULSDDestRex): Deleted.
(JSC::B3::Air::testX86VMULSDOp1DestRex): Deleted.
(JSC::B3::Air::testX86VMULSDOp2DestRex): Deleted.
(JSC::B3::Air::testX86VMULSDOpsDestRex): Deleted.
(JSC::B3::Air::testX86VMULSDAddr): Deleted.
(JSC::B3::Air::testX86VMULSDAddrOpRexAddr): Deleted.
(JSC::B3::Air::testX86VMULSDDestRexAddr): Deleted.
(JSC::B3::Air::testX86VMULSDRegOpDestRexAddr): Deleted.
(JSC::B3::Air::testX86VMULSDAddrOpDestRexAddr): Deleted.
(JSC::B3::Air::testX86VMULSDBaseNeedsRex): Deleted.
(JSC::B3::Air::testX86VMULSDIndexNeedsRex): Deleted.
(JSC::B3::Air::testX86VMULSDBaseIndexNeedRex): Deleted.
(JSC::B3::Air::run): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3CheckSpecialcpp">trunk/Source/JavaScriptCore/b3/B3CheckSpecial.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3LegalizeMemoryOffsetscpp">trunk/Source/JavaScriptCore/b3/B3LegalizeMemoryOffsets.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3LowerToAircpp">trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3MemoryValuecpp">trunk/Source/JavaScriptCore/b3/B3MemoryValue.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3MemoryValueh">trunk/Source/JavaScriptCore/b3/B3MemoryValue.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3MoveConstantscpp">trunk/Source/JavaScriptCore/b3/B3MoveConstants.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3PatchpointSpecialcpp">trunk/Source/JavaScriptCore/b3/B3PatchpointSpecial.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3StackmapSpecialcpp">trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Valueh">trunk/Source/JavaScriptCore/b3/B3Value.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Variableh">trunk/Source/JavaScriptCore/b3/B3Variable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3WasmAddressValueh">trunk/Source/JavaScriptCore/b3/B3WasmAddressValue.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirAllocateRegistersByGraphColoringcpp">trunk/Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirAllocateStackcpp">trunk/Source/JavaScriptCore/b3/air/AirAllocateStack.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirArgcpp">trunk/Source/JavaScriptCore/b3/air/AirArg.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirArgh">trunk/Source/JavaScriptCore/b3/air/AirArg.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirArgInlinesh">trunk/Source/JavaScriptCore/b3/air/AirArgInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCCallSpecialcpp">trunk/Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCCallingConventioncpp">trunk/Source/JavaScriptCore/b3/air/AirCCallingConvention.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCodecpp">trunk/Source/JavaScriptCore/b3/air/AirCode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCodeh">trunk/Source/JavaScriptCore/b3/air/AirCode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCustomcpp">trunk/Source/JavaScriptCore/b3/air/AirCustom.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirCustomh">trunk/Source/JavaScriptCore/b3/air/AirCustom.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirDumpAsJScpp">trunk/Source/JavaScriptCore/b3/air/AirDumpAsJS.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirEliminateDeadCodecpp">trunk/Source/JavaScriptCore/b3/air/AirEliminateDeadCode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirEmitShufflecpp">trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirEmitShuffleh">trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirFixObviousSpillscpp">trunk/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirFixPartialRegisterStallscpp">trunk/Source/JavaScriptCore/b3/air/AirFixPartialRegisterStalls.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirInstcpp">trunk/Source/JavaScriptCore/b3/air/AirInst.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirInsth">trunk/Source/JavaScriptCore/b3/air/AirInst.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirInstInlinesh">trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirLivenessh">trunk/Source/JavaScriptCore/b3/air/AirLiveness.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirLogRegisterPressurecpp">trunk/Source/JavaScriptCore/b3/air/AirLogRegisterPressure.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirLowerAfterRegAlloccpp">trunk/Source/JavaScriptCore/b3/air/AirLowerAfterRegAlloc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirLowerMacroscpp">trunk/Source/JavaScriptCore/b3/air/AirLowerMacros.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirPadInterferencecpp">trunk/Source/JavaScriptCore/b3/air/AirPadInterference.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirReportUsedRegisterscpp">trunk/Source/JavaScriptCore/b3/air/AirReportUsedRegisters.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirSpillEverythingcpp">trunk/Source/JavaScriptCore/b3/air/AirSpillEverything.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirTmpInlinesh">trunk/Source/JavaScriptCore/b3/air/AirTmpInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirTmpWidthcpp">trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirTmpWidthh">trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirUseCountsh">trunk/Source/JavaScriptCore/b3/air/AirUseCounts.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirValidatecpp">trunk/Source/JavaScriptCore/b3/air/AirValidate.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airopcode_generatorrb">trunk/Source/JavaScriptCore/b3/air/opcode_generator.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airtestaircpp">trunk/Source/JavaScriptCore/b3/air/testair.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreb3B3Bankcpp">trunk/Source/JavaScriptCore/b3/B3Bank.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Bankh">trunk/Source/JavaScriptCore/b3/B3Bank.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Widthcpp">trunk/Source/JavaScriptCore/b3/B3Width.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Widthh">trunk/Source/JavaScriptCore/b3/B3Width.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -110,6 +110,7 @@
</span><span class="cx">     b3/air/AirValidate.cpp
</span><span class="cx"> 
</span><span class="cx">     b3/B3ArgumentRegValue.cpp
</span><ins>+    b3/B3Bank.cpp
</ins><span class="cx">     b3/B3BasicBlock.cpp
</span><span class="cx">     b3/B3BlockInsertionSet.cpp
</span><span class="cx">     b3/B3BreakCriticalEdges.cpp
</span><span class="lines">@@ -178,6 +179,7 @@
</span><span class="cx">     b3/B3VariableValue.cpp
</span><span class="cx">     b3/B3WasmAddressValue.cpp
</span><span class="cx">     b3/B3WasmBoundsCheckValue.cpp
</span><ins>+    b3/B3Width.cpp
</ins><span class="cx"> 
</span><span class="cx">     bindings/ScriptFunctionCall.cpp
</span><span class="cx">     bindings/ScriptObject.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,3 +1,239 @@
</span><ins>+2017-02-24  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Move Arg::Type and Arg::Width out into the B3 namespace, since they are general concepts
+        https://bugs.webkit.org/show_bug.cgi?id=168833
+
+        Reviewed by Saam Barati.
+        
+        I want to use the Air::Arg::Type and Air::Arg::Width concepts in B3. We are already
+        doing this a bit, and it's akward because of the namespacing. Throughout B3 we take the
+        approach that if something is not specific to Air, then it should be in the B3
+        namespace.
+        
+        This moves Air::Arg::Type to B3::Bank. This moves Air::Arg::Width to B3::Width.
+        
+        I renamed Arg::Type to Bank because there is already a B3::Type and because Arg::Type
+        was never really a type. Its purpose was always to identify register banks, and we use
+        this enum when the thing we care about is whether the value is most appropriate for
+        GPRs or FPRs.
+        
+        I kept both as non-enum classes because I think that we've learned that terse compiler
+        code is a good thing. I don't want to say Bank::GP when I can say GP. With Width, the
+        argument is even stronger, since you cannot say Width::8 but you can say Width8.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * b3/B3Bank.cpp: Added.
+        (WTF::printInternal):
+        * b3/B3Bank.h: Added.
+        (JSC::B3::forEachBank):
+        (JSC::B3::bankForType):
+        * b3/B3CheckSpecial.cpp:
+        (JSC::B3::CheckSpecial::forEachArg):
+        * b3/B3LegalizeMemoryOffsets.cpp:
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::run):
+        (JSC::B3::Air::LowerToAir::tmp):
+        (JSC::B3::Air::LowerToAir::scaleForShl):
+        (JSC::B3::Air::LowerToAir::effectiveAddr):
+        (JSC::B3::Air::LowerToAir::addr):
+        (JSC::B3::Air::LowerToAir::createGenericCompare):
+        (JSC::B3::Air::LowerToAir::createBranch):
+        (JSC::B3::Air::LowerToAir::createCompare):
+        (JSC::B3::Air::LowerToAir::createSelect):
+        (JSC::B3::Air::LowerToAir::lower):
+        * b3/B3MemoryValue.cpp:
+        (JSC::B3::MemoryValue::accessWidth):
+        * b3/B3MemoryValue.h:
+        * b3/B3MoveConstants.cpp:
+        * b3/B3PatchpointSpecial.cpp:
+        (JSC::B3::PatchpointSpecial::forEachArg):
+        * b3/B3StackmapSpecial.cpp:
+        (JSC::B3::StackmapSpecial::forEachArgImpl):
+        * b3/B3Value.h:
+        * b3/B3Variable.h:
+        (JSC::B3::Variable::width):
+        (JSC::B3::Variable::bank):
+        * b3/B3WasmAddressValue.h:
+        * b3/B3Width.cpp: Added.
+        (WTF::printInternal):
+        * b3/B3Width.h: Added.
+        (JSC::B3::pointerWidth):
+        (JSC::B3::widthForType):
+        (JSC::B3::conservativeWidth):
+        (JSC::B3::minimumWidth):
+        (JSC::B3::bytes):
+        (JSC::B3::widthForBytes):
+        * b3/air/AirAllocateRegistersByGraphColoring.cpp:
+        * b3/air/AirAllocateStack.cpp:
+        (JSC::B3::Air::allocateStack):
+        * b3/air/AirArg.cpp:
+        (JSC::B3::Air::Arg::canRepresent):
+        (JSC::B3::Air::Arg::isCompatibleBank):
+        (JSC::B3::Air::Arg::isCompatibleType): Deleted.
+        * b3/air/AirArg.h:
+        (JSC::B3::Air::Arg::hasBank):
+        (JSC::B3::Air::Arg::bank):
+        (JSC::B3::Air::Arg::isBank):
+        (JSC::B3::Air::Arg::forEachTmp):
+        (JSC::B3::Air::Arg::forEachType): Deleted.
+        (JSC::B3::Air::Arg::pointerWidth): Deleted.
+        (JSC::B3::Air::Arg::typeForB3Type): Deleted.
+        (JSC::B3::Air::Arg::widthForB3Type): Deleted.
+        (JSC::B3::Air::Arg::conservativeWidth): Deleted.
+        (JSC::B3::Air::Arg::minimumWidth): Deleted.
+        (JSC::B3::Air::Arg::bytes): Deleted.
+        (JSC::B3::Air::Arg::widthForBytes): Deleted.
+        (JSC::B3::Air::Arg::hasType): Deleted.
+        (JSC::B3::Air::Arg::type): Deleted.
+        (JSC::B3::Air::Arg::isType): Deleted.
+        * b3/air/AirArgInlines.h:
+        (JSC::B3::Air::ArgThingHelper&lt;Tmp&gt;::forEach):
+        (JSC::B3::Air::ArgThingHelper&lt;Arg&gt;::forEach):
+        (JSC::B3::Air::ArgThingHelper&lt;Reg&gt;::forEach):
+        (JSC::B3::Air::Arg::forEach):
+        * b3/air/AirCCallSpecial.cpp:
+        (JSC::B3::Air::CCallSpecial::forEachArg):
+        * b3/air/AirCCallingConvention.cpp:
+        * b3/air/AirCode.cpp:
+        (JSC::B3::Air::Code::Code):
+        (JSC::B3::Air::Code::setRegsInPriorityOrder):
+        (JSC::B3::Air::Code::pinRegister):
+        * b3/air/AirCode.h:
+        (JSC::B3::Air::Code::regsInPriorityOrder):
+        (JSC::B3::Air::Code::newTmp):
+        (JSC::B3::Air::Code::numTmps):
+        (JSC::B3::Air::Code::regsInPriorityOrderImpl):
+        * b3/air/AirCustom.cpp:
+        (JSC::B3::Air::PatchCustom::isValidForm):
+        (JSC::B3::Air::ShuffleCustom::isValidForm):
+        * b3/air/AirCustom.h:
+        (JSC::B3::Air::PatchCustom::forEachArg):
+        (JSC::B3::Air::CCallCustom::forEachArg):
+        (JSC::B3::Air::ColdCCallCustom::forEachArg):
+        (JSC::B3::Air::ShuffleCustom::forEachArg):
+        (JSC::B3::Air::WasmBoundsCheckCustom::forEachArg):
+        * b3/air/AirDumpAsJS.cpp:
+        (JSC::B3::Air::dumpAsJS):
+        * b3/air/AirEliminateDeadCode.cpp:
+        (JSC::B3::Air::eliminateDeadCode):
+        * b3/air/AirEmitShuffle.cpp:
+        (JSC::B3::Air::emitShuffle):
+        * b3/air/AirEmitShuffle.h:
+        (JSC::B3::Air::ShufflePair::ShufflePair):
+        (JSC::B3::Air::ShufflePair::width):
+        * b3/air/AirFixObviousSpills.cpp:
+        * b3/air/AirFixPartialRegisterStalls.cpp:
+        (JSC::B3::Air::fixPartialRegisterStalls):
+        * b3/air/AirInst.cpp:
+        (JSC::B3::Air::Inst::hasArgEffects):
+        * b3/air/AirInst.h:
+        (JSC::B3::Air::Inst::forEachTmp):
+        * b3/air/AirInstInlines.h:
+        (JSC::B3::Air::Inst::forEach):
+        (JSC::B3::Air::Inst::forEachDef):
+        (JSC::B3::Air::Inst::forEachDefWithExtraClobberedRegs):
+        * b3/air/AirLiveness.h:
+        (JSC::B3::Air::TmpLivenessAdapter::numIndices):
+        (JSC::B3::Air::TmpLivenessAdapter::acceptsBank):
+        (JSC::B3::Air::TmpLivenessAdapter::valueToIndex):
+        (JSC::B3::Air::TmpLivenessAdapter::indexToValue):
+        (JSC::B3::Air::StackSlotLivenessAdapter::acceptsBank):
+        (JSC::B3::Air::RegLivenessAdapter::acceptsBank):
+        (JSC::B3::Air::AbstractLiveness::AbstractLiveness):
+        (JSC::B3::Air::AbstractLiveness::LocalCalc::execute):
+        (JSC::B3::Air::TmpLivenessAdapter::acceptsType): Deleted.
+        (JSC::B3::Air::StackSlotLivenessAdapter::acceptsType): Deleted.
+        (JSC::B3::Air::RegLivenessAdapter::acceptsType): Deleted.
+        * b3/air/AirLogRegisterPressure.cpp:
+        (JSC::B3::Air::logRegisterPressure):
+        * b3/air/AirLowerAfterRegAlloc.cpp:
+        (JSC::B3::Air::lowerAfterRegAlloc):
+        * b3/air/AirLowerMacros.cpp:
+        (JSC::B3::Air::lowerMacros):
+        * b3/air/AirPadInterference.cpp:
+        (JSC::B3::Air::padInterference):
+        * b3/air/AirReportUsedRegisters.cpp:
+        (JSC::B3::Air::reportUsedRegisters):
+        * b3/air/AirSpillEverything.cpp:
+        (JSC::B3::Air::spillEverything):
+        * b3/air/AirTmpInlines.h:
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::absoluteIndex): Deleted.
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::lastMachineRegisterIndex): Deleted.
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::GP&gt;::tmpFromAbsoluteIndex): Deleted.
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::absoluteIndex): Deleted.
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::lastMachineRegisterIndex): Deleted.
+        (JSC::B3::Air::AbsoluteTmpMapper&lt;Arg::FP&gt;::tmpFromAbsoluteIndex): Deleted.
+        * b3/air/AirTmpWidth.cpp:
+        (JSC::B3::Air::TmpWidth::recompute):
+        * b3/air/AirTmpWidth.h:
+        (JSC::B3::Air::TmpWidth::width):
+        (JSC::B3::Air::TmpWidth::requiredWidth):
+        (JSC::B3::Air::TmpWidth::defWidth):
+        (JSC::B3::Air::TmpWidth::useWidth):
+        (JSC::B3::Air::TmpWidth::Widths::Widths):
+        * b3/air/AirUseCounts.h:
+        (JSC::B3::Air::UseCounts::UseCounts):
+        * b3/air/AirValidate.cpp:
+        * b3/air/opcode_generator.rb:
+        * b3/air/testair.cpp:
+        (JSC::B3::Air::compile): Deleted.
+        (JSC::B3::Air::invoke): Deleted.
+        (JSC::B3::Air::compileAndRun): Deleted.
+        (JSC::B3::Air::testSimple): Deleted.
+        (JSC::B3::Air::loadConstantImpl): Deleted.
+        (JSC::B3::Air::loadConstant): Deleted.
+        (JSC::B3::Air::loadDoubleConstant): Deleted.
+        (JSC::B3::Air::testShuffleSimpleSwap): Deleted.
+        (JSC::B3::Air::testShuffleSimpleShift): Deleted.
+        (JSC::B3::Air::testShuffleLongShift): Deleted.
+        (JSC::B3::Air::testShuffleLongShiftBackwards): Deleted.
+        (JSC::B3::Air::testShuffleSimpleRotate): Deleted.
+        (JSC::B3::Air::testShuffleSimpleBroadcast): Deleted.
+        (JSC::B3::Air::testShuffleBroadcastAllRegs): Deleted.
+        (JSC::B3::Air::testShuffleTreeShift): Deleted.
+        (JSC::B3::Air::testShuffleTreeShiftBackward): Deleted.
+        (JSC::B3::Air::testShuffleTreeShiftOtherBackward): Deleted.
+        (JSC::B3::Air::testShuffleMultipleShifts): Deleted.
+        (JSC::B3::Air::testShuffleRotateWithFringe): Deleted.
+        (JSC::B3::Air::testShuffleRotateWithFringeInWeirdOrder): Deleted.
+        (JSC::B3::Air::testShuffleRotateWithLongFringe): Deleted.
+        (JSC::B3::Air::testShuffleMultipleRotates): Deleted.
+        (JSC::B3::Air::testShuffleShiftAndRotate): Deleted.
+        (JSC::B3::Air::testShuffleShiftAllRegs): Deleted.
+        (JSC::B3::Air::testShuffleRotateAllRegs): Deleted.
+        (JSC::B3::Air::testShuffleSimpleSwap64): Deleted.
+        (JSC::B3::Air::testShuffleSimpleShift64): Deleted.
+        (JSC::B3::Air::testShuffleSwapMixedWidth): Deleted.
+        (JSC::B3::Air::testShuffleShiftMixedWidth): Deleted.
+        (JSC::B3::Air::testShuffleShiftMemory): Deleted.
+        (JSC::B3::Air::testShuffleShiftMemoryLong): Deleted.
+        (JSC::B3::Air::testShuffleShiftMemoryAllRegs): Deleted.
+        (JSC::B3::Air::testShuffleShiftMemoryAllRegs64): Deleted.
+        (JSC::B3::Air::combineHiLo): Deleted.
+        (JSC::B3::Air::testShuffleShiftMemoryAllRegsMixedWidth): Deleted.
+        (JSC::B3::Air::testShuffleRotateMemory): Deleted.
+        (JSC::B3::Air::testShuffleRotateMemory64): Deleted.
+        (JSC::B3::Air::testShuffleRotateMemoryMixedWidth): Deleted.
+        (JSC::B3::Air::testShuffleRotateMemoryAllRegs64): Deleted.
+        (JSC::B3::Air::testShuffleRotateMemoryAllRegsMixedWidth): Deleted.
+        (JSC::B3::Air::testShuffleSwapDouble): Deleted.
+        (JSC::B3::Air::testShuffleShiftDouble): Deleted.
+        (JSC::B3::Air::testX86VMULSD): Deleted.
+        (JSC::B3::Air::testX86VMULSDDestRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDOp1DestRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDOp2DestRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDOpsDestRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDAddr): Deleted.
+        (JSC::B3::Air::testX86VMULSDAddrOpRexAddr): Deleted.
+        (JSC::B3::Air::testX86VMULSDDestRexAddr): Deleted.
+        (JSC::B3::Air::testX86VMULSDRegOpDestRexAddr): Deleted.
+        (JSC::B3::Air::testX86VMULSDAddrOpDestRexAddr): Deleted.
+        (JSC::B3::Air::testX86VMULSDBaseNeedsRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDIndexNeedsRex): Deleted.
+        (JSC::B3::Air::testX86VMULSDBaseIndexNeedRex): Deleted.
+        (JSC::B3::Air::run): Deleted.
+
</ins><span class="cx"> 2017-02-24  Keith Miller  &lt;keith_miller@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         We should be able to use std::tuples as keys in HashMap
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -270,6 +270,10 @@
</span><span class="cx">                 0F2BDC4F15228BF300CD8910 /* DFGValueSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2BDC4E15228BE700CD8910 /* DFGValueSource.cpp */; };
</span><span class="cx">                 0F2BDC5115228FFD00CD8910 /* DFGVariableEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2BDC5015228FFA00CD8910 /* DFGVariableEvent.cpp */; };
</span><span class="cx">                 0F2C63AA1E4FA42E00C13839 /* RunningScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2C63A91E4FA42C00C13839 /* RunningScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0F2C63AF1E60AE4100C13839 /* B3Bank.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2C63AB1E60AE3C00C13839 /* B3Bank.cpp */; };
+                0F2C63B01E60AE4300C13839 /* B3Bank.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2C63AC1E60AE3C00C13839 /* B3Bank.h */; };
+                0F2C63B11E60AE4500C13839 /* B3Width.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2C63AD1E60AE3C00C13839 /* B3Width.cpp */; };
+                0F2C63B21E60AE4700C13839 /* B3Width.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2C63AE1E60AE3D00C13839 /* B3Width.h */; };
</ins><span class="cx">                 0F2D4DDD19832D34007D4B19 /* DebuggerScope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2D4DDB19832D34007D4B19 /* DebuggerScope.cpp */; };
</span><span class="cx">                 0F2D4DDE19832D34007D4B19 /* DebuggerScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2D4DDC19832D34007D4B19 /* DebuggerScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F2D4DE819832DAC007D4B19 /* ToThisStatus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2D4DE519832DAC007D4B19 /* ToThisStatus.cpp */; };
</span><span class="lines">@@ -2756,6 +2760,10 @@
</span><span class="cx">                 0F2BDC4E15228BE700CD8910 /* DFGValueSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGValueSource.cpp; path = dfg/DFGValueSource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F2BDC5015228FFA00CD8910 /* DFGVariableEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGVariableEvent.cpp; path = dfg/DFGVariableEvent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F2C63A91E4FA42C00C13839 /* RunningScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RunningScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F2C63AB1E60AE3C00C13839 /* B3Bank.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3Bank.cpp; path = b3/B3Bank.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F2C63AC1E60AE3C00C13839 /* B3Bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3Bank.h; path = b3/B3Bank.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F2C63AD1E60AE3C00C13839 /* B3Width.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3Width.cpp; path = b3/B3Width.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F2C63AE1E60AE3D00C13839 /* B3Width.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3Width.h; path = b3/B3Width.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F2D4DDB19832D34007D4B19 /* DebuggerScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DebuggerScope.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F2D4DDC19832D34007D4B19 /* DebuggerScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F2D4DDF19832D91007D4B19 /* TypeProfilerLog.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TypeProfilerLog.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5284,6 +5292,8 @@
</span><span class="cx">                                 0FEC84B31BDACD880080FF74 /* air */,
</span><span class="cx">                                 0FEC84B41BDACDAC0080FF74 /* B3ArgumentRegValue.cpp */,
</span><span class="cx">                                 0FEC84B51BDACDAC0080FF74 /* B3ArgumentRegValue.h */,
</span><ins>+                                0F2C63AB1E60AE3C00C13839 /* B3Bank.cpp */,
+                                0F2C63AC1E60AE3C00C13839 /* B3Bank.h */,
</ins><span class="cx">                                 0FEC84B61BDACDAC0080FF74 /* B3BasicBlock.cpp */,
</span><span class="cx">                                 0FEC84B71BDACDAC0080FF74 /* B3BasicBlock.h */,
</span><span class="cx">                                 0FEC84B81BDACDAC0080FF74 /* B3BasicBlockInlines.h */,
</span><span class="lines">@@ -5440,6 +5450,8 @@
</span><span class="cx">                                 53D444DB1DAF08AB00B92784 /* B3WasmAddressValue.h */,
</span><span class="cx">                                 5341FC6F1DAC33E500E7E4D7 /* B3WasmBoundsCheckValue.cpp */,
</span><span class="cx">                                 5341FC711DAC343C00E7E4D7 /* B3WasmBoundsCheckValue.h */,
</span><ins>+                                0F2C63AD1E60AE3C00C13839 /* B3Width.cpp */,
+                                0F2C63AE1E60AE3D00C13839 /* B3Width.h */,
</ins><span class="cx">                                 0FEC85AE1BDB5D5E0080FF74 /* testb3.cpp */,
</span><span class="cx">                         );
</span><span class="cx">                         name = b3;
</span><span class="lines">@@ -7915,6 +7927,7 @@
</span><span class="cx">                         isa = PBXHeadersBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><ins>+                                0F2C63B21E60AE4700C13839 /* B3Width.h in Headers */,
</ins><span class="cx">                                 0FFA549816B8835300B3A982 /* A64DOpcode.h in Headers */,
</span><span class="cx">                                 0F1FE51C1922A3BC006987C5 /* AbortReason.h in Headers */,
</span><span class="cx">                                 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */,
</span><span class="lines">@@ -8390,6 +8403,7 @@
</span><span class="cx">                                 0F2FCCFF18A60070001A27F8 /* DFGThreadData.h in Headers */,
</span><span class="cx">                                 0FC097A2146B28CC00CF2442 /* DFGThunks.h in Headers */,
</span><span class="cx">                                 0FD8A32817D51F5700CA2C40 /* DFGTierUpCheckInjectionPhase.h in Headers */,
</span><ins>+                                0F2C63B01E60AE4300C13839 /* B3Bank.h in Headers */,
</ins><span class="cx">                                 0FD8A32A17D51F5700CA2C40 /* DFGToFTLDeferredCompilationCallback.h in Headers */,
</span><span class="cx">                                 0FD8A32C17D51F5700CA2C40 /* DFGToFTLForOSREntryDeferredCompilationCallback.h in Headers */,
</span><span class="cx">                                 0FE7211E193B9C590031F6ED /* DFGTransition.h in Headers */,
</span><span class="lines">@@ -9806,6 +9820,7 @@
</span><span class="cx">                                 0FB3878F1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp in Sources */,
</span><span class="cx">                                 0F9CABC81DB54A780008E83B /* AirPadInterference.cpp in Sources */,
</span><span class="cx">                                 0FEC85831BDACDC70080FF74 /* AirPhaseScope.cpp in Sources */,
</span><ins>+                                0F2C63B11E60AE4500C13839 /* B3Width.cpp in Sources */,
</ins><span class="cx">                                 0F45703C1BE45F0A0062A629 /* AirReportUsedRegisters.cpp in Sources */,
</span><span class="cx">                                 0F338DFD1BED51270013C88F /* AirSimplifyCFG.cpp in Sources */,
</span><span class="cx">                                 0FEC85871BDACDC70080FF74 /* AirSpecial.cpp in Sources */,
</span><span class="lines">@@ -10531,6 +10546,7 @@
</span><span class="cx">                                 14280844107EC0930013E7B2 /* RegExpPrototype.cpp in Sources */,
</span><span class="cx">                                 6540C7A01B82E1C3000F6B79 /* RegisterAtOffset.cpp in Sources */,
</span><span class="cx">                                 6540C7A11B82E1C3000F6B79 /* RegisterAtOffsetList.cpp in Sources */,
</span><ins>+                                0F2C63AF1E60AE4100C13839 /* B3Bank.cpp in Sources */,
</ins><span class="cx">                                 0FC3141518146D7000033232 /* RegisterSet.cpp in Sources */,
</span><span class="cx">                                 0FD0E5EC1E43D3530006AB08 /* GCConductor.cpp in Sources */,
</span><span class="cx">                                 A57D23ED1891B5540031C7FA /* RegularExpression.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Bankcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/b3/B3Bank.cpp (0 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Bank.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/b3/B3Bank.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;B3Bank.h&quot;
+
+#if ENABLE(B3_JIT)
+
+#include &lt;wtf/PrintStream.h&gt;
+
+namespace WTF {
+
+void printInternal(PrintStream&amp; out, JSC::B3::Bank bank)
+{
+    switch (bank) {
+    case JSC::B3::GP:
+        out.print(&quot;GP&quot;);
+        return;
+    case JSC::B3::FP:
+        out.print(&quot;FP&quot;);
+        return;
+    }
+
+    RELEASE_ASSERT_NOT_REACHED();
+}
+
+} // namespace WTF
+
+#endif // ENABLE(B3_JIT)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Bankh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/b3/B3Bank.h (0 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Bank.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/b3/B3Bank.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#if ENABLE(B3_JIT)
+
+#include &quot;B3Type.h&quot;
+
+namespace JSC { namespace B3 {
+
+enum Bank : int8_t {
+    GP,
+    FP
+};
+
+static const unsigned numBanks = 2;
+
+template&lt;typename Func&gt;
+void forEachBank(const Func&amp; func)
+{
+    func(GP);
+    func(FP);
+}
+
+inline Bank bankForType(Type type)
+{
+    switch (type) {
+    case Void:
+        ASSERT_NOT_REACHED();
+        return GP;
+    case Int32:
+    case Int64:
+        return GP;
+    case Float:
+    case Double:
+        return FP;
+    }
+    ASSERT_NOT_REACHED();
+    return GP;
+}
+
+} } // namespace JSC::B3
+
+namespace WTF {
+
+class PrintStream;
+
+void printInternal(PrintStream&amp;, JSC::B3::Bank);
+
+} // namespace WTF
+
+#endif // ENABLE(B3_JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3CheckSpecialcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3CheckSpecial.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3CheckSpecial.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3CheckSpecial.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -110,9 +110,9 @@
</span><span class="cx"> {
</span><span class="cx">     Inst hidden = hiddenBranch(inst);
</span><span class="cx">     hidden.forEachArg(
</span><del>-        [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width) {
</del><ins>+        [&amp;] (Arg&amp; arg, Arg::Role role, Bank bank, Width width) {
</ins><span class="cx">             unsigned index = &amp;arg - &amp;hidden.args[0];
</span><del>-            callback(inst.args[1 + index], role, type, width);
</del><ins>+            callback(inst.args[1 + index], role, bank, width);
</ins><span class="cx">         });
</span><span class="cx"> 
</span><span class="cx">     std::optional&lt;unsigned&gt; firstRecoverableIndex;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3LegalizeMemoryOffsetscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3LegalizeMemoryOffsets.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3LegalizeMemoryOffsets.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3LegalizeMemoryOffsets.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">                     continue;
</span><span class="cx"> 
</span><span class="cx">                 int32_t offset = memoryValue-&gt;offset();
</span><del>-                Air::Arg::Width width = Air::Arg::widthForBytes(memoryValue-&gt;accessByteSize());
</del><ins>+                Width width = memoryValue-&gt;accessWidth();
</ins><span class="cx">                 if (!Air::Arg::isValidAddrForm(offset, width)) {
</span><span class="cx">                     Value* base = memoryValue-&gt;lastChild();
</span><span class="cx">                     Value* offsetValue = m_insertionSet.insertIntConstant(index, memoryValue-&gt;origin(), pointerType(), offset);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3LowerToAircpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">         for (Value* value : m_procedure.values()) {
</span><span class="cx">             switch (value-&gt;opcode()) {
</span><span class="cx">             case Phi: {
</span><del>-                m_phiToTmp[value] = m_code.newTmp(Arg::typeForB3Type(value-&gt;type()));
</del><ins>+                m_phiToTmp[value] = m_code.newTmp(value-&gt;resultBank());
</ins><span class="cx">                 if (verbose)
</span><span class="cx">                     dataLog(&quot;Phi tmp for &quot;, *value, &quot;: &quot;, m_phiToTmp[value], &quot;\n&quot;);
</span><span class="cx">                 break;
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx">         for (B3::StackSlot* stack : m_procedure.stackSlots())
</span><span class="cx">             m_stackToStack.add(stack, m_code.addStackSlot(stack));
</span><span class="cx">         for (Variable* variable : m_procedure.variables())
</span><del>-            m_variableToTmp.add(variable, m_code.newTmp(Arg::typeForB3Type(variable-&gt;type())));
</del><ins>+            m_variableToTmp.add(variable, m_code.newTmp(variable-&gt;bank()));
</ins><span class="cx"> 
</span><span class="cx">         // Figure out which blocks are not rare.
</span><span class="cx">         m_fastWorklist.push(m_procedure[0]);
</span><span class="lines">@@ -361,7 +361,7 @@
</span><span class="cx"> 
</span><span class="cx">             Tmp&amp; realTmp = m_valueToTmp[value];
</span><span class="cx">             if (!realTmp) {
</span><del>-                realTmp = m_code.newTmp(Arg::typeForB3Type(value-&gt;type()));
</del><ins>+                realTmp = m_code.newTmp(value-&gt;resultBank());
</ins><span class="cx">                 if (m_procedure.isFastConstant(value-&gt;key()))
</span><span class="cx">                     m_code.addFastTmp(realTmp);
</span><span class="cx">                 if (verbose)
</span><span class="lines">@@ -427,7 +427,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    std::optional&lt;unsigned&gt; scaleForShl(Value* shl, int32_t offset, std::optional&lt;Arg::Width&gt; width = std::nullopt)
</del><ins>+    std::optional&lt;unsigned&gt; scaleForShl(Value* shl, int32_t offset, std::optional&lt;Width&gt; width = std::nullopt)
</ins><span class="cx">     {
</span><span class="cx">         if (shl-&gt;opcode() != Shl)
</span><span class="cx">             return std::nullopt;
</span><span class="lines">@@ -450,7 +450,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // This turns the given operand into an address.
</span><del>-    Arg effectiveAddr(Value* address, int32_t offset, Arg::Width width)
</del><ins>+    Arg effectiveAddr(Value* address, int32_t offset, Width width)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(Arg::isValidAddrForm(offset, width));
</span><span class="cx"> 
</span><span class="lines">@@ -538,7 +538,7 @@
</span><span class="cx">             return Arg();
</span><span class="cx"> 
</span><span class="cx">         int32_t offset = value-&gt;offset();
</span><del>-        Arg::Width width = Arg::widthForBytes(value-&gt;accessByteSize());
</del><ins>+        Width width = value-&gt;accessWidth();
</ins><span class="cx"> 
</span><span class="cx">         Arg result = effectiveAddr(value-&gt;lastChild(), offset, width);
</span><span class="cx">         ASSERT(result.isValidForm(width));
</span><span class="lines">@@ -1137,8 +1137,8 @@
</span><span class="cx">     template&lt;typename CompareFunctor, typename TestFunctor, typename CompareDoubleFunctor, typename CompareFloatFunctor&gt;
</span><span class="cx">     Inst createGenericCompare(
</span><span class="cx">         Value* value,
</span><del>-        const CompareFunctor&amp; compare, // Signature: (Arg::Width, Arg relCond, Arg, Arg) -&gt; Inst
-        const TestFunctor&amp; test, // Signature: (Arg::Width, Arg resCond, Arg, Arg) -&gt; Inst
</del><ins>+        const CompareFunctor&amp; compare, // Signature: (Width, Arg relCond, Arg, Arg) -&gt; Inst
+        const TestFunctor&amp; test, // Signature: (Width, Arg resCond, Arg, Arg) -&gt; Inst
</ins><span class="cx">         const CompareDoubleFunctor&amp; compareDouble, // Signature: (Arg doubleCond, Arg, Arg) -&gt; Inst
</span><span class="cx">         const CompareFloatFunctor&amp; compareFloat, // Signature: (Arg doubleCond, Arg, Arg) -&gt; Inst
</span><span class="cx">         bool inverted = false)
</span><span class="lines">@@ -1300,7 +1300,7 @@
</span><span class="cx">                 Arg rightImm = imm(right);
</span><span class="cx"> 
</span><span class="cx">                 auto tryCompare = [&amp;] (
</span><del>-                    Arg::Width width, ArgPromise&amp;&amp; left, ArgPromise&amp;&amp; right) -&gt; Inst {
</del><ins>+                    Width width, ArgPromise&amp;&amp; left, ArgPromise&amp;&amp; right) -&gt; Inst {
</ins><span class="cx">                     if (Inst result = compare(width, relCond, left, right))
</span><span class="cx">                         return result;
</span><span class="cx">                     if (Inst result = compare(width, relCond.flipped(), right, left))
</span><span class="lines">@@ -1309,7 +1309,7 @@
</span><span class="cx">                 };
</span><span class="cx"> 
</span><span class="cx">                 auto tryCompareLoadImm = [&amp;] (
</span><del>-                    Arg::Width width, B3::Opcode loadOpcode, Arg::Signedness signedness) -&gt; Inst {
</del><ins>+                    Width width, B3::Opcode loadOpcode, Arg::Signedness signedness) -&gt; Inst {
</ins><span class="cx">                     if (rightImm &amp;&amp; rightImm.isRepresentableAs(width, signedness)) {
</span><span class="cx">                         if (Inst result = tryCompare(width, loadPromise(left, loadOpcode), rightImm)) {
</span><span class="cx">                             commitInternal(left);
</span><span class="lines">@@ -1325,7 +1325,7 @@
</span><span class="cx">                     return Inst();
</span><span class="cx">                 };
</span><span class="cx"> 
</span><del>-                Arg::Width width = Arg::widthForB3Type(value-&gt;child(0)-&gt;type());
</del><ins>+                Width width = value-&gt;child(0)-&gt;resultWidth();
</ins><span class="cx">                 
</span><span class="cx">                 if (canCommitInternal) {
</span><span class="cx">                     // First handle compares that involve fewer bits than B3's type system supports.
</span><span class="lines">@@ -1338,22 +1338,22 @@
</span><span class="cx">                     //     Branch(@3)
</span><span class="cx">                 
</span><span class="cx">                     if (relCond.isSignedCond()) {
</span><del>-                        if (Inst result = tryCompareLoadImm(Arg::Width8, Load8S, Arg::Signed))
</del><ins>+                        if (Inst result = tryCompareLoadImm(Width8, Load8S, Arg::Signed))
</ins><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx">                 
</span><span class="cx">                     if (relCond.isUnsignedCond()) {
</span><del>-                        if (Inst result = tryCompareLoadImm(Arg::Width8, Load8Z, Arg::Unsigned))
</del><ins>+                        if (Inst result = tryCompareLoadImm(Width8, Load8Z, Arg::Unsigned))
</ins><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><span class="cx">                     if (relCond.isSignedCond()) {
</span><del>-                        if (Inst result = tryCompareLoadImm(Arg::Width16, Load16S, Arg::Signed))
</del><ins>+                        if (Inst result = tryCompareLoadImm(Width16, Load16S, Arg::Signed))
</ins><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx">                 
</span><span class="cx">                     if (relCond.isUnsignedCond()) {
</span><del>-                        if (Inst result = tryCompareLoadImm(Arg::Width16, Load16Z, Arg::Unsigned))
</del><ins>+                        if (Inst result = tryCompareLoadImm(Width16, Load16Z, Arg::Unsigned))
</ins><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><span class="lines">@@ -1402,11 +1402,11 @@
</span><span class="cx">             return compareDouble(doubleCond, leftPromise, rightPromise);
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        Arg::Width width = Arg::widthForB3Type(value-&gt;type());
</del><ins>+        Width width = value-&gt;resultWidth();
</ins><span class="cx">         Arg resCond = Arg::resCond(MacroAssembler::NonZero).inverted(inverted);
</span><span class="cx">         
</span><span class="cx">         auto tryTest = [&amp;] (
</span><del>-            Arg::Width width, ArgPromise&amp;&amp; left, ArgPromise&amp;&amp; right) -&gt; Inst {
</del><ins>+            Width width, ArgPromise&amp;&amp; left, ArgPromise&amp;&amp; right) -&gt; Inst {
</ins><span class="cx">             if (Inst result = test(width, resCond, left, right))
</span><span class="cx">                 return result;
</span><span class="cx">             if (Inst result = test(width, resCond, right, left))
</span><span class="lines">@@ -1457,7 +1457,7 @@
</span><span class="cx">                     rightImm64 = bitImm64(right);
</span><span class="cx">                 }
</span><span class="cx">                 
</span><del>-                auto tryTestLoadImm = [&amp;] (Arg::Width width, Arg::Signedness signedness, B3::Opcode loadOpcode) -&gt; Inst {
</del><ins>+                auto tryTestLoadImm = [&amp;] (Width width, Arg::Signedness signedness, B3::Opcode loadOpcode) -&gt; Inst {
</ins><span class="cx">                     if (!hasRightConst)
</span><span class="cx">                         return Inst();
</span><span class="cx">                     // Signed loads will create high bits, so if the immediate has high bits
</span><span class="lines">@@ -1491,16 +1491,16 @@
</span><span class="cx">                 if (canCommitInternal) {
</span><span class="cx">                     // First handle test's that involve fewer bits than B3's type system supports.
</span><span class="cx"> 
</span><del>-                    if (Inst result = tryTestLoadImm(Arg::Width8, Arg::Unsigned, Load8Z))
</del><ins>+                    if (Inst result = tryTestLoadImm(Width8, Arg::Unsigned, Load8Z))
</ins><span class="cx">                         return result;
</span><span class="cx">                     
</span><del>-                    if (Inst result = tryTestLoadImm(Arg::Width8, Arg::Signed, Load8S))
</del><ins>+                    if (Inst result = tryTestLoadImm(Width8, Arg::Signed, Load8S))
</ins><span class="cx">                         return result;
</span><span class="cx">                     
</span><del>-                    if (Inst result = tryTestLoadImm(Arg::Width16, Arg::Unsigned, Load16Z))
</del><ins>+                    if (Inst result = tryTestLoadImm(Width16, Arg::Unsigned, Load16Z))
</ins><span class="cx">                         return result;
</span><span class="cx">                     
</span><del>-                    if (Inst result = tryTestLoadImm(Arg::Width16, Arg::Signed, Load16S))
</del><ins>+                    if (Inst result = tryTestLoadImm(Width16, Arg::Signed, Load16S))
</ins><span class="cx">                         return result;
</span><span class="cx"> 
</span><span class="cx">                     // This allows us to use a 32-bit test for 64-bit BitAnd if the immediate is
</span><span class="lines">@@ -1508,7 +1508,7 @@
</span><span class="cx">                     // as if we were pondering using a 32-bit test for
</span><span class="cx">                     // BitAnd(SExt(Load(ptr)), const), in the sense that in both cases we have
</span><span class="cx">                     // to worry about high bits. So, we use the &quot;Signed&quot; version of this helper.
</span><del>-                    if (Inst result = tryTestLoadImm(Arg::Width32, Arg::Signed, Load))
</del><ins>+                    if (Inst result = tryTestLoadImm(Width32, Arg::Signed, Load))
</ins><span class="cx">                         return result;
</span><span class="cx">                     
</span><span class="cx">                     // This is needed to handle 32-bit test for arbitrary 32-bit immediates.
</span><span class="lines">@@ -1517,7 +1517,7 @@
</span><span class="cx">                     
</span><span class="cx">                     // Now handle test's that involve a load.
</span><span class="cx">                     
</span><del>-                    Arg::Width width = Arg::widthForB3Type(value-&gt;child(0)-&gt;type());
</del><ins>+                    Width width = value-&gt;child(0)-&gt;resultWidth();
</ins><span class="cx">                     if (Inst result = tryTest(width, loadPromise(left), tmpPromise(right))) {
</span><span class="cx">                         commitInternal(left);
</span><span class="cx">                         return result;
</span><span class="lines">@@ -1532,15 +1532,15 @@
</span><span class="cx">                 // Now handle test's that involve an immediate and a tmp.
</span><span class="cx"> 
</span><span class="cx">                 if (hasRightConst) {
</span><del>-                    if ((width == Arg::Width32 &amp;&amp; rightConst == 0xffffffff)
-                        || (width == Arg::Width64 &amp;&amp; rightConst == -1)) {
</del><ins>+                    if ((width == Width32 &amp;&amp; rightConst == 0xffffffff)
+                        || (width == Width64 &amp;&amp; rightConst == -1)) {
</ins><span class="cx">                         if (Inst result = tryTest(width, tmpPromise(left), tmpPromise(left)))
</span><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx">                     if (isRepresentableAs&lt;uint32_t&gt;(rightConst)) {
</span><del>-                        if (Inst result = tryTest(Arg::Width32, tmpPromise(left), rightImm))
</del><ins>+                        if (Inst result = tryTest(Width32, tmpPromise(left), rightImm))
</ins><span class="cx">                             return result;
</span><del>-                        if (Inst result = tryTest(Arg::Width32, tmpPromise(left), rightImm64))
</del><ins>+                        if (Inst result = tryTest(Width32, tmpPromise(left), rightImm64))
</ins><span class="cx">                             return result;
</span><span class="cx">                     }
</span><span class="cx">                     if (Inst result = tryTest(width, tmpPromise(left), rightImm))
</span><span class="lines">@@ -1568,22 +1568,22 @@
</span><span class="cx">             if (canCommitInternal &amp;&amp; value-&gt;as&lt;MemoryValue&gt;()) {
</span><span class="cx">                 // Handle things like Branch(Load8Z(value))
</span><span class="cx"> 
</span><del>-                if (Inst result = tryTest(Arg::Width8, loadPromise(value, Load8Z), Arg::bitImm(-1))) {
</del><ins>+                if (Inst result = tryTest(Width8, loadPromise(value, Load8Z), Arg::bitImm(-1))) {
</ins><span class="cx">                     commitInternal(value);
</span><span class="cx">                     return result;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                if (Inst result = tryTest(Arg::Width8, loadPromise(value, Load8S), Arg::bitImm(-1))) {
</del><ins>+                if (Inst result = tryTest(Width8, loadPromise(value, Load8S), Arg::bitImm(-1))) {
</ins><span class="cx">                     commitInternal(value);
</span><span class="cx">                     return result;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                if (Inst result = tryTest(Arg::Width16, loadPromise(value, Load16Z), Arg::bitImm(-1))) {
</del><ins>+                if (Inst result = tryTest(Width16, loadPromise(value, Load16Z), Arg::bitImm(-1))) {
</ins><span class="cx">                     commitInternal(value);
</span><span class="cx">                     return result;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                if (Inst result = tryTest(Arg::Width16, loadPromise(value, Load16S), Arg::bitImm(-1))) {
</del><ins>+                if (Inst result = tryTest(Width16, loadPromise(value, Load16S), Arg::bitImm(-1))) {
</ins><span class="cx">                     commitInternal(value);
</span><span class="cx">                     return result;
</span><span class="cx">                 }
</span><span class="lines">@@ -1612,10 +1612,10 @@
</span><span class="cx">         return createGenericCompare(
</span><span class="cx">             value,
</span><span class="cx">             [this] (
</span><del>-                Arg::Width width, const Arg&amp; relCond,
</del><ins>+                Width width, const Arg&amp; relCond,
</ins><span class="cx">                 ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</span><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
</del><ins>+                case Width8:
</ins><span class="cx">                     if (isValidForm(Branch8, Arg::RelCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Branch8, m_value, relCond,
</span><span class="lines">@@ -1622,9 +1622,9 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width16:
</del><ins>+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     if (isValidForm(Branch32, Arg::RelCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Branch32, m_value, relCond,
</span><span class="lines">@@ -1631,7 +1631,7 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     if (isValidForm(Branch64, Arg::RelCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Branch64, m_value, relCond,
</span><span class="lines">@@ -1642,10 +1642,10 @@
</span><span class="cx">                 ASSERT_NOT_REACHED();
</span><span class="cx">             },
</span><span class="cx">             [this] (
</span><del>-                Arg::Width width, const Arg&amp; resCond,
</del><ins>+                Width width, const Arg&amp; resCond,
</ins><span class="cx">                 ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</span><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
</del><ins>+                case Width8:
</ins><span class="cx">                     if (isValidForm(BranchTest8, Arg::ResCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             BranchTest8, m_value, resCond,
</span><span class="lines">@@ -1652,9 +1652,9 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width16:
</del><ins>+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     if (isValidForm(BranchTest32, Arg::ResCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             BranchTest32, m_value, resCond,
</span><span class="lines">@@ -1661,7 +1661,7 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     if (isValidForm(BranchTest64, Arg::ResCond, left.kind(), right.kind())) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             BranchTest64, m_value, resCond,
</span><span class="lines">@@ -1695,13 +1695,13 @@
</span><span class="cx">         return createGenericCompare(
</span><span class="cx">             value,
</span><span class="cx">             [this] (
</span><del>-                Arg::Width width, const Arg&amp; relCond,
</del><ins>+                Width width, const Arg&amp; relCond,
</ins><span class="cx">                 ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</span><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
-                case Arg::Width16:
</del><ins>+                case Width8:
+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     if (isValidForm(Compare32, Arg::RelCond, left.kind(), right.kind(), Arg::Tmp)) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Compare32, m_value, relCond,
</span><span class="lines">@@ -1708,7 +1708,7 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this), tmp(m_value)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     if (isValidForm(Compare64, Arg::RelCond, left.kind(), right.kind(), Arg::Tmp)) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Compare64, m_value, relCond,
</span><span class="lines">@@ -1719,13 +1719,13 @@
</span><span class="cx">                 ASSERT_NOT_REACHED();
</span><span class="cx">             },
</span><span class="cx">             [this] (
</span><del>-                Arg::Width width, const Arg&amp; resCond,
</del><ins>+                Width width, const Arg&amp; resCond,
</ins><span class="cx">                 ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</span><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
-                case Arg::Width16:
</del><ins>+                case Width8:
+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     if (isValidForm(Test32, Arg::ResCond, left.kind(), right.kind(), Arg::Tmp)) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Test32, m_value, resCond,
</span><span class="lines">@@ -1732,7 +1732,7 @@
</span><span class="cx">                             left.consume(*this), right.consume(*this), tmp(m_value)));
</span><span class="cx">                     }
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     if (isValidForm(Test64, Arg::ResCond, left.kind(), right.kind(), Arg::Tmp)) {
</span><span class="cx">                         return left.inst(right.inst(
</span><span class="cx">                             Test64, m_value, resCond,
</span><span class="lines">@@ -1793,36 +1793,32 @@
</span><span class="cx"> 
</span><span class="cx">         return createGenericCompare(
</span><span class="cx">             m_value-&gt;child(0),
</span><del>-            [&amp;] (
-                Arg::Width width, const Arg&amp; relCond,
-                ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</del><ins>+            [&amp;] (Width width, const Arg&amp; relCond, ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</ins><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
</del><ins>+                case Width8:
</ins><span class="cx">                     // FIXME: Support these things.
</span><span class="cx">                     // https://bugs.webkit.org/show_bug.cgi?id=151504
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width16:
</del><ins>+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     return createSelectInstruction(config.moveConditionally32, relCond, left, right);
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     return createSelectInstruction(config.moveConditionally64, relCond, left, right);
</span><span class="cx">                 }
</span><span class="cx">                 ASSERT_NOT_REACHED();
</span><span class="cx">             },
</span><del>-            [&amp;] (
-                Arg::Width width, const Arg&amp; resCond,
-                ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</del><ins>+            [&amp;] (Width width, const Arg&amp; resCond, ArgPromise&amp; left, ArgPromise&amp; right) -&gt; Inst {
</ins><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width8:
</del><ins>+                case Width8:
</ins><span class="cx">                     // FIXME: Support more things.
</span><span class="cx">                     // https://bugs.webkit.org/show_bug.cgi?id=151504
</span><span class="cx">                     return Inst();
</span><del>-                case Arg::Width16:
</del><ins>+                case Width16:
</ins><span class="cx">                     return Inst();
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     return createSelectInstruction(config.moveConditionallyTest32, resCond, left, right);
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     return createSelectInstruction(config.moveConditionallyTest64, resCond, left, right);
</span><span class="cx">                 }
</span><span class="cx">                 ASSERT_NOT_REACHED();
</span><span class="lines">@@ -2535,9 +2531,9 @@
</span><span class="cx">                 patchpointValue-&gt;lateClobbered().clear(patchpointValue-&gt;resultConstraint.reg());
</span><span class="cx"> 
</span><span class="cx">             for (unsigned i = patchpointValue-&gt;numGPScratchRegisters; i--;)
</span><del>-                inst.args.append(m_code.newTmp(Arg::GP));
</del><ins>+                inst.args.append(m_code.newTmp(GP));
</ins><span class="cx">             for (unsigned i = patchpointValue-&gt;numFPScratchRegisters; i--;)
</span><del>-                inst.args.append(m_code.newTmp(Arg::FP));
</del><ins>+                inst.args.append(m_code.newTmp(FP));
</ins><span class="cx">             
</span><span class="cx">             m_insts.last().append(WTFMove(inst));
</span><span class="cx">             m_insts.last().appendVector(after);
</span><span class="lines">@@ -2619,8 +2615,8 @@
</span><span class="cx">             } else if (isValidForm(opcode, Arg::ResCond, Arg::Tmp, Arg::Tmp, Arg::Tmp, Arg::Tmp, Arg::Tmp)) {
</span><span class="cx">                 sources.append(tmp(left));
</span><span class="cx">                 sources.append(tmp(right));
</span><del>-                sources.append(m_code.newTmp(Arg::typeForB3Type(m_value-&gt;type())));
-                sources.append(m_code.newTmp(Arg::typeForB3Type(m_value-&gt;type())));
</del><ins>+                sources.append(m_code.newTmp(m_value-&gt;resultBank()));
+                sources.append(m_code.newTmp(m_value-&gt;resultBank()));
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // There is a really hilarious case that arises when we do BranchAdd32(%x, %x). We won't emit
</span><span class="lines">@@ -2682,13 +2678,13 @@
</span><span class="cx"> 
</span><span class="cx">             Value* ptr = value-&gt;child(0);
</span><span class="cx"> 
</span><del>-            Arg temp = m_code.newTmp(Arg::GP);
</del><ins>+            Arg temp = m_code.newTmp(GP);
</ins><span class="cx">             append(Inst(Move32, value, tmp(ptr), temp));
</span><span class="cx">             if (value-&gt;offset()) {
</span><span class="cx">                 if (imm(value-&gt;offset()))
</span><span class="cx">                     append(Add64, imm(value-&gt;offset()), temp);
</span><span class="cx">                 else {
</span><del>-                    Arg bigImm = m_code.newTmp(Arg::GP);
</del><ins>+                    Arg bigImm = m_code.newTmp(GP);
</ins><span class="cx">                     append(Move, Arg::bigImm(value-&gt;offset()), bigImm);
</span><span class="cx">                     append(Add64, bigImm, temp);
</span><span class="cx">                 }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3MemoryValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3MemoryValue.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3MemoryValue.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3MemoryValue.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -55,6 +55,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Width MemoryValue::accessWidth() const
+{
+    return widthForBytes(accessByteSize());
+}
+
</ins><span class="cx"> void MemoryValue::dumpMeta(CommaPrinter&amp; comma, PrintStream&amp; out) const
</span><span class="cx"> {
</span><span class="cx">     if (m_offset)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3MemoryValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3MemoryValue.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3MemoryValue.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3MemoryValue.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -83,6 +83,7 @@
</span><span class="cx">     bool isLoad() const { return type() != Void; }
</span><span class="cx"> 
</span><span class="cx">     size_t accessByteSize() const;
</span><ins>+    Width accessWidth() const;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void dumpMeta(CommaPrinter&amp; comma, PrintStream&amp;) const override;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3MoveConstantscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3MoveConstants.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3MoveConstants.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3MoveConstants.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><ins>+#include &quot;AirArg.h&quot;
</ins><span class="cx"> #include &quot;B3BasicBlockInlines.h&quot;
</span><span class="cx"> #include &quot;B3Dominators.h&quot;
</span><span class="cx"> #include &quot;B3InsertionSetInlines.h&quot;
</span><span class="lines">@@ -207,7 +208,7 @@
</span><span class="cx">                                     return false;
</span><span class="cx">                                 return Air::Arg::isValidAddrForm(
</span><span class="cx">                                     static_cast&lt;int32_t&gt;(offset),
</span><del>-                                    Air::Arg::widthForBytes(memoryValue-&gt;accessByteSize()));
</del><ins>+                                    widthForBytes(memoryValue-&gt;accessByteSize()));
</ins><span class="cx">                             });
</span><span class="cx">                         
</span><span class="cx">                         if (bestPointer) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3PatchpointSpecialcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3PatchpointSpecial.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3PatchpointSpecial.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3PatchpointSpecial.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">         else
</span><span class="cx">             role = Arg::Def;
</span><span class="cx">         
</span><del>-        callback(inst.args[argIndex++], role, inst.origin-&gt;airType(), inst.origin-&gt;airWidth());
</del><ins>+        callback(inst.args[argIndex++], role, inst.origin-&gt;resultBank(), inst.origin-&gt;resultWidth());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     forEachArgImpl(0, argIndex, inst, SameAsRep, std::nullopt, callback);
</span><span class="lines">@@ -63,9 +63,9 @@
</span><span class="cx">     argIndex += inst.origin-&gt;numChildren();
</span><span class="cx"> 
</span><span class="cx">     for (unsigned i = patchpoint-&gt;numGPScratchRegisters; i--;)
</span><del>-        callback(inst.args[argIndex++], Arg::Scratch, Arg::GP, Arg::conservativeWidth(Arg::GP));
</del><ins>+        callback(inst.args[argIndex++], Arg::Scratch, GP, conservativeWidth(GP));
</ins><span class="cx">     for (unsigned i = patchpoint-&gt;numFPScratchRegisters; i--;)
</span><del>-        callback(inst.args[argIndex++], Arg::Scratch, Arg::FP, Arg::conservativeWidth(Arg::FP));
</del><ins>+        callback(inst.args[argIndex++], Arg::Scratch, FP, conservativeWidth(FP));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool PatchpointSpecial::isValid(Inst&amp; inst)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3StackmapSpecialcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         Type type = child.value()-&gt;type();
</span><del>-        callback(arg, role, Arg::typeForB3Type(type), Arg::widthForB3Type(type));
</del><ins>+        callback(arg, role, bankForType(type), widthForType(type));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Valueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Value.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Value.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3Value.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><del>-#include &quot;AirArg.h&quot;
</del><ins>+#include &quot;B3Bank.h&quot;
</ins><span class="cx"> #include &quot;B3Effects.h&quot;
</span><span class="cx"> #include &quot;B3FrequentedBlock.h&quot;
</span><span class="cx"> #include &quot;B3Kind.h&quot;
</span><span class="lines">@@ -35,9 +35,11 @@
</span><span class="cx"> #include &quot;B3SparseCollection.h&quot;
</span><span class="cx"> #include &quot;B3Type.h&quot;
</span><span class="cx"> #include &quot;B3ValueKey.h&quot;
</span><ins>+#include &quot;B3Width.h&quot;
</ins><span class="cx"> #include &lt;wtf/CommaPrinter.h&gt;
</span><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/TriState.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 {
</span><span class="cx"> 
</span><span class="lines">@@ -86,8 +88,8 @@
</span><span class="cx">     void setType(Type type) { m_type = type; }
</span><span class="cx"> 
</span><span class="cx">     // This is useful when lowering. Note that this is only valid for non-void values.
</span><del>-    Air::Arg::Type airType() const { return Air::Arg::typeForB3Type(type()); }
-    Air::Arg::Width airWidth() const { return Air::Arg::widthForB3Type(type()); }
</del><ins>+    Bank resultBank() const { return bankForType(type()); }
+    Width resultWidth() const { return widthForType(type()); }
</ins><span class="cx"> 
</span><span class="cx">     AdjacencyList&amp; children() { return m_children; } 
</span><span class="cx">     const AdjacencyList&amp; children() const { return m_children; }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Variableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Variable.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Variable.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3Variable.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,8 +27,10 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><ins>+#include &quot;B3Bank.h&quot;
</ins><span class="cx"> #include &quot;B3SparseCollection.h&quot;
</span><span class="cx"> #include &quot;B3Type.h&quot;
</span><ins>+#include &quot;B3Width.h&quot;
</ins><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span><span class="lines">@@ -45,6 +47,8 @@
</span><span class="cx">     ~Variable();
</span><span class="cx"> 
</span><span class="cx">     Type type() const { return m_type; }
</span><ins>+    Width width() const { return widthForType(type()); }
+    Bank bank() const { return bankForType(type()); }
</ins><span class="cx">     unsigned index() const { return m_index; }
</span><span class="cx"> 
</span><span class="cx">     void dump(PrintStream&amp;) const;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3WasmAddressValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3WasmAddressValue.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3WasmAddressValue.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/B3WasmAddressValue.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;B3Value.h&quot;
</span><ins>+#include &quot;GPRInfo.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Widthcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/b3/B3Width.cpp (0 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Width.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/b3/B3Width.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;B3Width.h&quot;
+
+#if ENABLE(B3_JIT)
+
+#include &lt;wtf/PrintStream.h&gt;
+
+namespace WTF {
+
+void printInternal(PrintStream&amp; out, JSC::B3::Width width)
+{
+    switch (width) {
+    case JSC::B3::Width8:
+        out.print(&quot;8&quot;);
+        return;
+    case JSC::B3::Width16:
+        out.print(&quot;16&quot;);
+        return;
+    case JSC::B3::Width32:
+        out.print(&quot;32&quot;);
+        return;
+    case JSC::B3::Width64:
+        out.print(&quot;64&quot;);
+        return;
+    }
+
+    RELEASE_ASSERT_NOT_REACHED();
+}
+
+} // namespace WTF
+
+#endif // ENABLE(B3_JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Widthh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/b3/B3Width.h (0 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Width.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/b3/B3Width.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -0,0 +1,107 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#if ENABLE(B3_JIT)
+
+#include &quot;B3Bank.h&quot;
+#include &quot;B3Type.h&quot;
+
+namespace JSC { namespace B3 {
+
+enum Width : int8_t {
+    Width8,
+    Width16,
+    Width32,
+    Width64
+};
+
+inline Width pointerWidth()
+{
+    if (sizeof(void*) == 8)
+        return Width64;
+    return Width32;
+}
+
+inline Width widthForType(Type type)
+{
+    switch (type) {
+    case Void:
+        ASSERT_NOT_REACHED();
+        return Width8;
+    case Int32:
+    case Float:
+        return Width32;
+    case Int64:
+    case Double:
+        return Width64;
+    }
+    ASSERT_NOT_REACHED();
+}
+
+inline Width conservativeWidth(Bank bank)
+{
+    return bank == GP ? pointerWidth() : Width64;
+}
+
+inline Width minimumWidth(Bank bank)
+{
+    return bank == GP ? Width8 : Width32;
+}
+
+inline unsigned bytes(Width width)
+{
+    return 1 &lt;&lt; width;
+}
+
+inline Width widthForBytes(unsigned bytes)
+{
+    switch (bytes) {
+    case 0:
+    case 1:
+        return Width8;
+    case 2:
+        return Width16;
+    case 3:
+    case 4:
+        return Width32;
+    default:
+        return Width64;
+    }
+}
+
+} } // namespace JSC::B3
+
+namespace WTF {
+
+class PrintStream;
+
+void printInternal(PrintStream&amp;, JSC::B3::Width);
+
+} // namespace WTF
+
+#endif // ENABLE(B3_JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirAllocateRegistersByGraphColoringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirAllocateRegistersByGraphColoring.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> bool reportStats = false;
</span><span class="cx"> 
</span><span class="cx"> // The AbstractColoringAllocator defines all the code that is independant
</span><del>-// from the type or register and can be shared when allocating registers.
</del><ins>+// from the bank or register and can be shared when allocating registers.
</ins><span class="cx"> template&lt;typename IndexType, typename TmpMapper&gt;
</span><span class="cx"> class AbstractColoringAllocator {
</span><span class="cx"> public:
</span><span class="lines">@@ -1375,9 +1375,9 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // This perform all the tasks that are specific to certain register type.
</span><del>-template&lt;Arg::Type type, template&lt;typename, typename&gt; class AllocatorType&gt;
-class ColoringAllocator : public AllocatorType&lt;unsigned, AbsoluteTmpMapper&lt;type&gt;&gt; {
-    using TmpMapper = AbsoluteTmpMapper&lt;type&gt;;
</del><ins>+template&lt;Bank bank, template&lt;typename, typename&gt; class AllocatorType&gt;
+class ColoringAllocator : public AllocatorType&lt;unsigned, AbsoluteTmpMapper&lt;bank&gt;&gt; {
+    using TmpMapper = AbsoluteTmpMapper&lt;bank&gt;;
</ins><span class="cx">     using Base = AllocatorType&lt;unsigned, TmpMapper&gt;;
</span><span class="cx">     using Base::m_isOnSelectStack;
</span><span class="cx">     using Base::m_selectStack;
</span><span class="lines">@@ -1409,10 +1409,10 @@
</span><span class="cx"> public:
</span><span class="cx"> 
</span><span class="cx">     ColoringAllocator(Code&amp; code, TmpWidth&amp; tmpWidth, const UseCounts&lt;Tmp&gt;&amp; useCounts, const HashSet&lt;unsigned&gt;&amp; unspillableTmp)
</span><del>-        : Base(code, code.regsInPriorityOrder(type), TmpMapper::lastMachineRegisterIndex(), tmpArraySize(code), unspillableTmp, useCounts)
</del><ins>+        : Base(code, code.regsInPriorityOrder(bank), TmpMapper::lastMachineRegisterIndex(), tmpArraySize(code), unspillableTmp, useCounts)
</ins><span class="cx">         , m_tmpWidth(tmpWidth)
</span><span class="cx">     {
</span><del>-        if (type == Arg::GP) {
</del><ins>+        if (bank == GP) {
</ins><span class="cx">             m_framePointerIndex = TmpMapper::absoluteIndex(Tmp(MacroAssembler::framePointerRegister));
</span><span class="cx">             m_interferesWithFramePointer.ensureSize(tmpArraySize(code));
</span><span class="cx">         }
</span><span class="lines">@@ -1512,7 +1512,7 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(!tmp.isReg());
</span><span class="cx">         ASSERT(m_coloredTmp.size());
</span><del>-        ASSERT(tmp.isGP() == (type == Arg::GP));
</del><ins>+        ASSERT(tmp.isGP() == (bank == GP));
</ins><span class="cx"> 
</span><span class="cx">         Reg reg = m_coloredTmp[TmpMapper::absoluteIndex(tmp)];
</span><span class="cx">         if (!reg) {
</span><span class="lines">@@ -1527,7 +1527,7 @@
</span><span class="cx"> protected:
</span><span class="cx">     static unsigned tmpArraySize(Code&amp; code)
</span><span class="cx">     {
</span><del>-        unsigned numTmps = code.numTmps(type);
</del><ins>+        unsigned numTmps = code.numTmps(bank);
</ins><span class="cx">         return TmpMapper::absoluteIndex(numTmps);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1552,7 +1552,7 @@
</span><span class="cx">         if (leftTmp == rightTmp)
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (leftTmp.isGP() != (type == Arg::GP) || rightTmp.isGP() != (type == Arg::GP))
</del><ins>+        if (leftTmp.isGP() != (bank == GP) || rightTmp.isGP() != (bank == GP))
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         unsigned leftIndex = TmpMapper::absoluteIndex(leftTmp);
</span><span class="lines">@@ -1585,9 +1585,9 @@
</span><span class="cx">         m_coalescingCandidates.clear();
</span><span class="cx">         m_worklistMoves.clear();
</span><span class="cx"> 
</span><del>-        TmpLiveness&lt;type&gt; liveness(m_code);
</del><ins>+        TmpLiveness&lt;bank&gt; liveness(m_code);
</ins><span class="cx">         for (BasicBlock* block : m_code) {
</span><del>-            typename TmpLiveness&lt;type&gt;::LocalCalc localCalc(liveness, block);
</del><ins>+            typename TmpLiveness&lt;bank&gt;::LocalCalc localCalc(liveness, block);
</ins><span class="cx">             for (unsigned instIndex = block-&gt;size(); instIndex--;) {
</span><span class="cx">                 Inst&amp; inst = block-&gt;at(instIndex);
</span><span class="cx">                 Inst* nextInst = block-&gt;get(instIndex + 1);
</span><span class="lines">@@ -1599,7 +1599,7 @@
</span><span class="cx">         buildLowPriorityMoveList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void build(Inst* prevInst, Inst* nextInst, const typename TmpLiveness&lt;type&gt;::LocalCalc&amp; localCalc)
</del><ins>+    void build(Inst* prevInst, Inst* nextInst, const typename TmpLiveness&lt;bank&gt;::LocalCalc&amp; localCalc)
</ins><span class="cx">     {
</span><span class="cx">         if (traceDebug)
</span><span class="cx">             dataLog(&quot;Building between &quot;, pointerDump(prevInst), &quot; and &quot;, pointerDump(nextInst), &quot;:\n&quot;);
</span><span class="lines">@@ -1606,8 +1606,8 @@
</span><span class="cx"> 
</span><span class="cx">         Inst::forEachDefWithExtraClobberedRegs&lt;Tmp&gt;(
</span><span class="cx">             prevInst, nextInst,
</span><del>-            [&amp;] (const Tmp&amp; arg, Arg::Role, Arg::Type argType, Arg::Width) {
-                if (argType != type)
</del><ins>+            [&amp;] (const Tmp&amp; arg, Arg::Role, Bank argBank, Width) {
+                if (argBank != bank)
</ins><span class="cx">                     return;
</span><span class="cx">                 
</span><span class="cx">                 // All the Def()s interfere with each other and with all the extra clobbered Tmps.
</span><span class="lines">@@ -1615,8 +1615,8 @@
</span><span class="cx">                 // do not need interference edges in our implementation.
</span><span class="cx">                 Inst::forEachDef&lt;Tmp&gt;(
</span><span class="cx">                     prevInst, nextInst,
</span><del>-                    [&amp;] (Tmp&amp; otherArg, Arg::Role, Arg::Type argType, Arg::Width) {
-                        if (argType != type)
</del><ins>+                    [&amp;] (Tmp&amp; otherArg, Arg::Role, Bank argBank, Width) {
+                        if (argBank != bank)
</ins><span class="cx">                             return;
</span><span class="cx">                         
</span><span class="cx">                         if (traceDebug)
</span><span class="lines">@@ -1631,7 +1631,7 @@
</span><span class="cx">             // coalesce the Move even if the two Tmp never interfere anywhere.
</span><span class="cx">             Tmp defTmp;
</span><span class="cx">             Tmp useTmp;
</span><del>-            prevInst-&gt;forEachTmp([&amp;defTmp, &amp;useTmp] (Tmp&amp; argTmp, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+            prevInst-&gt;forEachTmp([&amp;defTmp, &amp;useTmp] (Tmp&amp; argTmp, Arg::Role role, Bank, Width) {
</ins><span class="cx">                 if (Arg::isLateDef(role))
</span><span class="cx">                     defTmp = argTmp;
</span><span class="cx">                 else {
</span><span class="lines">@@ -1695,17 +1695,17 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void addEdges(Inst* prevInst, Inst* nextInst, typename TmpLiveness&lt;type&gt;::LocalCalc::Iterable liveTmps)
</del><ins>+    void addEdges(Inst* prevInst, Inst* nextInst, typename TmpLiveness&lt;bank&gt;::LocalCalc::Iterable liveTmps)
</ins><span class="cx">     {
</span><span class="cx">         // All the Def()s interfere with everthing live.
</span><span class="cx">         Inst::forEachDefWithExtraClobberedRegs&lt;Tmp&gt;(
</span><span class="cx">             prevInst, nextInst,
</span><del>-            [&amp;] (const Tmp&amp; arg, Arg::Role, Arg::Type argType, Arg::Width) {
-                if (argType != type)
</del><ins>+            [&amp;] (const Tmp&amp; arg, Arg::Role, Bank argBank, Width) {
+                if (argBank != bank)
</ins><span class="cx">                     return;
</span><span class="cx">                 
</span><span class="cx">                 for (const Tmp&amp; liveTmp : liveTmps) {
</span><del>-                    ASSERT(liveTmp.isGP() == (type == Arg::GP));
</del><ins>+                    ASSERT(liveTmp.isGP() == (bank == GP));
</ins><span class="cx">                     
</span><span class="cx">                     if (traceDebug)
</span><span class="cx">                         dataLog(&quot;    Adding def-live edge: &quot;, arg, &quot;, &quot;, liveTmp, &quot;\n&quot;);
</span><span class="lines">@@ -1713,7 +1713,7 @@
</span><span class="cx">                     addEdge(arg, liveTmp);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                if (type == Arg::GP &amp;&amp; !arg.isGPR())
</del><ins>+                if (bank == GP &amp;&amp; !arg.isGPR())
</ins><span class="cx">                     m_interferesWithFramePointer.quickSet(TmpMapper::absoluteIndex(arg));
</span><span class="cx">             });
</span><span class="cx">     }
</span><span class="lines">@@ -1729,8 +1729,8 @@
</span><span class="cx">     // that Move32's are not coalescable.
</span><span class="cx">     static bool mayBeCoalescableImpl(const Inst&amp; inst, TmpWidth* tmpWidth)
</span><span class="cx">     {
</span><del>-        switch (type) {
-        case Arg::GP:
</del><ins>+        switch (bank) {
+        case GP:
</ins><span class="cx">             switch (inst.kind.opcode) {
</span><span class="cx">             case Move:
</span><span class="cx">             case Move32:
</span><span class="lines">@@ -1739,7 +1739,7 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">             break;
</span><del>-        case Arg::FP:
</del><ins>+        case FP:
</ins><span class="cx">             switch (inst.kind.opcode) {
</span><span class="cx">             case MoveFloat:
</span><span class="cx">             case MoveDouble:
</span><span class="lines">@@ -1755,8 +1755,8 @@
</span><span class="cx">         if (!inst.args[0].isTmp() || !inst.args[1].isTmp())
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        ASSERT(inst.args[0].type() == type);
-        ASSERT(inst.args[1].type() == type);
</del><ins>+        ASSERT(inst.args[0].bank() == bank);
+        ASSERT(inst.args[1].bank() == bank);
</ins><span class="cx"> 
</span><span class="cx">         // We can coalesce a Move32 so long as either of the following holds:
</span><span class="cx">         // - The input is already zero-filled.
</span><span class="lines">@@ -1769,8 +1769,8 @@
</span><span class="cx">             if (!tmpWidth)
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><del>-            if (tmpWidth-&gt;defWidth(inst.args[0].tmp()) &gt; Arg::Width32
-                &amp;&amp; tmpWidth-&gt;useWidth(inst.args[1].tmp()) &gt; Arg::Width32)
</del><ins>+            if (tmpWidth-&gt;defWidth(inst.args[0].tmp()) &gt; Width32
+                &amp;&amp; tmpWidth-&gt;useWidth(inst.args[1].tmp()) &gt; Width32)
</ins><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -1792,9 +1792,9 @@
</span><span class="cx">     {
</span><span class="cx">         padInterference(m_code);
</span><span class="cx"> 
</span><del>-        allocateOnType&lt;Arg::GP&gt;();
</del><ins>+        allocateOnBank&lt;GP&gt;();
</ins><span class="cx">         m_numIterations = 0;
</span><del>-        allocateOnType&lt;Arg::FP&gt;();
</del><ins>+        allocateOnBank&lt;FP&gt;();
</ins><span class="cx"> 
</span><span class="cx">         fixSpillsAfterTerminals();
</span><span class="cx"> 
</span><span class="lines">@@ -1803,10 +1803,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    template&lt;Arg::Type type&gt;
-    void allocateOnType()
</del><ins>+    template&lt;Bank bank&gt;
+    void allocateOnBank()
</ins><span class="cx">     {
</span><del>-        HashSet&lt;unsigned&gt; unspillableTmps = computeUnspillableTmps&lt;type&gt;();
</del><ins>+        HashSet&lt;unsigned&gt; unspillableTmps = computeUnspillableTmps&lt;bank&gt;();
</ins><span class="cx"> 
</span><span class="cx">         // FIXME: If a Tmp is used only from a Scratch role and that argument is !admitsStack, then
</span><span class="cx">         // we should add the Tmp to unspillableTmps. That will help avoid relooping only to turn the
</span><span class="lines">@@ -1837,7 +1837,7 @@
</span><span class="cx">             auto doAllocation = [&amp;] (auto&amp; allocator) -&gt; bool {
</span><span class="cx">                 allocator.allocate();
</span><span class="cx">                 if (!allocator.requiresSpilling()) {
</span><del>-                    this-&gt;assignRegistersToTmp&lt;type&gt;(allocator);
</del><ins>+                    this-&gt;assignRegistersToTmp&lt;bank&gt;(allocator);
</ins><span class="cx">                     if (traceDebug)
</span><span class="cx">                         dataLog(&quot;Successfull allocation at iteration &quot;, m_numIterations, &quot;:\n&quot;, m_code);
</span><span class="cx"> 
</span><span class="lines">@@ -1844,16 +1844,16 @@
</span><span class="cx">                     return true;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                this-&gt;addSpillAndFill&lt;type&gt;(allocator, unspillableTmps);
</del><ins>+                this-&gt;addSpillAndFill&lt;bank&gt;(allocator, unspillableTmps);
</ins><span class="cx">                 return false;
</span><span class="cx">             };
</span><span class="cx">             
</span><span class="cx">             bool done;
</span><span class="cx">             if ((isARM64() || Options::airForceBriggsAllocator()) &amp;&amp; !Options::airForceIRCAllocator()) {
</span><del>-                ColoringAllocator&lt;type, Briggs&gt; allocator(m_code, m_tmpWidth, m_useCounts, unspillableTmps);
</del><ins>+                ColoringAllocator&lt;bank, Briggs&gt; allocator(m_code, m_tmpWidth, m_useCounts, unspillableTmps);
</ins><span class="cx">                 done = doAllocation(allocator);
</span><span class="cx">             } else {
</span><del>-                ColoringAllocator&lt;type, IRC&gt; allocator(m_code, m_tmpWidth, m_useCounts, unspillableTmps);
</del><ins>+                ColoringAllocator&lt;bank, IRC&gt; allocator(m_code, m_tmpWidth, m_useCounts, unspillableTmps);
</ins><span class="cx">                 done = doAllocation(allocator);
</span><span class="cx">             }
</span><span class="cx">             if (done)
</span><span class="lines">@@ -1861,7 +1861,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template&lt;Arg::Type type&gt;
</del><ins>+    template&lt;Bank bank&gt;
</ins><span class="cx">     HashSet&lt;unsigned&gt; computeUnspillableTmps()
</span><span class="cx">     {
</span><span class="cx"> 
</span><span class="lines">@@ -1874,8 +1874,8 @@
</span><span class="cx">             unsigned admitStackCount { 0 };
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        unsigned numTmps = m_code.numTmps(type);
-        unsigned arraySize = AbsoluteTmpMapper&lt;type&gt;::absoluteIndex(numTmps);
</del><ins>+        unsigned numTmps = m_code.numTmps(bank);
+        unsigned arraySize = AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(numTmps);
</ins><span class="cx"> 
</span><span class="cx">         Vector&lt;Range, 0, UnsafeVectorOverflow&gt; ranges;
</span><span class="cx">         ranges.fill(Range(), arraySize);
</span><span class="lines">@@ -1883,13 +1883,13 @@
</span><span class="cx">         unsigned globalIndex = 0;
</span><span class="cx">         for (BasicBlock* block : m_code) {
</span><span class="cx">             for (Inst&amp; inst : *block) {
</span><del>-                inst.forEachArg([&amp;] (Arg&amp; arg, Arg::Role, Arg::Type argType, Arg::Width) {
</del><ins>+                inst.forEachArg([&amp;] (Arg&amp; arg, Arg::Role, Bank argBank, Width) {
</ins><span class="cx">                     if (arg.isTmp() &amp;&amp; inst.admitsStack(arg)) {
</span><del>-                        if (argType != type)
</del><ins>+                        if (argBank != bank)
</ins><span class="cx">                             return;
</span><span class="cx"> 
</span><span class="cx">                         Tmp tmp = arg.tmp();
</span><del>-                        Range&amp; range = ranges[AbsoluteTmpMapper&lt;type&gt;::absoluteIndex(tmp)];
</del><ins>+                        Range&amp; range = ranges[AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(tmp)];
</ins><span class="cx">                         range.count++;
</span><span class="cx">                         range.admitStackCount++;
</span><span class="cx">                         if (globalIndex &lt; range.first) {
</span><span class="lines">@@ -1902,10 +1902,10 @@
</span><span class="cx">                     }
</span><span class="cx"> 
</span><span class="cx">                     arg.forEachTmpFast([&amp;] (Tmp&amp; tmp) {
</span><del>-                        if (tmp.isGP() != (type == Arg::GP))
</del><ins>+                        if (tmp.isGP() != (bank == GP))
</ins><span class="cx">                             return;
</span><span class="cx"> 
</span><del>-                        Range&amp; range = ranges[AbsoluteTmpMapper&lt;type&gt;::absoluteIndex(tmp)];
</del><ins>+                        Range&amp; range = ranges[AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(tmp)];
</ins><span class="cx">                         range.count++;
</span><span class="cx">                         if (globalIndex &lt; range.first) {
</span><span class="cx">                             range.first = globalIndex;
</span><span class="lines">@@ -1919,7 +1919,7 @@
</span><span class="cx">             }
</span><span class="cx">             ++globalIndex;
</span><span class="cx">         }
</span><del>-        for (unsigned i = AbsoluteTmpMapper&lt;type&gt;::lastMachineRegisterIndex() + 1; i &lt; ranges.size(); ++i) {
</del><ins>+        for (unsigned i = AbsoluteTmpMapper&lt;bank&gt;::lastMachineRegisterIndex() + 1; i &lt; ranges.size(); ++i) {
</ins><span class="cx">             Range&amp; range = ranges[i];
</span><span class="cx">             if (range.last - range.first &lt;= 1 &amp;&amp; range.count &gt; range.admitStackCount)
</span><span class="cx">                 unspillableTmps.add(i);
</span><span class="lines">@@ -1928,7 +1928,7 @@
</span><span class="cx">         return unspillableTmps;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template&lt;Arg::Type type, typename AllocatorType&gt;
</del><ins>+    template&lt;Bank bank, typename AllocatorType&gt;
</ins><span class="cx">     void assignRegistersToTmp(const AllocatorType&amp; allocator)
</span><span class="cx">     {
</span><span class="cx">         for (BasicBlock* block : m_code) {
</span><span class="lines">@@ -1944,15 +1944,15 @@
</span><span class="cx">                 // equivalent if the destination's high bits are not observable or if the source's high
</span><span class="cx">                 // bits are all zero. Note that we don't have the opposite optimization for other
</span><span class="cx">                 // architectures, which may prefer Move over Move32, because Move is canonical already.
</span><del>-                if (type == Arg::GP &amp;&amp; inst.kind.opcode == Move
</del><ins>+                if (bank == GP &amp;&amp; inst.kind.opcode == Move
</ins><span class="cx">                     &amp;&amp; inst.args[0].isTmp() &amp;&amp; inst.args[1].isTmp()) {
</span><del>-                    if (m_tmpWidth.useWidth(inst.args[1].tmp()) &lt;= Arg::Width32
-                        || m_tmpWidth.defWidth(inst.args[0].tmp()) &lt;= Arg::Width32)
</del><ins>+                    if (m_tmpWidth.useWidth(inst.args[1].tmp()) &lt;= Width32
+                        || m_tmpWidth.defWidth(inst.args[0].tmp()) &lt;= Width32)
</ins><span class="cx">                         inst.kind.opcode = Move32;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 inst.forEachTmpFast([&amp;] (Tmp&amp; tmp) {
</span><del>-                    if (tmp.isReg() || tmp.isGP() == (type != Arg::GP))
</del><ins>+                    if (tmp.isReg() || tmp.isGP() == (bank != GP))
</ins><span class="cx">                         return;
</span><span class="cx"> 
</span><span class="cx">                     Tmp aliasTmp = allocator.getAlias(tmp);
</span><span class="lines">@@ -1980,18 +1980,18 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static unsigned stackSlotMinimumWidth(Arg::Width width)
</del><ins>+    static unsigned stackSlotMinimumWidth(Width width)
</ins><span class="cx">     {
</span><del>-        return width &lt;= Arg::Width32 ? 4 : 8;
</del><ins>+        return width &lt;= Width32 ? 4 : 8;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template&lt;Arg::Type type, typename AllocatorType&gt;
</del><ins>+    template&lt;Bank bank, typename AllocatorType&gt;
</ins><span class="cx">     void addSpillAndFill(const AllocatorType&amp; allocator, HashSet&lt;unsigned&gt;&amp; unspillableTmps)
</span><span class="cx">     {
</span><span class="cx">         HashMap&lt;Tmp, StackSlot*&gt; stackSlots;
</span><span class="cx">         for (Tmp tmp : allocator.spilledTmps()) {
</span><span class="cx">             // All the spilled values become unspillable.
</span><del>-            unspillableTmps.add(AbsoluteTmpMapper&lt;type&gt;::absoluteIndex(tmp));
</del><ins>+            unspillableTmps.add(AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(tmp));
</ins><span class="cx"> 
</span><span class="cx">             // Allocate stack slot for each spilled value.
</span><span class="cx">             StackSlot* stackSlot = m_code.addStackSlot(
</span><span class="lines">@@ -2015,18 +2015,18 @@
</span><span class="cx">                 // Move is the canonical way to move data between GPRs.
</span><span class="cx">                 bool canUseMove32IfDidSpill = false;
</span><span class="cx">                 bool didSpill = false;
</span><del>-                if (type == Arg::GP &amp;&amp; inst.kind.opcode == Move) {
-                    if ((inst.args[0].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[0].tmp()) &lt;= Arg::Width32)
-                        || (inst.args[1].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[1].tmp()) &lt;= Arg::Width32))
</del><ins>+                if (bank == GP &amp;&amp; inst.kind.opcode == Move) {
+                    if ((inst.args[0].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[0].tmp()) &lt;= Width32)
+                        || (inst.args[1].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[1].tmp()) &lt;= Width32))
</ins><span class="cx">                         canUseMove32IfDidSpill = true;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 // Try to replace the register use by memory use when possible.
</span><span class="cx">                 inst.forEachArg(
</span><del>-                    [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type argType, Arg::Width width) {
</del><ins>+                    [&amp;] (Arg&amp; arg, Arg::Role role, Bank argBank, Width width) {
</ins><span class="cx">                         if (!arg.isTmp())
</span><span class="cx">                             return;
</span><del>-                        if (argType != type)
</del><ins>+                        if (argBank != bank)
</ins><span class="cx">                             return;
</span><span class="cx">                         if (arg.isReg())
</span><span class="cx">                             return;
</span><span class="lines">@@ -2047,16 +2047,16 @@
</span><span class="cx">                                 return;
</span><span class="cx">                         }
</span><span class="cx">                         
</span><del>-                        Arg::Width spillWidth = m_tmpWidth.requiredWidth(arg.tmp());
</del><ins>+                        Width spillWidth = m_tmpWidth.requiredWidth(arg.tmp());
</ins><span class="cx">                         if (Arg::isAnyDef(role) &amp;&amp; width &lt; spillWidth)
</span><span class="cx">                             return;
</span><span class="cx">                         ASSERT(inst.kind.opcode == Move || !(Arg::isAnyUse(role) &amp;&amp; width &gt; spillWidth));
</span><span class="cx">                         
</span><del>-                        if (spillWidth != Arg::Width32)
</del><ins>+                        if (spillWidth != Width32)
</ins><span class="cx">                             canUseMove32IfDidSpill = false;
</span><span class="cx">                         
</span><span class="cx">                         stackSlotEntry-&gt;value-&gt;ensureSize(
</span><del>-                            canUseMove32IfDidSpill ? 4 : Arg::bytes(width));
</del><ins>+                            canUseMove32IfDidSpill ? 4 : bytes(width));
</ins><span class="cx">                         arg = Arg::stack(stackSlotEntry-&gt;value);
</span><span class="cx">                         didSpill = true;
</span><span class="cx">                     });
</span><span class="lines">@@ -2065,8 +2065,8 @@
</span><span class="cx">                     inst.kind.opcode = Move32;
</span><span class="cx"> 
</span><span class="cx">                 // For every other case, add Load/Store as needed.
</span><del>-                inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type argType, Arg::Width) {
-                    if (tmp.isReg() || argType != type)
</del><ins>+                inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Bank argBank, Width) {
+                    if (tmp.isReg() || argBank != bank)
</ins><span class="cx">                         return;
</span><span class="cx"> 
</span><span class="cx">                     auto stackSlotEntry = stackSlots.find(tmp);
</span><span class="lines">@@ -2079,14 +2079,14 @@
</span><span class="cx">                         return;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><del>-                    Arg::Width spillWidth = m_tmpWidth.requiredWidth(tmp);
</del><ins>+                    Width spillWidth = m_tmpWidth.requiredWidth(tmp);
</ins><span class="cx">                     Opcode move = Oops;
</span><span class="cx">                     switch (stackSlotMinimumWidth(spillWidth)) {
</span><span class="cx">                     case 4:
</span><del>-                        move = type == Arg::GP ? Move32 : MoveFloat;
</del><ins>+                        move = bank == GP ? Move32 : MoveFloat;
</ins><span class="cx">                         break;
</span><span class="cx">                     case 8:
</span><del>-                        move = type == Arg::GP ? Move : MoveDouble;
</del><ins>+                        move = bank == GP ? Move : MoveDouble;
</ins><span class="cx">                         break;
</span><span class="cx">                     default:
</span><span class="cx">                         RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -2093,8 +2093,8 @@
</span><span class="cx">                         break;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><del>-                    tmp = m_code.newTmp(type);
-                    unspillableTmps.add(AbsoluteTmpMapper&lt;type&gt;::absoluteIndex(tmp));
</del><ins>+                    tmp = m_code.newTmp(bank);
+                    unspillableTmps.add(AbsoluteTmpMapper&lt;bank&gt;::absoluteIndex(tmp));
</ins><span class="cx"> 
</span><span class="cx">                     Arg arg = Arg::stack(stackSlotEntry-&gt;value);
</span><span class="cx">                     if (Arg::isAnyUse(role) &amp;&amp; role != Arg::Scratch)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirAllocateStackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirAllocateStack.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirAllocateStack.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirAllocateStack.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -134,7 +134,7 @@
</span><span class="cx"> 
</span><span class="cx">             Inst::forEachDef&lt;Arg&gt;(
</span><span class="cx">                 block-&gt;get(instIndex), block-&gt;get(instIndex + 1),
</span><del>-                [&amp;] (Arg&amp; arg, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+                [&amp;] (Arg&amp; arg, Arg::Role, Bank, Width) {
</ins><span class="cx">                     if (!arg.isStack())
</span><span class="cx">                         return;
</span><span class="cx">                     StackSlot* slot = arg.stackSlot();
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx">             if (!inst.hasNonArgEffects()) {
</span><span class="cx">                 bool ok = true;
</span><span class="cx">                 inst.forEachArg(
</span><del>-                    [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+                    [&amp;] (Arg&amp; arg, Arg::Role role, Bank, Width) {
</ins><span class="cx">                         if (Arg::isEarlyDef(role)) {
</span><span class="cx">                             ok = false;
</span><span class="cx">                             return;
</span><span class="lines">@@ -262,7 +262,7 @@
</span><span class="cx">         for (unsigned instIndex = 0; instIndex &lt; block-&gt;size(); ++instIndex) {
</span><span class="cx">             Inst&amp; inst = block-&gt;at(instIndex);
</span><span class="cx">             inst.forEachArg(
</span><del>-                [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type, Arg::Width width) {
</del><ins>+                [&amp;] (Arg&amp; arg, Arg::Role role, Bank, Width width) {
</ins><span class="cx">                     auto stackAddr = [&amp;] (int32_t offset) -&gt; Arg {
</span><span class="cx">                         return Arg::stackAddr(offset, code.frameSize(), width);
</span><span class="cx">                     };
</span><span class="lines">@@ -272,13 +272,13 @@
</span><span class="cx">                         StackSlot* slot = arg.stackSlot();
</span><span class="cx">                         if (Arg::isZDef(role)
</span><span class="cx">                             &amp;&amp; slot-&gt;kind() == StackSlotKind::Spill
</span><del>-                            &amp;&amp; slot-&gt;byteSize() &gt; Arg::bytes(width)) {
</del><ins>+                            &amp;&amp; slot-&gt;byteSize() &gt; bytes(width)) {
</ins><span class="cx">                             // Currently we only handle this simple case because it's the only one
</span><span class="cx">                             // that arises: ZDef's are only 32-bit right now. So, when we hit these
</span><span class="cx">                             // assertions it means that we need to implement those other kinds of
</span><span class="cx">                             // zero fills.
</span><span class="cx">                             RELEASE_ASSERT(slot-&gt;byteSize() == 8);
</span><del>-                            RELEASE_ASSERT(width == Arg::Width32);
</del><ins>+                            RELEASE_ASSERT(width == Width32);
</ins><span class="cx"> 
</span><span class="cx">                             RELEASE_ASSERT(isValidForm(StoreZero32, Arg::Stack));
</span><span class="cx">                             insertionSet.insert(
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirArgcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirArg.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirArg.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirArg.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -73,15 +73,15 @@
</span><span class="cx"> 
</span><span class="cx"> bool Arg::canRepresent(Value* value) const
</span><span class="cx"> {
</span><del>-    return isType(typeForB3Type(value-&gt;type()));
</del><ins>+    return isBank(bankForType(value-&gt;type()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Arg::isCompatibleType(const Arg&amp; other) const
</del><ins>+bool Arg::isCompatibleBank(const Arg&amp; other) const
</ins><span class="cx"> {
</span><del>-    if (hasType())
-        return other.isType(type());
-    if (other.hasType())
-        return isType(other.type());
</del><ins>+    if (hasBank())
+        return other.isBank(bank());
+    if (other.hasBank())
+        return isBank(other.bank());
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -293,40 +293,6 @@
</span><span class="cx">     RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void printInternal(PrintStream&amp; out, Arg::Type type)
-{
-    switch (type) {
-    case Arg::GP:
-        out.print(&quot;GP&quot;);
-        return;
-    case Arg::FP:
-        out.print(&quot;FP&quot;);
-        return;
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-}
-
-void printInternal(PrintStream&amp; out, Arg::Width width)
-{
-    switch (width) {
-    case Arg::Width8:
-        out.print(&quot;8&quot;);
-        return;
-    case Arg::Width16:
-        out.print(&quot;16&quot;);
-        return;
-    case Arg::Width32:
-        out.print(&quot;32&quot;);
-        return;
-    case Arg::Width64:
-        out.print(&quot;64&quot;);
-        return;
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-}
-
</del><span class="cx"> void printInternal(PrintStream&amp; out, Arg::Signedness signedness)
</span><span class="cx"> {
</span><span class="cx">     switch (signedness) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirArgh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirArg.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirArg.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirArg.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,8 +28,10 @@
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AirTmp.h&quot;
</span><ins>+#include &quot;B3Bank.h&quot;
</ins><span class="cx"> #include &quot;B3Common.h&quot;
</span><span class="cx"> #include &quot;B3Type.h&quot;
</span><ins>+#include &quot;B3Width.h&quot;
</ins><span class="cx"> #include &lt;wtf/Optional.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if COMPILER(GCC) &amp;&amp; ASSERT_DISABLED
</span><span class="lines">@@ -162,34 +164,6 @@
</span><span class="cx">         UseAddr
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    enum Type : int8_t {
-        GP,
-        FP
-    };
-
-    static const unsigned numTypes = 2;
-
-    template&lt;typename Functor&gt;
-    static void forEachType(const Functor&amp; functor)
-    {
-        functor(GP);
-        functor(FP);
-    }
-
-    enum Width : int8_t {
-        Width8,
-        Width16,
-        Width32,
-        Width64
-    };
-
-    static Width pointerWidth()
-    {
-        if (sizeof(void*) == 8)
-            return Width64;
-        return Width32;
-    }
-
</del><span class="cx">     enum Signedness : int8_t {
</span><span class="cx">         Signed,
</span><span class="cx">         Unsigned
</span><span class="lines">@@ -389,70 +363,6 @@
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static Type typeForB3Type(B3::Type type)
-    {
-        switch (type) {
-        case Void:
-            ASSERT_NOT_REACHED();
-            return GP;
-        case Int32:
-        case Int64:
-            return GP;
-        case Float:
-        case Double:
-            return FP;
-        }
-        ASSERT_NOT_REACHED();
-        return GP;
-    }
-
-    static Width widthForB3Type(B3::Type type)
-    {
-        switch (type) {
-        case Void:
-            ASSERT_NOT_REACHED();
-            return Width8;
-        case Int32:
-        case Float:
-            return Width32;
-        case Int64:
-        case Double:
-            return Width64;
-        }
-        ASSERT_NOT_REACHED();
-    }
-
-    static Width conservativeWidth(Type type)
-    {
-        return type == GP ? pointerWidth() : Width64;
-    }
-
-    static Width minimumWidth(Type type)
-    {
-        return type == GP ? Width8 : Width32;
-    }
-
-    static unsigned bytes(Width width)
-    {
-        return 1 &lt;&lt; width;
-    }
-
-    static Width widthForBytes(unsigned bytes)
-    {
-        switch (bytes) {
-        case 0:
-        case 1:
-            return Width8;
-        case 2:
-            return Width16;
-        case 3:
-        case 4:
-            return Width32;
-        default:
-            return Width64;
-        }
-    }
-
</del><span class="cx">     Arg()
</span><span class="cx">         : m_kind(Invalid)
</span><span class="cx">     {
</span><span class="lines">@@ -978,7 +888,7 @@
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool hasType() const
</del><ins>+    bool hasBank() const
</ins><span class="cx">     {
</span><span class="cx">         switch (kind()) {
</span><span class="cx">         case Imm:
</span><span class="lines">@@ -993,14 +903,14 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // The type is ambiguous for some arg kinds. Call with care.
</span><del>-    Type type() const
</del><ins>+    Bank bank() const
</ins><span class="cx">     {
</span><span class="cx">         return isGP() ? GP : FP;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isType(Type type) const
</del><ins>+    bool isBank(Bank bank) const
</ins><span class="cx">     {
</span><del>-        switch (type) {
</del><ins>+        switch (bank) {
</ins><span class="cx">         case GP:
</span><span class="cx">             return isGP();
</span><span class="cx">         case FP:
</span><span class="lines">@@ -1011,7 +921,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool canRepresent(Value* value) const;
</span><span class="cx"> 
</span><del>-    bool isCompatibleType(const Arg&amp; other) const;
</del><ins>+    bool isCompatibleBank(const Arg&amp; other) const;
</ins><span class="cx"> 
</span><span class="cx">     bool isGPR() const
</span><span class="cx">     {
</span><span class="lines">@@ -1184,7 +1094,7 @@
</span><span class="cx">     void forEachFast(const Functor&amp;);
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename Thing, typename Functor&gt;
</span><del>-    void forEach(Role, Type, Width, const Functor&amp;);
</del><ins>+    void forEach(Role, Bank, Width, const Functor&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // This is smart enough to know that an address arg in a Def or UseDef rule will use its
</span><span class="cx">     // tmps and never def them. For example, this:
</span><span class="lines">@@ -1193,12 +1103,12 @@
</span><span class="cx">     //
</span><span class="cx">     // This defs (%rcx) but uses %rcx.
</span><span class="cx">     template&lt;typename Functor&gt;
</span><del>-    void forEachTmp(Role argRole, Type argType, Width argWidth, const Functor&amp; functor)
</del><ins>+    void forEachTmp(Role argRole, Bank argBank, Width argWidth, const Functor&amp; functor)
</ins><span class="cx">     {
</span><span class="cx">         switch (m_kind) {
</span><span class="cx">         case Tmp:
</span><span class="cx">             ASSERT(isAnyUse(argRole) || isAnyDef(argRole));
</span><del>-            functor(m_base, argRole, argType, argWidth);
</del><ins>+            functor(m_base, argRole, argBank, argWidth);
</ins><span class="cx">             break;
</span><span class="cx">         case Addr:
</span><span class="cx">             functor(m_base, Use, GP, argRole == UseAddr ? argWidth : pointerWidth());
</span><span class="lines">@@ -1359,8 +1269,6 @@
</span><span class="cx"> 
</span><span class="cx"> JS_EXPORT_PRIVATE void printInternal(PrintStream&amp;, JSC::B3::Air::Arg::Kind);
</span><span class="cx"> JS_EXPORT_PRIVATE void printInternal(PrintStream&amp;, JSC::B3::Air::Arg::Role);
</span><del>-JS_EXPORT_PRIVATE void printInternal(PrintStream&amp;, JSC::B3::Air::Arg::Type);
-JS_EXPORT_PRIVATE void printInternal(PrintStream&amp;, JSC::B3::Air::Arg::Width);
</del><span class="cx"> JS_EXPORT_PRIVATE void printInternal(PrintStream&amp;, JSC::B3::Air::Arg::Signedness);
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt; struct DefaultHash;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirArgInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirArgInlines.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirArgInlines.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirArgInlines.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -53,9 +53,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename Functor&gt;
</span><del>-    static void forEach(Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width, const Functor&amp; functor)
</del><ins>+    static void forEach(Arg&amp; arg, Arg::Role role, Bank bank, Width width, const Functor&amp; functor)
</ins><span class="cx">     {
</span><del>-        arg.forEachTmp(role, type, width, functor);
</del><ins>+        arg.forEachTmp(role, bank, width, functor);
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -77,9 +77,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename Functor&gt;
</span><del>-    static void forEach(Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width, const Functor&amp; functor)
</del><ins>+    static void forEach(Arg&amp; arg, Arg::Role role, Bank bank, Width width, const Functor&amp; functor)
</ins><span class="cx">     {
</span><del>-        functor(arg, role, type, width);
</del><ins>+        functor(arg, role, bank, width);
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -106,7 +106,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename Functor&gt;
</span><del>-    static void forEach(Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width, const Functor&amp; functor)
</del><ins>+    static void forEach(Arg&amp; arg, Arg::Role role, Bank bank, Width width, const Functor&amp; functor)
</ins><span class="cx">     {
</span><span class="cx">         if (!arg.isStack())
</span><span class="cx">             return;
</span><span class="lines">@@ -119,7 +119,7 @@
</span><span class="cx">         // semantics of &quot;Anonymous&quot;.
</span><span class="cx">         // https://bugs.webkit.org/show_bug.cgi?id=151128
</span><span class="cx">         
</span><del>-        functor(stackSlot, role, type, width);
</del><ins>+        functor(stackSlot, role, bank, width);
</ins><span class="cx">         arg = Arg::stack(stackSlot, arg.offset());
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -150,16 +150,16 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename Functor&gt;
</span><del>-    static void forEach(Arg&amp; arg, Arg::Role argRole, Arg::Type argType, Arg::Width argWidth, const Functor&amp; functor)
</del><ins>+    static void forEach(Arg&amp; arg, Arg::Role argRole, Bank argBank, Width argWidth, const Functor&amp; functor)
</ins><span class="cx">     {
</span><span class="cx">         arg.forEachTmp(
</span><del>-            argRole, argType, argWidth,
-            [&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type type, Arg::Width width) {
</del><ins>+            argRole, argBank, argWidth,
+            [&amp;] (Tmp&amp; tmp, Arg::Role role, Bank bank, Width width) {
</ins><span class="cx">                 if (!tmp.isReg())
</span><span class="cx">                     return;
</span><span class="cx">                 
</span><span class="cx">                 Reg reg = tmp.reg();
</span><del>-                functor(reg, role, type, width);
</del><ins>+                functor(reg, role, bank, width);
</ins><span class="cx">                 tmp = Tmp(reg);
</span><span class="cx">             });
</span><span class="cx">     }
</span><span class="lines">@@ -184,9 +184,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename Thing, typename Functor&gt;
</span><del>-void Arg::forEach(Role role, Type type, Width width, const Functor&amp; functor)
</del><ins>+void Arg::forEach(Role role, Bank bank, Width width, const Functor&amp; functor)
</ins><span class="cx"> {
</span><del>-    ArgThingHelper&lt;Thing&gt;::forEach(*this, role, type, width, functor);
</del><ins>+    ArgThingHelper&lt;Thing&gt;::forEach(*this, role, bank, width, functor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } } } // namespace JSC::B3::Air
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCCallSpecialcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCCallSpecial.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -48,17 +48,17 @@
</span><span class="cx"> void CCallSpecial::forEachArg(Inst&amp; inst, const ScopedLambda&lt;Inst::EachArgCallback&gt;&amp; callback)
</span><span class="cx"> {
</span><span class="cx">     for (unsigned i = 0; i &lt; numCalleeArgs; ++i)
</span><del>-        callback(inst.args[calleeArgOffset + i], Arg::Use, Arg::GP, Arg::pointerWidth());
</del><ins>+        callback(inst.args[calleeArgOffset + i], Arg::Use, GP, pointerWidth());
</ins><span class="cx">     for (unsigned i = 0; i &lt; numReturnGPArgs; ++i)
</span><del>-        callback(inst.args[returnGPArgOffset + i], Arg::Def, Arg::GP, Arg::pointerWidth());
</del><ins>+        callback(inst.args[returnGPArgOffset + i], Arg::Def, GP, pointerWidth());
</ins><span class="cx">     for (unsigned i = 0; i &lt; numReturnFPArgs; ++i)
</span><del>-        callback(inst.args[returnFPArgOffset + i], Arg::Def, Arg::FP, Arg::Width64);
</del><ins>+        callback(inst.args[returnFPArgOffset + i], Arg::Def, FP, Width64);
</ins><span class="cx">     
</span><span class="cx">     for (unsigned i = argArgOffset; i &lt; inst.args.size(); ++i) {
</span><del>-        // For the type, we can just query the arg's type. The arg will have a type, because we
</del><ins>+        // For the type, we can just query the arg's bank. The arg will have a bank, because we
</ins><span class="cx">         // require these args to be argument registers.
</span><del>-        Arg::Type type = inst.args[i].type();
-        callback(inst.args[i], Arg::Use, type, Arg::conservativeWidth(type));
</del><ins>+        Bank bank = inst.args[i].bank();
+        callback(inst.args[i], Arg::Use, bank, conservativeWidth(bank));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCCallingConventioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCCallingConvention.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCCallingConvention.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCCallingConvention.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -62,10 +62,10 @@
</span><span class="cx"> Arg marshallCCallArgument(
</span><span class="cx">     unsigned&amp; gpArgumentCount, unsigned&amp; fpArgumentCount, unsigned&amp; stackOffset, Value* child)
</span><span class="cx"> {
</span><del>-    switch (Arg::typeForB3Type(child-&gt;type())) {
-    case Arg::GP:
</del><ins>+    switch (bankForType(child-&gt;type())) {
+    case GP:
</ins><span class="cx">         return marshallCCallArgumentImpl&lt;GPRInfo&gt;(gpArgumentCount, stackOffset, child);
</span><del>-    case Arg::FP:
</del><ins>+    case FP:
</ins><span class="cx">         return marshallCCallArgumentImpl&lt;FPRInfo&gt;(fpArgumentCount, stackOffset, child);
</span><span class="cx">     }
</span><span class="cx">     RELEASE_ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCode.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCode.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCode.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -41,10 +41,10 @@
</span><span class="cx">     , m_lastPhaseName(&quot;initial&quot;)
</span><span class="cx"> {
</span><span class="cx">     // Come up with initial orderings of registers. The user may replace this with something else.
</span><del>-    Arg::forEachType(
-        [&amp;] (Arg::Type type) {
</del><ins>+    forEachBank(
+        [&amp;] (Bank bank) {
</ins><span class="cx">             Vector&lt;Reg&gt; result;
</span><del>-            RegisterSet all = type == Arg::GP ? RegisterSet::allGPRs() : RegisterSet::allFPRs();
</del><ins>+            RegisterSet all = bank == GP ? RegisterSet::allGPRs() : RegisterSet::allFPRs();
</ins><span class="cx">             all.exclude(RegisterSet::stackRegisters());
</span><span class="cx">             all.exclude(RegisterSet::reservedHardwareRegisters());
</span><span class="cx">             RegisterSet calleeSave = RegisterSet::calleeSaveRegisters();
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">                     if (calleeSave.get(reg))
</span><span class="cx">                         result.append(reg);
</span><span class="cx">                 });
</span><del>-            setRegsInPriorityOrder(type, result);
</del><ins>+            setRegsInPriorityOrder(bank, result);
</ins><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -66,13 +66,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Code::setRegsInPriorityOrder(Arg::Type type, const Vector&lt;Reg&gt;&amp; regs)
</del><ins>+void Code::setRegsInPriorityOrder(Bank bank, const Vector&lt;Reg&gt;&amp; regs)
</ins><span class="cx"> {
</span><del>-    regsInPriorityOrderImpl(type) = regs;
</del><ins>+    regsInPriorityOrderImpl(bank) = regs;
</ins><span class="cx">     m_mutableRegs = RegisterSet();
</span><del>-    Arg::forEachType(
-        [&amp;] (Arg::Type type) {
-            for (Reg reg : regsInPriorityOrder(type))
</del><ins>+    forEachBank(
+        [&amp;] (Bank bank) {
+            for (Reg reg : regsInPriorityOrder(bank))
</ins><span class="cx">                 m_mutableRegs.set(reg);
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="lines">@@ -79,7 +79,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Code::pinRegister(Reg reg)
</span><span class="cx"> {
</span><del>-    Vector&lt;Reg&gt;&amp; regs = regsInPriorityOrderImpl(Arg(Tmp(reg)).type());
</del><ins>+    Vector&lt;Reg&gt;&amp; regs = regsInPriorityOrderImpl(Arg(Tmp(reg)).bank());
</ins><span class="cx">     regs.removeFirst(reg);
</span><span class="cx">     m_mutableRegs.clear(reg);
</span><span class="cx">     ASSERT(!regs.contains(reg));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCode.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCode.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCode.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -69,18 +69,18 @@
</span><span class="cx"> 
</span><span class="cx">     Procedure&amp; proc() { return m_proc; }
</span><span class="cx">     
</span><del>-    const Vector&lt;Reg&gt;&amp; regsInPriorityOrder(Arg::Type type) const
</del><ins>+    const Vector&lt;Reg&gt;&amp; regsInPriorityOrder(Bank bank) const
</ins><span class="cx">     {
</span><del>-        switch (type) {
-        case Arg::GP:
</del><ins>+        switch (bank) {
+        case GP:
</ins><span class="cx">             return m_gpRegsInPriorityOrder;
</span><del>-        case Arg::FP:
</del><ins>+        case FP:
</ins><span class="cx">             return m_fpRegsInPriorityOrder;
</span><span class="cx">         }
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void setRegsInPriorityOrder(Arg::Type, const Vector&lt;Reg&gt;&amp;);
</del><ins>+    void setRegsInPriorityOrder(Bank, const Vector&lt;Reg&gt;&amp;);
</ins><span class="cx">     
</span><span class="cx">     // This is the set of registers that Air is allowed to emit code to mutate. It's derived from
</span><span class="cx">     // regsInPriorityOrder. Any registers not in this set are said to be &quot;pinned&quot;.
</span><span class="lines">@@ -104,23 +104,23 @@
</span><span class="cx">     // This is the special you need to make a C call!
</span><span class="cx">     CCallSpecial* cCallSpecial();
</span><span class="cx"> 
</span><del>-    Tmp newTmp(Arg::Type type)
</del><ins>+    Tmp newTmp(Bank bank)
</ins><span class="cx">     {
</span><del>-        switch (type) {
-        case Arg::GP:
</del><ins>+        switch (bank) {
+        case GP:
</ins><span class="cx">             return Tmp::gpTmpForIndex(m_numGPTmps++);
</span><del>-        case Arg::FP:
</del><ins>+        case FP:
</ins><span class="cx">             return Tmp::fpTmpForIndex(m_numFPTmps++);
</span><span class="cx">         }
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned numTmps(Arg::Type type)
</del><ins>+    unsigned numTmps(Bank bank)
</ins><span class="cx">     {
</span><del>-        switch (type) {
-        case Arg::GP:
</del><ins>+        switch (bank) {
+        case GP:
</ins><span class="cx">             return m_numGPTmps;
</span><del>-        case Arg::FP:
</del><ins>+        case FP:
</ins><span class="cx">             return m_numFPTmps;
</span><span class="cx">         }
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -286,12 +286,12 @@
</span><span class="cx">     
</span><span class="cx">     Code(Procedure&amp;);
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt;&amp; regsInPriorityOrderImpl(Arg::Type type)
</del><ins>+    Vector&lt;Reg&gt;&amp; regsInPriorityOrderImpl(Bank bank)
</ins><span class="cx">     {
</span><del>-        switch (type) {
-        case Arg::GP:
</del><ins>+        switch (bank) {
+        case GP:
</ins><span class="cx">             return m_gpRegsInPriorityOrder;
</span><del>-        case Arg::FP:
</del><ins>+        case FP:
</ins><span class="cx">             return m_fpRegsInPriorityOrder;
</span><span class="cx">         }
</span><span class="cx">         ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCustom.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCustom.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCustom.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">     RegisterSet clobberedLate = inst.extraClobberedRegs();
</span><span class="cx">     bool ok = true;
</span><span class="cx">     inst.forEachTmp(
</span><del>-        [&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+        [&amp;] (Tmp&amp; tmp, Arg::Role role, Bank, Width) {
</ins><span class="cx">             if (!tmp.isReg())
</span><span class="cx">                 return;
</span><span class="cx">             if (Arg::isLateDef(role) || Arg::isLateUse(role))
</span><span class="lines">@@ -138,7 +138,7 @@
</span><span class="cx">             if (arg.isSomeImm())
</span><span class="cx">                 continue;
</span><span class="cx"> 
</span><del>-            if (!arg.isCompatibleType(inst.args[i + 1]))
</del><ins>+            if (!arg.isCompatibleBank(inst.args[i + 1]))
</ins><span class="cx">                 return false;
</span><span class="cx">         } else {
</span><span class="cx">             ASSERT(mode == 1);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirCustom.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirCustom.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirCustom.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">     {
</span><span class="cx">         // This is basically bogus, but it works for analyses that model Special as an
</span><span class="cx">         // immediate.
</span><del>-        functor(inst.args[0], Arg::Use, Arg::GP, Arg::pointerWidth());
</del><ins>+        functor(inst.args[0], Arg::Use, GP, pointerWidth());
</ins><span class="cx">         
</span><span class="cx">         inst.args[0].special()-&gt;forEachArg(inst, scopedLambda&lt;Inst::EachArgCallback&gt;(functor));
</span><span class="cx">     }
</span><span class="lines">@@ -128,13 +128,13 @@
</span><span class="cx"> 
</span><span class="cx">         unsigned index = 0;
</span><span class="cx"> 
</span><del>-        functor(inst.args[index++], Arg::Use, Arg::GP, Arg::pointerWidth()); // callee
</del><ins>+        functor(inst.args[index++], Arg::Use, GP, pointerWidth()); // callee
</ins><span class="cx">         
</span><span class="cx">         if (value-&gt;type() != Void) {
</span><span class="cx">             functor(
</span><span class="cx">                 inst.args[index++], Arg::Def,
</span><del>-                Arg::typeForB3Type(value-&gt;type()),
-                Arg::widthForB3Type(value-&gt;type()));
</del><ins>+                bankForType(value-&gt;type()),
+                widthForType(value-&gt;type()));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         for (unsigned i = 1; i &lt; value-&gt;numChildren(); ++i) {
</span><span class="lines">@@ -141,8 +141,8 @@
</span><span class="cx">             Value* child = value-&gt;child(i);
</span><span class="cx">             functor(
</span><span class="cx">                 inst.args[index++], Arg::Use,
</span><del>-                Arg::typeForB3Type(child-&gt;type()),
-                Arg::widthForB3Type(child-&gt;type()));
</del><ins>+                bankForType(child-&gt;type()),
+                widthForType(child-&gt;type()));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -180,8 +180,8 @@
</span><span class="cx">         // This is just like a call, but uses become cold.
</span><span class="cx">         CCallCustom::forEachArg(
</span><span class="cx">             inst,
</span><del>-            [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width) {
-                functor(arg, Arg::cooled(role), type, width);
</del><ins>+            [&amp;] (Arg&amp; arg, Arg::Role role, Bank bank, Width width) {
+                functor(arg, Arg::cooled(role), bank, width);
</ins><span class="cx">             });
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -195,11 +195,11 @@
</span><span class="cx">             Arg&amp; src = inst.args[i + 0];
</span><span class="cx">             Arg&amp; dst = inst.args[i + 1];
</span><span class="cx">             Arg&amp; widthArg = inst.args[i + 2];
</span><del>-            Arg::Width width = widthArg.width();
-            Arg::Type type = src.isGP() &amp;&amp; dst.isGP() ? Arg::GP : Arg::FP;
-            functor(src, Arg::Use, type, width);
-            functor(dst, Arg::Def, type, width);
-            functor(widthArg, Arg::Use, Arg::GP, Arg::Width8);
</del><ins>+            Width width = widthArg.width();
+            Bank bank = src.isGP() &amp;&amp; dst.isGP() ? GP : FP;
+            functor(src, Arg::Use, bank, width);
+            functor(dst, Arg::Def, bank, width);
+            functor(widthArg, Arg::Use, GP, Width8);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -280,8 +280,8 @@
</span><span class="cx">     template&lt;typename Func&gt;
</span><span class="cx">     static void forEachArg(Inst&amp; inst, const Func&amp; functor)
</span><span class="cx">     {
</span><del>-        functor(inst.args[0], Arg::Use, Arg::GP, Arg::Width64);
-        functor(inst.args[1], Arg::Use, Arg::GP, Arg::Width64);
</del><ins>+        functor(inst.args[0], Arg::Use, GP, Width64);
+        functor(inst.args[1], Arg::Use, GP, Width64);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename... Arguments&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirDumpAsJScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirDumpAsJS.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirDumpAsJS.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirDumpAsJS.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -60,9 +60,9 @@
</span><span class="cx">     return toCString(&quot;Reg.&quot;, reg.debugName());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CString varNameForTmpWithTypeAndIndex(Arg::Type type, unsigned index)
</del><ins>+CString varNameForTmpWithBankAndIndex(Bank bank, unsigned index)
</ins><span class="cx"> {
</span><del>-    return toCString(type == Arg::FP ? &quot;f&quot; : &quot;&quot;, &quot;tmp&quot;, index);
</del><ins>+    return toCString(bank == FP ? &quot;f&quot; : &quot;&quot;, &quot;tmp&quot;, index);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CString varName(Tmp tmp)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (tmp.isReg())
</span><span class="cx">         return varName(tmp.reg());
</span><del>-    return varNameForTmpWithTypeAndIndex(Arg(tmp).type(), tmp.tmpIndex());
</del><ins>+    return varNameForTmpWithBankAndIndex(Arg(tmp).bank(), tmp.tmpIndex());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // anonymous namespace
</span><span class="lines">@@ -96,11 +96,11 @@
</span><span class="cx">             out.println(&quot;code.addStackSlot(1, Spill);&quot;);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    Arg::forEachType(
-        [&amp;] (Arg::Type type) {
-            for (unsigned i = code.numTmps(type); i--;) {
</del><ins>+    forEachBank(
+        [&amp;] (Bank bank) {
+            for (unsigned i = code.numTmps(bank); i--;) {
</ins><span class="cx">                 out.println(
</span><del>-                    &quot;let &quot;, varNameForTmpWithTypeAndIndex(type, i), &quot; = code.newTmp(&quot;, type, &quot;);&quot;);
</del><ins>+                    &quot;let &quot;, varNameForTmpWithBankAndIndex(bank, i), &quot; = code.newTmp(&quot;, bank, &quot;);&quot;);
</ins><span class="cx">             }
</span><span class="cx">         });
</span><span class="cx">     
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx">             out.println(&quot;inst = new Inst(&quot;, inst.kind.opcode, &quot;);&quot;);
</span><span class="cx">             
</span><span class="cx">             inst.forEachArg(
</span><del>-                [&amp;] (Arg&amp; arg, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+                [&amp;] (Arg&amp; arg, Arg::Role, Bank, Width) {
</ins><span class="cx">                     switch (arg.kind()) {
</span><span class="cx">                     case Arg::Invalid:
</span><span class="cx">                         RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -216,9 +216,9 @@
</span><span class="cx">                 
</span><span class="cx">                 out.println(&quot;inst.patchArgData = [];&quot;);
</span><span class="cx">                 inst.forEachArg(
</span><del>-                    [&amp;] (Arg&amp;, Arg::Role role, Arg::Type type, Arg::Width width) {
</del><ins>+                    [&amp;] (Arg&amp;, Arg::Role role, Bank bank, Width width) {
</ins><span class="cx">                         out.println(
</span><del>-                            &quot;inst.patchArgData.push({role: Arg.&quot;, role, &quot;, type: &quot;, type,
</del><ins>+                            &quot;inst.patchArgData.push({role: Arg.&quot;, role, &quot;, type: &quot;, bank,
</ins><span class="cx">                             &quot;, width: &quot;, width, &quot;});&quot;);
</span><span class="cx">                     });
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirEliminateDeadCodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirEliminateDeadCode.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirEliminateDeadCode.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirEliminateDeadCode.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx">         // This instruction should be presumed dead, if its Args are all dead.
</span><span class="cx">         bool storesToLive = false;
</span><span class="cx">         inst.forEachArg(
</span><del>-            [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+            [&amp;] (Arg&amp; arg, Arg::Role role, Bank, Width) {
</ins><span class="cx">                 if (!Arg::isAnyDef(role))
</span><span class="cx">                     return;
</span><span class="cx">                 if (role == Arg::Scratch)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirEmitShufflecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -40,8 +40,8 @@
</span><span class="cx"> bool verbose = false;
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename Functor&gt;
</span><del>-Tmp findPossibleScratch(Code&amp; code, Arg::Type type, const Functor&amp; functor) {
-    for (Reg reg : code.regsInPriorityOrder(type)) {
</del><ins>+Tmp findPossibleScratch(Code&amp; code, Bank bank, const Functor&amp; functor) {
+    for (Reg reg : code.regsInPriorityOrder(bank)) {
</ins><span class="cx">         Tmp tmp(reg);
</span><span class="cx">         if (functor(tmp))
</span><span class="cx">             return tmp;
</span><span class="lines">@@ -49,9 +49,9 @@
</span><span class="cx">     return Tmp();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Tmp findPossibleScratch(Code&amp; code, Arg::Type type, const Arg&amp; arg1, const Arg&amp; arg2) {
</del><ins>+Tmp findPossibleScratch(Code&amp; code, Bank bank, const Arg&amp; arg1, const Arg&amp; arg2) {
</ins><span class="cx">     return findPossibleScratch(
</span><del>-        code, type,
</del><ins>+        code, bank,
</ins><span class="cx">         [&amp;] (Tmp tmp) -&gt; bool {
</span><span class="cx">             return !arg1.usesTmp(tmp) &amp;&amp; !arg2.usesTmp(tmp);
</span><span class="cx">         });
</span><span class="lines">@@ -79,7 +79,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;Inst&gt; emitShuffle(
</span><del>-    Code&amp; code, Vector&lt;ShufflePair&gt; pairs, std::array&lt;Arg, 2&gt; scratches, Arg::Type type,
</del><ins>+    Code&amp; code, Vector&lt;ShufflePair&gt; pairs, std::array&lt;Arg, 2&gt; scratches, Bank bank,
</ins><span class="cx">     Value* origin)
</span><span class="cx"> {
</span><span class="cx">     if (verbose) {
</span><span class="lines">@@ -96,8 +96,8 @@
</span><span class="cx">     // First validate that this is the kind of shuffle that we know how to deal with.
</span><span class="cx"> #if !ASSERT_DISABLED
</span><span class="cx">     for (const ShufflePair&amp; pair : pairs) {
</span><del>-        ASSERT(pair.src().isType(type));
-        ASSERT(pair.dst().isType(type));
</del><ins>+        ASSERT(pair.src().isBank(bank));
+        ASSERT(pair.dst().isBank(bank));
</ins><span class="cx">         ASSERT(pair.dst().isTmp() || pair.dst().isMemory());
</span><span class="cx">     }
</span><span class="cx"> #endif // !ASSERT_DISABLED
</span><span class="lines">@@ -260,18 +260,18 @@
</span><span class="cx">     // Lucky for us, we are guaranteed to have extra scratch registers anytime we have a Shift that
</span><span class="cx">     // ends with a register. We search for such a register right now.
</span><span class="cx"> 
</span><del>-    auto moveForWidth = [&amp;] (Arg::Width width) -&gt; Opcode {
</del><ins>+    auto moveForWidth = [&amp;] (Width width) -&gt; Opcode {
</ins><span class="cx">         switch (width) {
</span><del>-        case Arg::Width32:
-            return type == Arg::GP ? Move32 : MoveFloat;
-        case Arg::Width64:
-            return type == Arg::GP ? Move : MoveDouble;
</del><ins>+        case Width32:
+            return bank == GP ? Move32 : MoveFloat;
+        case Width64:
+            return bank == GP ? Move : MoveDouble;
</ins><span class="cx">         default:
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    Opcode conservativeMove = moveForWidth(Arg::conservativeWidth(type));
</del><ins>+    Opcode conservativeMove = moveForWidth(conservativeWidth(bank));
</ins><span class="cx"> 
</span><span class="cx">     // We will emit things in reverse. We maintain a list of packs of instructions, and then we emit
</span><span class="cx">     // append them together in reverse (for example the thing at the end of resultPacks is placed
</span><span class="lines">@@ -304,7 +304,7 @@
</span><span class="cx">         
</span><span class="cx">         if (!isValidForm(move, pair.src().kind(), pair.dst().kind())) {
</span><span class="cx">             Tmp scratch =
</span><del>-                getScratch(scratchIndex, findPossibleScratch(code, type, pair.src(), pair.dst()));
</del><ins>+                getScratch(scratchIndex, findPossibleScratch(code, bank, pair.src(), pair.dst()));
</ins><span class="cx">             RELEASE_ASSERT(scratch);
</span><span class="cx">             if (isValidForm(move, pair.src().kind(), Arg::Tmp))
</span><span class="cx">                 result.append(Inst(moveForWidth(pair.width()), origin, pair.src(), scratch));
</span><span class="lines">@@ -373,24 +373,24 @@
</span><span class="cx">         
</span><span class="cx">         bool canSwap = false;
</span><span class="cx">         Opcode swap = Oops;
</span><del>-        Arg::Width swapWidth = Arg::Width8; // bogus value
</del><ins>+        Width swapWidth = Width8; // bogus value
</ins><span class="cx"> 
</span><span class="cx">         // Currently, the swap instruction is not available for floating point on any architecture we
</span><span class="cx">         // support.
</span><del>-        if (type == Arg::GP) {
</del><ins>+        if (bank == GP) {
</ins><span class="cx">             // Figure out whether we will be doing 64-bit swaps or 32-bit swaps. If we have a mix of
</span><span class="cx">             // widths we handle that by fixing up the relevant register with zero-extends.
</span><span class="cx">             swap = Swap32;
</span><del>-            swapWidth = Arg::Width32;
</del><ins>+            swapWidth = Width32;
</ins><span class="cx">             bool hasMemory = false;
</span><span class="cx">             bool hasIndex = false;
</span><span class="cx">             for (ShufflePair&amp; pair : rotate.loop) {
</span><span class="cx">                 switch (pair.width()) {
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     break;
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     swap = Swap64;
</span><del>-                    swapWidth = Arg::Width64;
</del><ins>+                    swapWidth = Width64;
</ins><span class="cx">                     break;
</span><span class="cx">                 default:
</span><span class="cx">                     RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -436,7 +436,7 @@
</span><span class="cx">                     // Moving data between two spills is rare. To get here a lot of rare stuff has to
</span><span class="cx">                     // all happen at once.
</span><span class="cx">                     
</span><del>-                    Tmp scratch = getScratch(0, findPossibleScratch(code, type, left, right));
</del><ins>+                    Tmp scratch = getScratch(0, findPossibleScratch(code, bank, left, right));
</ins><span class="cx">                     RELEASE_ASSERT(scratch);
</span><span class="cx">                     result.append(Inst(moveForWidth(swapWidth), origin, left, scratch));
</span><span class="cx">                     result.append(Inst(swap, origin, scratch, right));
</span><span class="lines">@@ -455,8 +455,8 @@
</span><span class="cx">                 if (pair.width() == swapWidth)
</span><span class="cx">                     continue;
</span><span class="cx"> 
</span><del>-                RELEASE_ASSERT(pair.width() == Arg::Width32);
-                RELEASE_ASSERT(swapWidth == Arg::Width64);
</del><ins>+                RELEASE_ASSERT(pair.width() == Width32);
+                RELEASE_ASSERT(swapWidth == Width64);
</ins><span class="cx">                 RELEASE_ASSERT(pair.dst().isTmp());
</span><span class="cx"> 
</span><span class="cx">                 // Need to do an extra zero extension.
</span><span class="lines">@@ -470,7 +470,7 @@
</span><span class="cx">             // available register file.
</span><span class="cx"> 
</span><span class="cx">             Tmp scratch = findPossibleScratch(
</span><del>-                code, type,
</del><ins>+                code, bank,
</ins><span class="cx">                 [&amp;] (Tmp tmp) -&gt; bool {
</span><span class="cx">                     for (ShufflePair pair : rotate.loop) {
</span><span class="cx">                         if (pair.src().usesTmp(tmp))
</span><span class="lines">@@ -520,7 +520,7 @@
</span><span class="cx">     Vector&lt;ShufflePair&gt; gpPairs;
</span><span class="cx">     Vector&lt;ShufflePair&gt; fpPairs;
</span><span class="cx">     for (const ShufflePair&amp; pair : pairs) {
</span><del>-        if (pair.src().isMemory() &amp;&amp; pair.dst().isMemory() &amp;&amp; pair.width() &gt; Arg::pointerWidth()) {
</del><ins>+        if (pair.src().isMemory() &amp;&amp; pair.dst().isMemory() &amp;&amp; pair.width() &gt; pointerWidth()) {
</ins><span class="cx">             // 8-byte memory-to-memory moves on a 32-bit platform are best handled as float moves.
</span><span class="cx">             fpPairs.append(pair);
</span><span class="cx">         } else if (pair.src().isGP() &amp;&amp; pair.dst().isGP()) {
</span><span class="lines">@@ -532,8 +532,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;Inst&gt; result;
</span><del>-    result.appendVector(emitShuffle(code, gpPairs, gpScratch, Arg::GP, origin));
-    result.appendVector(emitShuffle(code, fpPairs, fpScratch, Arg::FP, origin));
</del><ins>+    result.appendVector(emitShuffle(code, gpPairs, gpScratch, GP, origin));
+    result.appendVector(emitShuffle(code, fpPairs, fpScratch, FP, origin));
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirEmitShuffleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirEmitShuffle.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    ShufflePair(const Arg&amp; src, const Arg&amp; dst, Arg::Width width)
</del><ins>+    ShufflePair(const Arg&amp; src, const Arg&amp; dst, Width width)
</ins><span class="cx">         : m_src(src)
</span><span class="cx">         , m_dst(dst)
</span><span class="cx">         , m_width(width)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">     // The width determines the kind of move we do. You can only choose Width32 or Width64 right now.
</span><span class="cx">     // For GP, it picks between Move32 and Move. For FP, it picks between MoveFloat and MoveDouble.
</span><del>-    Arg::Width width() const { return m_width; }
</del><ins>+    Width width() const { return m_width; }
</ins><span class="cx"> 
</span><span class="cx">     void dump(PrintStream&amp;) const;
</span><span class="cx">     
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> private:
</span><span class="cx">     Arg m_src;
</span><span class="cx">     Arg m_dst;
</span><del>-    Arg::Width m_width { Arg::Width8 };
</del><ins>+    Width m_width { Width8 };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // Create a Shuffle instruction.
</span><span class="lines">@@ -102,7 +102,7 @@
</span><span class="cx"> // NOTE: Use this method (and its friend below) to emit shuffles after register allocation. Before
</span><span class="cx"> // register allocation it is much better to simply use the Shuffle instruction.
</span><span class="cx"> Vector&lt;Inst&gt; emitShuffle(
</span><del>-    Code&amp; code, Vector&lt;ShufflePair&gt;, std::array&lt;Arg, 2&gt; scratch, Arg::Type, Value* origin);
</del><ins>+    Code&amp; code, Vector&lt;ShufflePair&gt;, std::array&lt;Arg, 2&gt; scratch, Bank, Value* origin);
</ins><span class="cx"> 
</span><span class="cx"> // Perform a shuffle that involves any number of types. Pass scratch registers or memory locations
</span><span class="cx"> // for each type according to the rules above.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirFixObviousSpillscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -115,7 +115,7 @@
</span><span class="cx"> 
</span><span class="cx">         Inst::forEachDefWithExtraClobberedRegs&lt;Arg&gt;(
</span><span class="cx">             &amp;inst, &amp;inst,
</span><del>-            [&amp;] (const Arg&amp; arg, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+            [&amp;] (const Arg&amp; arg, Arg::Role, Bank, Width) {
</ins><span class="cx">                 if (verbose)
</span><span class="cx">                     dataLog(&quot;        Clobbering &quot;, arg, &quot;\n&quot;);
</span><span class="cx">                 m_state.clobber(arg);
</span><span class="lines">@@ -237,7 +237,7 @@
</span><span class="cx">         // information from the liveness analysis. We also can't handle late uses, because we don't
</span><span class="cx">         // look at late clobbers when doing this.
</span><span class="cx">         bool didThings = false;
</span><del>-        auto handleArg = [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type, Arg::Width width) {
</del><ins>+        auto handleArg = [&amp;] (Arg&amp; arg, Arg::Role role, Bank, Width width) {
</ins><span class="cx">             if (!isSpillSlot(arg))
</span><span class="cx">                 return;
</span><span class="cx">             if (!Arg::isEarlyUse(role))
</span><span class="lines">@@ -248,7 +248,7 @@
</span><span class="cx">             // Try to get a register if at all possible.
</span><span class="cx">             if (const RegSlot* alias = m_state.getRegSlot(arg.stackSlot())) {
</span><span class="cx">                 switch (width) {
</span><del>-                case Arg::Width64:
</del><ins>+                case Width64:
</ins><span class="cx">                     if (alias-&gt;mode != RegSlot::AllBits)
</span><span class="cx">                         return;
</span><span class="cx">                     if (verbose)
</span><span class="lines">@@ -256,7 +256,7 @@
</span><span class="cx">                     arg = Tmp(alias-&gt;reg);
</span><span class="cx">                     didThings = true;
</span><span class="cx">                     return;
</span><del>-                case Arg::Width32:
</del><ins>+                case Width32:
</ins><span class="cx">                     if (verbose)
</span><span class="cx">                         dataLog(&quot;    Replacing &quot;, arg, &quot; with &quot;, alias-&gt;reg, &quot; (subwidth case)\n&quot;);
</span><span class="cx">                     arg = Tmp(alias-&gt;reg);
</span><span class="lines">@@ -288,9 +288,9 @@
</span><span class="cx">         inst = instCopy;
</span><span class="cx">         ASSERT(inst.isValidForm());
</span><span class="cx">         inst.forEachArg(
</span><del>-            [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width) {
</del><ins>+            [&amp;] (Arg&amp; arg, Arg::Role role, Bank bank, Width width) {
</ins><span class="cx">                 Arg argCopy = arg;
</span><del>-                handleArg(arg, role, type, width);
</del><ins>+                handleArg(arg, role, bank, width);
</ins><span class="cx">                 if (!inst.isValidForm())
</span><span class="cx">                     arg = argCopy;
</span><span class="cx">             });
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirFixPartialRegisterStallscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirFixPartialRegisterStalls.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirFixPartialRegisterStalls.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirFixPartialRegisterStalls.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+    inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Bank, Width) {
</ins><span class="cx">         ASSERT_WITH_MESSAGE(tmp.isReg(), &quot;This phase must be run after register allocation.&quot;);
</span><span class="cx"> 
</span><span class="cx">         if (tmp.isFPR() &amp;&amp; Arg::isAnyDef(role))
</span><span class="lines">@@ -210,7 +210,7 @@
</span><span class="cx">             if (hasPartialXmmRegUpdate(inst)) {
</span><span class="cx">                 RegisterSet defs;
</span><span class="cx">                 RegisterSet uses;
</span><del>-                inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+                inst.forEachTmp([&amp;] (Tmp&amp; tmp, Arg::Role role, Bank, Width) {
</ins><span class="cx">                     if (tmp.isFPR()) {
</span><span class="cx">                         if (Arg::isAnyDef(role))
</span><span class="cx">                             defs.set(tmp.fpr());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirInstcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirInst.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirInst.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirInst.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> {
</span><span class="cx">     bool result = false;
</span><span class="cx">     forEachArg(
</span><del>-        [&amp;] (Arg&amp;, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+        [&amp;] (Arg&amp;, Arg::Role role, Bank, Width) {
</ins><span class="cx">             if (Arg::isAnyDef(role))
</span><span class="cx">                 result = true;
</span><span class="cx">         });
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirInsth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirInst.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirInst.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirInst.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -105,7 +105,7 @@
</span><span class="cx">             arg.forEachTmpFast(functor);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    typedef void EachArgCallback(Arg&amp;, Arg::Role, Arg::Type, Arg::Width);
</del><ins>+    typedef void EachArgCallback(Arg&amp;, Arg::Role, Bank, Width);
</ins><span class="cx">     
</span><span class="cx">     // Calls the functor with (arg, role, type, width). This function is auto-generated by
</span><span class="cx">     // opcode_generator.rb.
</span><span class="lines">@@ -117,8 +117,8 @@
</span><span class="cx">     void forEachTmp(const Functor&amp; functor)
</span><span class="cx">     {
</span><span class="cx">         forEachArg(
</span><del>-            [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width) {
-                arg.forEachTmp(role, type, width, functor);
</del><ins>+            [&amp;] (Arg&amp; arg, Arg::Role role, Bank bank, Width width) {
+                arg.forEachTmp(role, bank, width, functor);
</ins><span class="cx">             });
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirInstInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -39,8 +39,8 @@
</span><span class="cx"> void Inst::forEach(const Functor&amp; functor)
</span><span class="cx"> {
</span><span class="cx">     forEachArg(
</span><del>-        [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type type, Arg::Width width) {
-            arg.forEach&lt;Thing&gt;(role, type, width, functor);
</del><ins>+        [&amp;] (Arg&amp; arg, Arg::Role role, Bank bank, Width width) {
+            arg.forEach&lt;Thing&gt;(role, bank, width, functor);
</ins><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -61,17 +61,17 @@
</span><span class="cx"> {
</span><span class="cx">     if (prevInst) {
</span><span class="cx">         prevInst-&gt;forEach&lt;Thing&gt;(
</span><del>-            [&amp;] (Thing&amp; thing, Arg::Role role, Arg::Type argType, Arg::Width argWidth) {
</del><ins>+            [&amp;] (Thing&amp; thing, Arg::Role role, Bank argBank, Width argWidth) {
</ins><span class="cx">                 if (Arg::isLateDef(role))
</span><del>-                    functor(thing, role, argType, argWidth);
</del><ins>+                    functor(thing, role, argBank, argWidth);
</ins><span class="cx">             });
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (nextInst) {
</span><span class="cx">         nextInst-&gt;forEach&lt;Thing&gt;(
</span><del>-            [&amp;] (Thing&amp; thing, Arg::Role role, Arg::Type argType, Arg::Width argWidth) {
</del><ins>+            [&amp;] (Thing&amp; thing, Arg::Role role, Bank argBank, Width argWidth) {
</ins><span class="cx">                 if (Arg::isEarlyDef(role))
</span><del>-                    functor(thing, role, argType, argWidth);
</del><ins>+                    functor(thing, role, argBank, argWidth);
</ins><span class="cx">             });
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -85,8 +85,8 @@
</span><span class="cx">     Arg::Role regDefRole;
</span><span class="cx">     
</span><span class="cx">     auto reportReg = [&amp;] (Reg reg) {
</span><del>-        Arg::Type type = reg.isGPR() ? Arg::GP : Arg::FP;
-        functor(Thing(reg), regDefRole, type, Arg::conservativeWidth(type));
</del><ins>+        Bank bank = reg.isGPR() ? GP : FP;
+        functor(Thing(reg), regDefRole, bank, conservativeWidth(bank));
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     if (prevInst &amp;&amp; prevInst-&gt;kind.opcode == Patch) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirLivenessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirLiveness.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirLiveness.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirLiveness.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 { namespace Air {
</span><span class="cx"> 
</span><del>-template&lt;Arg::Type adapterType&gt;
</del><ins>+template&lt;Bank adapterBank&gt;
</ins><span class="cx"> struct TmpLivenessAdapter {
</span><span class="cx">     typedef Tmp Thing;
</span><span class="cx">     typedef HashSet&lt;unsigned&gt; IndexSet;
</span><span class="lines">@@ -48,12 +48,12 @@
</span><span class="cx"> 
</span><span class="cx">     static unsigned numIndices(Code&amp; code)
</span><span class="cx">     {
</span><del>-        unsigned numTmps = code.numTmps(adapterType);
-        return AbsoluteTmpMapper&lt;adapterType&gt;::absoluteIndex(numTmps);
</del><ins>+        unsigned numTmps = code.numTmps(adapterBank);
+        return AbsoluteTmpMapper&lt;adapterBank&gt;::absoluteIndex(numTmps);
</ins><span class="cx">     }
</span><del>-    static bool acceptsType(Arg::Type type) { return type == adapterType; }
-    static unsigned valueToIndex(Tmp tmp) { return AbsoluteTmpMapper&lt;adapterType&gt;::absoluteIndex(tmp); }
-    static Tmp indexToValue(unsigned index) { return AbsoluteTmpMapper&lt;adapterType&gt;::tmpFromAbsoluteIndex(index); }
</del><ins>+    static bool acceptsBank(Bank bank) { return bank == adapterBank; }
+    static unsigned valueToIndex(Tmp tmp) { return AbsoluteTmpMapper&lt;adapterBank&gt;::absoluteIndex(tmp); }
+    static Tmp indexToValue(unsigned index) { return AbsoluteTmpMapper&lt;adapterBank&gt;::tmpFromAbsoluteIndex(index); }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct StackSlotLivenessAdapter {
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">     {
</span><span class="cx">         return code.stackSlots().size();
</span><span class="cx">     }
</span><del>-    static bool acceptsType(Arg::Type) { return true; }
</del><ins>+    static bool acceptsBank(Bank) { return true; }
</ins><span class="cx">     static unsigned valueToIndex(StackSlot* stackSlot) { return stackSlot-&gt;index(); }
</span><span class="cx">     StackSlot* indexToValue(unsigned index) { return m_code.stackSlots()[index]; }
</span><span class="cx"> 
</span><span class="lines">@@ -88,7 +88,7 @@
</span><span class="cx">         return Reg::maxIndex() + 1;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static bool acceptsType(Arg::Type) { return true; }
</del><ins>+    static bool acceptsBank(Bank) { return true; }
</ins><span class="cx">     static unsigned valueToIndex(Reg reg) { return reg.index(); }
</span><span class="cx">     Reg indexToValue(unsigned index) { return Reg::fromIndex(index); }
</span><span class="cx"> };
</span><span class="lines">@@ -110,8 +110,8 @@
</span><span class="cx">             typename Adapter::IndexSet&amp; liveAtTail = m_liveAtTail[block];
</span><span class="cx"> 
</span><span class="cx">             block-&gt;last().forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                    if (Arg::isLateUse(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                    if (Arg::isLateUse(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                         liveAtTail.add(Adapter::valueToIndex(thing));
</span><span class="cx">                 });
</span><span class="cx">         }
</span><span class="lines">@@ -139,8 +139,8 @@
</span><span class="cx"> 
</span><span class="cx">                 // Handle the early def's of the first instruction.
</span><span class="cx">                 block-&gt;at(0).forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                        if (Arg::isEarlyDef(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                        if (Arg::isEarlyDef(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                             m_workset.remove(Adapter::valueToIndex(thing));
</span><span class="cx">                     });
</span><span class="cx"> 
</span><span class="lines">@@ -254,8 +254,8 @@
</span><span class="cx">             if (instIndex + 1 &lt; m_block-&gt;size()) {
</span><span class="cx">                 Inst&amp; nextInst = m_block-&gt;at(instIndex + 1);
</span><span class="cx">                 nextInst.forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                        if (Arg::isEarlyDef(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                        if (Arg::isEarlyDef(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                             workset.remove(Adapter::valueToIndex(thing));
</span><span class="cx">                     });
</span><span class="cx">             }
</span><span class="lines">@@ -262,15 +262,15 @@
</span><span class="cx">             
</span><span class="cx">             // Then handle def's.
</span><span class="cx">             inst.forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                    if (Arg::isLateDef(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                    if (Arg::isLateDef(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                         workset.remove(Adapter::valueToIndex(thing));
</span><span class="cx">                 });
</span><span class="cx"> 
</span><span class="cx">             // Then handle use's.
</span><span class="cx">             inst.forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                    if (Arg::isEarlyUse(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                    if (Arg::isEarlyUse(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                         workset.add(Adapter::valueToIndex(thing));
</span><span class="cx">                 });
</span><span class="cx"> 
</span><span class="lines">@@ -278,8 +278,8 @@
</span><span class="cx">             if (instIndex) {
</span><span class="cx">                 Inst&amp; prevInst = m_block-&gt;at(instIndex - 1);
</span><span class="cx">                 prevInst.forEach&lt;typename Adapter::Thing&gt;(
</span><del>-                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Arg::Type type, Arg::Width) {
-                        if (Arg::isLateUse(role) &amp;&amp; Adapter::acceptsType(type))
</del><ins>+                    [&amp;] (typename Adapter::Thing&amp; thing, Arg::Role role, Bank bank, Width) {
+                        if (Arg::isLateUse(role) &amp;&amp; Adapter::acceptsBank(bank))
</ins><span class="cx">                             workset.add(Adapter::valueToIndex(thing));
</span><span class="cx">                     });
</span><span class="cx">             }
</span><span class="lines">@@ -379,11 +379,11 @@
</span><span class="cx">     IndexMap&lt;BasicBlock, typename Adapter::IndexSet&gt; m_liveAtTail;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;Arg::Type type&gt;
-using TmpLiveness = AbstractLiveness&lt;TmpLivenessAdapter&lt;type&gt;&gt;;
</del><ins>+template&lt;Bank bank&gt;
+using TmpLiveness = AbstractLiveness&lt;TmpLivenessAdapter&lt;bank&gt;&gt;;
</ins><span class="cx"> 
</span><del>-typedef AbstractLiveness&lt;TmpLivenessAdapter&lt;Arg::GP&gt;&gt; GPLiveness;
-typedef AbstractLiveness&lt;TmpLivenessAdapter&lt;Arg::FP&gt;&gt; FPLiveness;
</del><ins>+typedef AbstractLiveness&lt;TmpLivenessAdapter&lt;GP&gt;&gt; GPLiveness;
+typedef AbstractLiveness&lt;TmpLivenessAdapter&lt;FP&gt;&gt; FPLiveness;
</ins><span class="cx"> typedef AbstractLiveness&lt;StackSlotLivenessAdapter&gt; StackSlotLiveness;
</span><span class="cx"> typedef AbstractLiveness&lt;RegLivenessAdapter&gt; RegLiveness;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirLogRegisterPressurecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirLogRegisterPressure.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirLogRegisterPressure.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirLogRegisterPressure.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">             set.setAll(localCalc.live());
</span><span class="cx">             Inst::forEachDefWithExtraClobberedRegs&lt;Reg&gt;(
</span><span class="cx">                 prevInst, &amp;inst,
</span><del>-                [&amp;] (Reg reg, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+                [&amp;] (Reg reg, Arg::Role, Bank, Width) {
</ins><span class="cx">                     set.set(reg);
</span><span class="cx">                 });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirLowerAfterRegAlloccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirLowerAfterRegAlloc.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirLowerAfterRegAlloc.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirLowerAfterRegAlloc.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -81,11 +81,11 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto getScratches = [&amp;] (RegisterSet set, Arg::Type type) -&gt; std::array&lt;Arg, 2&gt; {
</del><ins>+    auto getScratches = [&amp;] (RegisterSet set, Bank bank) -&gt; std::array&lt;Arg, 2&gt; {
</ins><span class="cx">         std::array&lt;Arg, 2&gt; result;
</span><span class="cx">         for (unsigned i = 0; i &lt; 2; ++i) {
</span><span class="cx">             bool found = false;
</span><del>-            for (Reg reg : code.regsInPriorityOrder(type)) {
</del><ins>+            for (Reg reg : code.regsInPriorityOrder(bank)) {
</ins><span class="cx">                 if (!set.get(reg)) {
</span><span class="cx">                     result[i] = Tmp(reg);
</span><span class="cx">                     set.set(reg);
</span><span class="lines">@@ -96,7 +96,7 @@
</span><span class="cx">             if (!found) {
</span><span class="cx">                 result[i] = Arg::stack(
</span><span class="cx">                     code.addStackSlot(
</span><del>-                        Arg::bytes(Arg::conservativeWidth(type)),
</del><ins>+                        bytes(conservativeWidth(bank)),
</ins><span class="cx">                         StackSlotKind::Spill));
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -116,7 +116,7 @@
</span><span class="cx">                 for (unsigned i = 0; i &lt; inst.args.size(); i += 3) {
</span><span class="cx">                     Arg src = inst.args[i + 0];
</span><span class="cx">                     Arg dst = inst.args[i + 1];
</span><del>-                    Arg::Width width = inst.args[i + 2].width();
</del><ins>+                    Width width = inst.args[i + 2].width();
</ins><span class="cx"> 
</span><span class="cx">                     // The used register set contains things live after the shuffle. But
</span><span class="cx">                     // emitShuffle() wants a scratch register that is not just dead but also does not
</span><span class="lines">@@ -130,8 +130,8 @@
</span><span class="cx">                     
</span><span class="cx">                     pairs.append(ShufflePair(src, dst, width));
</span><span class="cx">                 }
</span><del>-                std::array&lt;Arg, 2&gt; gpScratch = getScratches(set, Arg::GP);
-                std::array&lt;Arg, 2&gt; fpScratch = getScratches(set, Arg::FP);
</del><ins>+                std::array&lt;Arg, 2&gt; gpScratch = getScratches(set, GP);
+                std::array&lt;Arg, 2&gt; fpScratch = getScratches(set, FP);
</ins><span class="cx">                 insertionSet.insertInsts(
</span><span class="cx">                     instIndex, emitShuffle(code, pairs, gpScratch, fpScratch, inst.origin));
</span><span class="cx">                 inst = Inst();
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx">                     Value* child = value-&gt;child(i);
</span><span class="cx">                     Arg src = inst.args[result ? (i &gt;= 1 ? i + 1 : i) : i ];
</span><span class="cx">                     Arg dst = destinations[i];
</span><del>-                    Arg::Width width = Arg::widthForB3Type(child-&gt;type());
</del><ins>+                    Width width = widthForType(child-&gt;type());
</ins><span class="cx">                     pairs.append(ShufflePair(src, dst, width));
</span><span class="cx"> 
</span><span class="cx">                     auto excludeRegisters = [&amp;] (Tmp tmp) {
</span><span class="lines">@@ -169,8 +169,8 @@
</span><span class="cx">                     dst.forEachTmpFast(excludeRegisters);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                std::array&lt;Arg, 2&gt; gpScratch = getScratches(preUsed, Arg::GP);
-                std::array&lt;Arg, 2&gt; fpScratch = getScratches(preUsed, Arg::FP);
</del><ins>+                std::array&lt;Arg, 2&gt; gpScratch = getScratches(preUsed, GP);
+                std::array&lt;Arg, 2&gt; fpScratch = getScratches(preUsed, FP);
</ins><span class="cx">                 
</span><span class="cx">                 // Also need to save all live registers. Don't need to worry about the result
</span><span class="cx">                 // register.
</span><span class="lines">@@ -181,9 +181,9 @@
</span><span class="cx">                     [&amp;] (Reg reg) {
</span><span class="cx">                         Tmp tmp(reg);
</span><span class="cx">                         Arg arg(tmp);
</span><del>-                        Arg::Width width = Arg::conservativeWidth(arg.type());
</del><ins>+                        Width width = conservativeWidth(arg.bank());
</ins><span class="cx">                         StackSlot* stackSlot =
</span><del>-                            code.addStackSlot(Arg::bytes(width), StackSlotKind::Spill);
</del><ins>+                            code.addStackSlot(bytes(width), StackSlotKind::Spill);
</ins><span class="cx">                         pairs.append(ShufflePair(arg, Arg::stack(stackSlot), width));
</span><span class="cx">                         stackSlots.append(stackSlot);
</span><span class="cx">                     });
</span><span class="lines">@@ -205,12 +205,12 @@
</span><span class="cx">                     [&amp;] (Reg reg) {
</span><span class="cx">                         Tmp tmp(reg);
</span><span class="cx">                         Arg arg(tmp);
</span><del>-                        Arg::Width width = Arg::conservativeWidth(arg.type());
</del><ins>+                        Width width = conservativeWidth(arg.bank());
</ins><span class="cx">                         StackSlot* stackSlot = stackSlots[stackSlotIndex++];
</span><span class="cx">                         pairs.append(ShufflePair(Arg::stack(stackSlot), arg, width));
</span><span class="cx">                     });
</span><span class="cx">                 if (result) {
</span><del>-                    ShufflePair pair(result, originalResult, Arg::widthForB3Type(value-&gt;type()));
</del><ins>+                    ShufflePair pair(result, originalResult, widthForType(value-&gt;type()));
</ins><span class="cx">                     pairs.append(pair);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="lines">@@ -219,8 +219,8 @@
</span><span class="cx">                 if (originalResult.isReg())
</span><span class="cx">                     liveRegs.set(originalResult.reg());
</span><span class="cx"> 
</span><del>-                gpScratch = getScratches(liveRegs, Arg::GP);
-                fpScratch = getScratches(liveRegs, Arg::FP);
</del><ins>+                gpScratch = getScratches(liveRegs, GP);
+                fpScratch = getScratches(liveRegs, FP);
</ins><span class="cx">                 
</span><span class="cx">                 insertionSet.insertInsts(
</span><span class="cx">                     instIndex + 1, emitShuffle(code, pairs, gpScratch, fpScratch, inst.origin));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirLowerMacroscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirLowerMacros.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirLowerMacros.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirLowerMacros.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">                     Value* child = value-&gt;child(i);
</span><span class="cx">                     shuffleArguments.args.append(inst.args[offset + i]);
</span><span class="cx">                     shuffleArguments.args.append(destinations[i]);
</span><del>-                    shuffleArguments.args.append(Arg::widthArg(Arg::widthForB3Type(child-&gt;type())));
</del><ins>+                    shuffleArguments.args.append(Arg::widthArg(widthForType(child-&gt;type())));
</ins><span class="cx">                 }
</span><span class="cx">                 insertionSet.insertInst(instIndex, WTFMove(shuffleArguments));
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirPadInterferencecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirPadInterference.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirPadInterference.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirPadInterference.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">             bool hasEarlyDef = false;
</span><span class="cx">             bool hasLate = false;
</span><span class="cx">             inst.forEachArg(
</span><del>-                [&amp;] (Arg&amp;, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+                [&amp;] (Arg&amp;, Arg::Role role, Bank, Width) {
</ins><span class="cx">                     switch (role) {
</span><span class="cx">                     case Arg::EarlyDef:
</span><span class="cx">                         hasEarlyDef = true;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirReportUsedRegisterscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirReportUsedRegisters.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirReportUsedRegisters.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirReportUsedRegisters.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">             if (!inst.hasNonArgEffects()) {
</span><span class="cx">                 bool canDelete = true;
</span><span class="cx">                 inst.forEachArg(
</span><del>-                    [&amp;] (Arg&amp; arg, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+                    [&amp;] (Arg&amp; arg, Arg::Role role, Bank, Width) {
</ins><span class="cx">                         if (Arg::isEarlyDef(role)) {
</span><span class="cx">                             canDelete = false;
</span><span class="cx">                             return;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirSpillEverythingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirSpillEverything.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirSpillEverything.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirSpillEverything.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx">             // code is suboptimal.
</span><span class="cx">             Inst::forEachDefWithExtraClobberedRegs&lt;Tmp&gt;(
</span><span class="cx">                 block-&gt;get(index - 1), block-&gt;get(index),
</span><del>-                [&amp;] (const Tmp&amp; tmp, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+                [&amp;] (const Tmp&amp; tmp, Arg::Role, Bank, Width) {
</ins><span class="cx">                     if (tmp.isReg())
</span><span class="cx">                         registerSet.set(tmp.reg());
</span><span class="cx">                 });
</span><span class="lines">@@ -85,12 +85,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Allocate a stack slot for each tmp.
</span><del>-    Vector&lt;StackSlot*&gt; allStackSlots[Arg::numTypes];
-    for (unsigned typeIndex = 0; typeIndex &lt; Arg::numTypes; ++typeIndex) {
-        Vector&lt;StackSlot*&gt;&amp; stackSlots = allStackSlots[typeIndex];
-        Arg::Type type = static_cast&lt;Arg::Type&gt;(typeIndex);
-        stackSlots.resize(code.numTmps(type));
-        for (unsigned tmpIndex = code.numTmps(type); tmpIndex--;)
</del><ins>+    Vector&lt;StackSlot*&gt; allStackSlots[numBanks];
+    for (unsigned bankIndex = 0; bankIndex &lt; numBanks; ++bankIndex) {
+        Vector&lt;StackSlot*&gt;&amp; stackSlots = allStackSlots[bankIndex];
+        Bank bank = static_cast&lt;Bank&gt;(bankIndex);
+        stackSlots.resize(code.numTmps(bank));
+        for (unsigned tmpIndex = code.numTmps(bank); tmpIndex--;)
</ins><span class="cx">             stackSlots[tmpIndex] = code.addStackSlot(8, StackSlotKind::Spill);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx">                         continue;
</span><span class="cx"> 
</span><span class="cx">                     if (inst.admitsStack(i)) {
</span><del>-                        StackSlot* stackSlot = allStackSlots[arg.type()][arg.tmpIndex()];
</del><ins>+                        StackSlot* stackSlot = allStackSlots[arg.bank()][arg.tmpIndex()];
</ins><span class="cx">                         arg = Arg::stack(stackSlot);
</span><span class="cx">                         continue;
</span><span class="cx">                     }
</span><span class="lines">@@ -119,11 +119,11 @@
</span><span class="cx"> 
</span><span class="cx">             // Now fall back on spilling using separate Move's to load/store the tmp.
</span><span class="cx">             inst.forEachTmp(
</span><del>-                [&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type type, Arg::Width) {
</del><ins>+                [&amp;] (Tmp&amp; tmp, Arg::Role role, Bank bank, Width) {
</ins><span class="cx">                     if (tmp.isReg())
</span><span class="cx">                         return;
</span><span class="cx">                     
</span><del>-                    StackSlot* stackSlot = allStackSlots[type][tmp.tmpIndex()];
</del><ins>+                    StackSlot* stackSlot = allStackSlots[bank][tmp.tmpIndex()];
</ins><span class="cx">                     Arg arg = Arg::stack(stackSlot);
</span><span class="cx"> 
</span><span class="cx">                     // Need to figure out a register to use. How we do that depends on the role.
</span><span class="lines">@@ -131,7 +131,7 @@
</span><span class="cx">                     switch (role) {
</span><span class="cx">                     case Arg::Use:
</span><span class="cx">                     case Arg::ColdUse:
</span><del>-                        for (Reg reg : code.regsInPriorityOrder(type)) {
</del><ins>+                        for (Reg reg : code.regsInPriorityOrder(bank)) {
</ins><span class="cx">                             if (!setBefore.get(reg)) {
</span><span class="cx">                                 setBefore.set(reg);
</span><span class="cx">                                 chosenReg = reg;
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx">                         break;
</span><span class="cx">                     case Arg::Def:
</span><span class="cx">                     case Arg::ZDef:
</span><del>-                        for (Reg reg : code.regsInPriorityOrder(type)) {
</del><ins>+                        for (Reg reg : code.regsInPriorityOrder(bank)) {
</ins><span class="cx">                             if (!setAfter.get(reg)) {
</span><span class="cx">                                 setAfter.set(reg);
</span><span class="cx">                                 chosenReg = reg;
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx">                     case Arg::LateColdUse:
</span><span class="cx">                     case Arg::Scratch:
</span><span class="cx">                     case Arg::EarlyDef:
</span><del>-                        for (Reg reg : code.regsInPriorityOrder(type)) {
</del><ins>+                        for (Reg reg : code.regsInPriorityOrder(bank)) {
</ins><span class="cx">                             if (!setBefore.get(reg) &amp;&amp; !setAfter.get(reg)) {
</span><span class="cx">                                 setAfter.set(reg);
</span><span class="cx">                                 setBefore.set(reg);
</span><span class="lines">@@ -173,7 +173,7 @@
</span><span class="cx"> 
</span><span class="cx">                     tmp = Tmp(chosenReg);
</span><span class="cx"> 
</span><del>-                    Opcode move = type == Arg::GP ? Move : MoveDouble;
</del><ins>+                    Opcode move = bank == GP ? Move : MoveDouble;
</ins><span class="cx"> 
</span><span class="cx">                     if (Arg::isAnyUse(role) &amp;&amp; role != Arg::Scratch)
</span><span class="cx">                         insertionSet.insert(instIndex, move, inst.origin, arg, tmp);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirTmpInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirTmpInlines.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirTmpInlines.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirTmpInlines.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -39,11 +39,11 @@
</span><span class="cx"> 
</span><span class="cx"> // When a Hash structure is too slow or when Sets contains most values, you can
</span><span class="cx"> // use direct array addressing with Tmps.
</span><del>-template&lt;Arg::Type type&gt;
</del><ins>+template&lt;Bank bank&gt;
</ins><span class="cx"> struct AbsoluteTmpMapper;
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-struct AbsoluteTmpMapper&lt;Arg::GP&gt; {
</del><ins>+struct AbsoluteTmpMapper&lt;GP&gt; {
</ins><span class="cx">     static unsigned absoluteIndex(const Tmp&amp; tmp)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(tmp.isGP());
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-struct AbsoluteTmpMapper&lt;Arg::FP&gt; {
</del><ins>+struct AbsoluteTmpMapper&lt;FP&gt; {
</ins><span class="cx">     static unsigned absoluteIndex(const Tmp&amp; tmp)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(tmp.isFP());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirTmpWidthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -63,9 +63,9 @@
</span><span class="cx">     
</span><span class="cx">     auto assumeTheWorst = [&amp;] (Tmp tmp) {
</span><span class="cx">         Widths&amp; widths = m_width.add(tmp, Widths()).iterator-&gt;value;
</span><del>-        Arg::Type type = Arg(tmp).type();
-        widths.use = Arg::conservativeWidth(type);
-        widths.def = Arg::conservativeWidth(type);
</del><ins>+        Bank bank = Arg(tmp).bank();
+        widths.use = conservativeWidth(bank);
+        widths.def = conservativeWidth(bank);
</ins><span class="cx">     };
</span><span class="cx">     
</span><span class="cx">     // Assume the worst for registers.
</span><span class="lines">@@ -92,8 +92,8 @@
</span><span class="cx">                 if (inst.args[0].isTmp()) {
</span><span class="cx">                     // Make sure that both sides of the Move have a width already initialized. The
</span><span class="cx">                     // fixpoint below assumes that it never has to add things to the HashMap.
</span><del>-                    m_width.add(inst.args[0].tmp(), Widths(Arg::GP));
-                    m_width.add(inst.args[1].tmp(), Widths(Arg::GP));
</del><ins>+                    m_width.add(inst.args[0].tmp(), Widths(GP));
+                    m_width.add(inst.args[1].tmp(), Widths(GP));
</ins><span class="cx">                     
</span><span class="cx">                     moves.append(&amp;inst);
</span><span class="cx">                     continue;
</span><span class="lines">@@ -101,23 +101,23 @@
</span><span class="cx">                 if (inst.args[0].isImm()
</span><span class="cx">                     &amp;&amp; inst.args[0].value() &gt;= 0) {
</span><span class="cx">                     Tmp tmp = inst.args[1].tmp();
</span><del>-                    Widths&amp; widths = m_width.add(tmp, Widths(Arg::GP)).iterator-&gt;value;
</del><ins>+                    Widths&amp; widths = m_width.add(tmp, Widths(GP)).iterator-&gt;value;
</ins><span class="cx">                     
</span><span class="cx">                     if (inst.args[0].value() &lt;= std::numeric_limits&lt;int8_t&gt;::max())
</span><del>-                        widths.def = std::max(widths.def, Arg::Width8);
</del><ins>+                        widths.def = std::max(widths.def, Width8);
</ins><span class="cx">                     else if (inst.args[0].value() &lt;= std::numeric_limits&lt;int16_t&gt;::max())
</span><del>-                        widths.def = std::max(widths.def, Arg::Width16);
</del><ins>+                        widths.def = std::max(widths.def, Width16);
</ins><span class="cx">                     else if (inst.args[0].value() &lt;= std::numeric_limits&lt;int32_t&gt;::max())
</span><del>-                        widths.def = std::max(widths.def, Arg::Width32);
</del><ins>+                        widths.def = std::max(widths.def, Width32);
</ins><span class="cx">                     else
</span><del>-                        widths.def = std::max(widths.def, Arg::Width64);
</del><ins>+                        widths.def = std::max(widths.def, Width64);
</ins><span class="cx"> 
</span><span class="cx">                     continue;
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             inst.forEachTmp(
</span><del>-                [&amp;] (Tmp&amp; tmp, Arg::Role role, Arg::Type type, Arg::Width width) {
-                    Widths&amp; widths = m_width.add(tmp, Widths(type)).iterator-&gt;value;
</del><ins>+                [&amp;] (Tmp&amp; tmp, Arg::Role role, Bank bank, Width width) {
+                    Widths&amp; widths = m_width.add(tmp, Widths(bank)).iterator-&gt;value;
</ins><span class="cx">                     
</span><span class="cx">                     if (Arg::isAnyUse(role))
</span><span class="cx">                         widths.use = std::max(widths.use, width);
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx">                     if (Arg::isZDef(role))
</span><span class="cx">                         widths.def = std::max(widths.def, width);
</span><span class="cx">                     else if (Arg::isAnyDef(role))
</span><del>-                        widths.def = Arg::conservativeWidth(type);
</del><ins>+                        widths.def = conservativeWidth(bank);
</ins><span class="cx">                 });
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirTmpWidthh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -50,20 +50,20 @@
</span><span class="cx">     //
</span><span class="cx">     // This doesn't tell you which of those properties holds, but you can query that using the other
</span><span class="cx">     // methods.
</span><del>-    Arg::Width width(Tmp tmp) const
</del><ins>+    Width width(Tmp tmp) const
</ins><span class="cx">     {
</span><span class="cx">         auto iter = m_width.find(tmp);
</span><span class="cx">         if (iter == m_width.end())
</span><del>-            return Arg::minimumWidth(Arg(tmp).type());
</del><ins>+            return minimumWidth(Arg(tmp).bank());
</ins><span class="cx">         return std::min(iter-&gt;value.use, iter-&gt;value.def);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Return the minimum required width for all defs/uses of this Tmp.
</span><del>-    Arg::Width requiredWidth(Tmp tmp)
</del><ins>+    Width requiredWidth(Tmp tmp)
</ins><span class="cx">     {
</span><span class="cx">         auto iter = m_width.find(tmp);
</span><span class="cx">         if (iter == m_width.end())
</span><del>-            return Arg::minimumWidth(Arg(tmp).type());
</del><ins>+            return minimumWidth(Arg(tmp).bank());
</ins><span class="cx">         return std::max(iter-&gt;value.use, iter-&gt;value.def);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -73,20 +73,20 @@
</span><span class="cx">     //     TotalBits - defWidth(tmp)
</span><span class="cx">     //
</span><span class="cx">     // Where TotalBits are the total number of bits in the register, so 64 on a 64-bit system.
</span><del>-    Arg::Width defWidth(Tmp tmp) const
</del><ins>+    Width defWidth(Tmp tmp) const
</ins><span class="cx">     {
</span><span class="cx">         auto iter = m_width.find(tmp);
</span><span class="cx">         if (iter == m_width.end())
</span><del>-            return Arg::minimumWidth(Arg(tmp).type());
</del><ins>+            return minimumWidth(Arg(tmp).bank());
</ins><span class="cx">         return iter-&gt;value.def;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // This tells you how much of Tmp is going to be read.
</span><del>-    Arg::Width useWidth(Tmp tmp) const
</del><ins>+    Width useWidth(Tmp tmp) const
</ins><span class="cx">     {
</span><span class="cx">         auto iter = m_width.find(tmp);
</span><span class="cx">         if (iter == m_width.end())
</span><del>-            return Arg::minimumWidth(Arg(tmp).type());
</del><ins>+            return minimumWidth(Arg(tmp).bank());
</ins><span class="cx">         return iter-&gt;value.use;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -94,16 +94,16 @@
</span><span class="cx">     struct Widths {
</span><span class="cx">         Widths() { }
</span><span class="cx"> 
</span><del>-        Widths(Arg::Type type)
</del><ins>+        Widths(Bank bank)
</ins><span class="cx">         {
</span><del>-            use = Arg::minimumWidth(type);
-            def = Arg::minimumWidth(type);
</del><ins>+            use = minimumWidth(bank);
+            def = minimumWidth(bank);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         void dump(PrintStream&amp; out) const;
</span><span class="cx">         
</span><del>-        Arg::Width use;
-        Arg::Width def;
</del><ins>+        Width use;
+        Width def;
</ins><span class="cx">     };
</span><span class="cx">     
</span><span class="cx">     HashMap&lt;Tmp, Widths&gt; m_width;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirUseCountsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirUseCounts.h (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirUseCounts.h        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirUseCounts.h        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">                 frequency *= Options::rareBlockPenalty();
</span><span class="cx">             for (Inst&amp; inst : *block) {
</span><span class="cx">                 inst.forEach&lt;Thing&gt;(
</span><del>-                    [&amp;] (Thing&amp; arg, Arg::Role role, Arg::Type, Arg::Width) {
</del><ins>+                    [&amp;] (Thing&amp; arg, Arg::Role role, Bank, Width) {
</ins><span class="cx">                         Counts&amp; counts = m_counts.add(arg, Counts()).iterator-&gt;value;
</span><span class="cx"> 
</span><span class="cx">                         if (Arg::isWarmUse(role))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirValidatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirValidate.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirValidate.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/AirValidate.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx">                 // forEachArg must return Arg&amp;'s that point into the args array.
</span><span class="cx">                 inst.forEachArg(
</span><del>-                    [&amp;] (Arg&amp; arg, Arg::Role, Arg::Type, Arg::Width) {
</del><ins>+                    [&amp;] (Arg&amp; arg, Arg::Role, Bank, Width) {
</ins><span class="cx">                         VALIDATE(&amp;arg &gt;= &amp;inst.args[0], (&quot;At &quot;, arg, &quot; in &quot;, inst, &quot; in &quot;, *block));
</span><span class="cx">                         VALIDATE(&amp;arg &lt;= &amp;inst.args.last(), (&quot;At &quot;, arg, &quot; in &quot;, inst, &quot; in &quot;, *block));
</span><span class="cx">                     });
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airopcode_generatorrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/opcode_generator.rb (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/opcode_generator.rb        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/opcode_generator.rb        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env ruby
</span><span class="cx"> 
</span><del>-# Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</del><ins>+# Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx"> #
</span><span class="cx"> # Redistribution and use in source and binary forms, with or without
</span><span class="cx"> # modification, are permitted provided that the following conditions
</span><span class="lines">@@ -44,19 +44,19 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> class Arg
</span><del>-    attr_reader :role, :type, :width
</del><ins>+    attr_reader :role, :bank, :width
</ins><span class="cx"> 
</span><del>-    def initialize(role, type, width)
</del><ins>+    def initialize(role, bank, width)
</ins><span class="cx">         @role = role
</span><del>-        @type = type
</del><ins>+        @bank = bank
</ins><span class="cx">         @width = width
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     def widthCode
</span><span class="cx">         if width == &quot;Ptr&quot;
</span><del>-            &quot;Arg::pointerWidth()&quot;
</del><ins>+            &quot;pointerWidth()&quot;
</ins><span class="cx">         else
</span><del>-            &quot;Arg::Width#{width}&quot;
</del><ins>+            &quot;Width#{width}&quot;
</ins><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx"> end
</span><span class="lines">@@ -255,9 +255,9 @@
</span><span class="cx">         result
</span><span class="cx">     end
</span><span class="cx"> 
</span><del>-    def consumeType
</del><ins>+    def consumeBank
</ins><span class="cx">         result = token.string
</span><del>-        parseError(&quot;Expected type (G or F)&quot;) unless isGF(result)
</del><ins>+        parseError(&quot;Expected bank (G or F)&quot;) unless isGF(result)
</ins><span class="cx">         advance
</span><span class="cx">         result
</span><span class="cx">     end
</span><span class="lines">@@ -369,11 +369,11 @@
</span><span class="cx">                     loop {
</span><span class="cx">                         role = consumeRole
</span><span class="cx">                         consume(&quot;:&quot;)
</span><del>-                        type = consumeType
</del><ins>+                        bank = consumeBank
</ins><span class="cx">                         consume(&quot;:&quot;)
</span><span class="cx">                         width = consumeWidth
</span><span class="cx">                         
</span><del>-                        signature &lt;&lt; Arg.new(role, type, width)
</del><ins>+                        signature &lt;&lt; Arg.new(role, bank, width)
</ins><span class="cx">                         
</span><span class="cx">                         break unless token == &quot;,&quot;
</span><span class="cx">                         consume(&quot;,&quot;)
</span><span class="lines">@@ -430,7 +430,7 @@
</span><span class="cx">                                 if signature[index].role != &quot;U&quot;
</span><span class="cx">                                     parseError(&quot;Form has an immediate for a non-use argument&quot;)
</span><span class="cx">                                 end
</span><del>-                                if signature[index].type != &quot;G&quot;
</del><ins>+                                if signature[index].bank != &quot;G&quot;
</ins><span class="cx">                                     parseError(&quot;Form has an immediate for a non-general-purpose argument&quot;)
</span><span class="cx">                                 end
</span><span class="cx">                             end
</span><span class="lines">@@ -655,7 +655,7 @@
</span><span class="cx">                     raise
</span><span class="cx">                 end
</span><span class="cx"> 
</span><del>-                outp.puts &quot;functor(args[#{index}], Arg::#{role}, Arg::#{arg.type}P, #{arg.widthCode});&quot;
</del><ins>+                outp.puts &quot;functor(args[#{index}], Arg::#{role}, #{arg.bank}P, #{arg.widthCode});&quot;
</ins><span class="cx">             }
</span><span class="cx">         end
</span><span class="cx">     }
</span><span class="lines">@@ -793,7 +793,7 @@
</span><span class="cx">                 # Some kinds of Args reqire additional validation.
</span><span class="cx">                 case kind.name
</span><span class="cx">                 when &quot;Tmp&quot;
</span><del>-                    outp.puts &quot;if (!args[#{index}].tmp().is#{arg.type}P())&quot;
</del><ins>+                    outp.puts &quot;if (!args[#{index}].tmp().is#{arg.bank}P())&quot;
</ins><span class="cx">                     outp.puts &quot;OPGEN_RETURN(false);&quot;
</span><span class="cx">                 when &quot;Imm&quot;
</span><span class="cx">                     outp.puts &quot;if (!Arg::isValidImmForm(args[#{index}].value()))&quot;
</span><span class="lines">@@ -1086,7 +1086,7 @@
</span><span class="cx">                 end
</span><span class="cx">                 case kind.name
</span><span class="cx">                 when &quot;Tmp&quot;
</span><del>-                    if overload.signature[index].type == &quot;G&quot;
</del><ins>+                    if overload.signature[index].bank == &quot;G&quot;
</ins><span class="cx">                         outp.print &quot;args[#{index}].gpr()&quot;
</span><span class="cx">                     else
</span><span class="cx">                         outp.print &quot;args[#{index}].fpr()&quot;
</span><span class="lines">@@ -1168,7 +1168,7 @@
</span><span class="cx">                         raise
</span><span class="cx">                     end
</span><span class="cx">                     
</span><del>-                    outp.puts &quot;inst.visitArg(#{index}, func, Arg.#{role}, #{arg.type}P, #{arg.width});&quot;
</del><ins>+                    outp.puts &quot;inst.visitArg(#{index}, func, Arg.#{role}, #{arg.bank}P, #{arg.width});&quot;
</ins><span class="cx">                 }
</span><span class="cx">                 outp.puts &quot;break;&quot;
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airtestaircpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/testair.cpp (212969 => 212970)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/testair.cpp        2017-02-24 22:14:38 UTC (rev 212969)
+++ trunk/Source/JavaScriptCore/b3/air/testair.cpp        2017-02-24 22:50:00 UTC (rev 212970)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -59,6 +59,14 @@
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> using namespace JSC::B3::Air;
</span><span class="cx"> 
</span><ins>+using JSC::B3::FP;
+using JSC::B3::GP;
+using JSC::B3::Width;
+using JSC::B3::Width8;
+using JSC::B3::Width16;
+using JSC::B3::Width32;
+using JSC::B3::Width64;
+
</ins><span class="cx"> namespace {
</span><span class="cx"> 
</span><span class="cx"> StaticLock crashLock;
</span><span class="lines">@@ -151,11 +159,11 @@
</span><span class="cx">     loadConstant(root, 4, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -186,11 +194,11 @@
</span><span class="cx">     loadConstant(root, 4, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[5];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -227,16 +235,16 @@
</span><span class="cx">     loadConstant(root, 8, Tmp(GPRInfo::regT7));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT7), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT7), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[8];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -279,16 +287,16 @@
</span><span class="cx">     loadConstant(root, 8, Tmp(GPRInfo::regT7));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT7), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT7), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[8];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -327,12 +335,12 @@
</span><span class="cx">     loadConstant(root, 4, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -363,12 +371,12 @@
</span><span class="cx">     loadConstant(root, 4, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -392,7 +400,7 @@
</span><span class="cx">     B3::Procedure proc;
</span><span class="cx">     Code&amp; code = proc.code();
</span><span class="cx"> 
</span><del>-    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::imm(35), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -404,7 +412,7 @@
</span><span class="cx">     Inst&amp; shuffle = root-&gt;append(Shuffle, nullptr);
</span><span class="cx">     for (Reg reg : regs) {
</span><span class="cx">         if (reg != Reg(GPRInfo::regT0))
</span><del>-            shuffle.append(Tmp(GPRInfo::regT0), Tmp(reg), Arg::widthArg(Arg::Width32));
</del><ins>+            shuffle.append(Tmp(GPRInfo::regT0), Tmp(reg), Arg::widthArg(Width32));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     StackSlot* slot = code.addStackSlot(sizeof(int32_t) * regs.size(), StackSlotKind::Locked);
</span><span class="lines">@@ -412,7 +420,7 @@
</span><span class="cx">         root-&gt;append(Move32, nullptr, Tmp(regs[i]), Arg::stack(slot, i * sizeof(int32_t)));
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;int32_t&gt; things(regs.size(), 666);
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), base);
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i) {
</span><span class="cx">         root-&gt;append(Move32, nullptr, Arg::stack(slot, i * sizeof(int32_t)), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -444,16 +452,16 @@
</span><span class="cx">     loadConstant(root, 8, Tmp(GPRInfo::regT7));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT6), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT7), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT6), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT7), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[8];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -496,16 +504,16 @@
</span><span class="cx">     loadConstant(root, 8, Tmp(GPRInfo::regT7));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT7), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT6), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT7), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT6), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[8];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -551,16 +559,16 @@
</span><span class="cx">     loadConstant(root, 8, Tmp(GPRInfo::regT7));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT7), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT7), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT7), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT7), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT6), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT6), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT7), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT7), Tmp(GPRInfo::regT1), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[8];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -601,13 +609,13 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT5), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -644,15 +652,15 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -689,15 +697,15 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -734,15 +742,15 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -779,15 +787,15 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT5), Tmp(GPRInfo::regT3), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -824,14 +832,14 @@
</span><span class="cx">     loadConstant(root, 6, Tmp(GPRInfo::regT5));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT1), Tmp(GPRInfo::regT2), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT0), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT4), Tmp(GPRInfo::regT5), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[6];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -859,7 +867,7 @@
</span><span class="cx">     B3::Procedure proc;
</span><span class="cx">     Code&amp; code = proc.code();
</span><span class="cx"> 
</span><del>-    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i)
</span><span class="lines">@@ -866,7 +874,7 @@
</span><span class="cx">         loadConstant(root, 35 + i, Tmp(regs[i]));
</span><span class="cx">     Inst&amp; shuffle = root-&gt;append(Shuffle, nullptr);
</span><span class="cx">     for (unsigned i = 1; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width32));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     StackSlot* slot = code.addStackSlot(sizeof(int32_t) * regs.size(), StackSlotKind::Locked);
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i)
</span><span class="lines">@@ -873,7 +881,7 @@
</span><span class="cx">         root-&gt;append(Move32, nullptr, Tmp(regs[i]), Arg::stack(slot, i * sizeof(int32_t)));
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;int32_t&gt; things(regs.size(), 666);
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), base);
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i) {
</span><span class="cx">         root-&gt;append(Move32, nullptr, Arg::stack(slot, i * sizeof(int32_t)), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -895,7 +903,7 @@
</span><span class="cx">     B3::Procedure proc;
</span><span class="cx">     Code&amp; code = proc.code();
</span><span class="cx"> 
</span><del>-    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    const Vector&lt;Reg&gt;&amp; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i)
</span><span class="lines">@@ -902,8 +910,8 @@
</span><span class="cx">         loadConstant(root, 35 + i, Tmp(regs[i]));
</span><span class="cx">     Inst&amp; shuffle = root-&gt;append(Shuffle, nullptr);
</span><span class="cx">     for (unsigned i = 1; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width32));
-    shuffle.append(Tmp(regs.last()), Tmp(regs[0]), Arg::widthArg(Arg::Width32));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width32));
+    shuffle.append(Tmp(regs.last()), Tmp(regs[0]), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     StackSlot* slot = code.addStackSlot(sizeof(int32_t) * regs.size(), StackSlotKind::Locked);
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i)
</span><span class="lines">@@ -910,7 +918,7 @@
</span><span class="cx">         root-&gt;append(Move32, nullptr, Tmp(regs[i]), Arg::stack(slot, i * sizeof(int32_t)));
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;int32_t&gt; things(regs.size(), 666);
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), base);
</span><span class="cx">     for (unsigned i = 0; i &lt; regs.size(); ++i) {
</span><span class="cx">         root-&gt;append(Move32, nullptr, Arg::stack(slot, i * sizeof(int32_t)), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -939,11 +947,11 @@
</span><span class="cx">     loadConstant(root, 40000000000000000ll, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width64),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width64));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width64),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -975,11 +983,11 @@
</span><span class="cx">     loadConstant(root, 50000000000000000ll, Tmp(GPRInfo::regT4));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width64),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width64));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width64),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[5];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -1012,11 +1020,11 @@
</span><span class="cx">     loadConstant(root, 40000000000000000ll, Tmp(GPRInfo::regT3));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width32),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Arg::Width64));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width32),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT2), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -1048,11 +1056,11 @@
</span><span class="cx">     loadConstant(root, 50000000000000000ll, Tmp(GPRInfo::regT4));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Arg::Width64),
-        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Arg::Width32));
</del><ins>+        Tmp(GPRInfo::regT2), Tmp(GPRInfo::regT3), Arg::widthArg(Width64),
+        Tmp(GPRInfo::regT3), Tmp(GPRInfo::regT4), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[5];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -1088,12 +1096,12 @@
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::immPtr(&amp;memory), Tmp(GPRInfo::regT2));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
</ins><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int32_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int32_t)), Arg::widthArg(Arg::Width32));
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int32_t)), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[2];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -1127,19 +1135,19 @@
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Tmp(GPRInfo::regT1), Arg::addr(Tmp(GPRInfo::regT3), 0 * sizeof(int32_t)),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT3), 0 * sizeof(int32_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT3), 1 * sizeof(int32_t)), Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT3), 1 * sizeof(int32_t)), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT3), 1 * sizeof(int32_t)), Tmp(GPRInfo::regT2),
</span><del>-        Arg::widthArg(Arg::Width32));
</del><ins>+        Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[3];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -1167,7 +1175,7 @@
</span><span class="cx">     memory[0] = 35;
</span><span class="cx">     memory[1] = 36;
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx">     regs.removeFirst(Reg(GPRInfo::regT0));
</span><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="lines">@@ -1178,16 +1186,16 @@
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><span class="cx">         Tmp(regs[0]), Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int32_t)),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int32_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int32_t)), Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int32_t)), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int32_t)), Tmp(regs[1]),
</span><del>-        Arg::widthArg(Arg::Width32));
</del><ins>+        Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = 2; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width32));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;int32_t&gt; things(regs.size(), 666);
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -1217,7 +1225,7 @@
</span><span class="cx">     memory[0] = 35000000000000ll;
</span><span class="cx">     memory[1] = 36000000000000ll;
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx">     regs.removeFirst(Reg(GPRInfo::regT0));
</span><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="lines">@@ -1228,16 +1236,16 @@
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><span class="cx">         Tmp(regs[0]), Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::widthArg(Width64),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Tmp(regs[1]),
</span><del>-        Arg::widthArg(Arg::Width64));
</del><ins>+        Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = 2; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width64));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;int64_t&gt; things(regs.size(), 666);
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -1278,7 +1286,7 @@
</span><span class="cx">     memory[0] = 35000000000000ll;
</span><span class="cx">     memory[1] = 36000000000000ll;
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx">     regs.removeFirst(Reg(GPRInfo::regT0));
</span><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="lines">@@ -1289,18 +1297,18 @@
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><span class="cx">         Tmp(regs[0]), Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Tmp(regs[1]),
</span><del>-        Arg::widthArg(Arg::Width32));
</del><ins>+        Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = 2; i &lt; regs.size(); ++i) {
</span><span class="cx">         shuffle.append(
</span><span class="cx">             Tmp(regs[i - 1]), Tmp(regs[i]),
</span><del>-            (i &amp; 1) ? Arg::widthArg(Arg::Width32) : Arg::widthArg(Arg::Width64));
</del><ins>+            (i &amp; 1) ? Arg::widthArg(Width32) : Arg::widthArg(Width64));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;int64_t&gt; things(regs.size(), 666);
</span><span class="lines">@@ -1340,19 +1348,19 @@
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Tmp(GPRInfo::regT1), Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int32_t)),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int32_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int32_t)), Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int32_t)), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int32_t)), Tmp(GPRInfo::regT0),
</span><del>-        Arg::widthArg(Arg::Width32));
</del><ins>+        Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     int32_t things[2];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int32_t)));
</span><span class="cx">     root-&gt;append(Move32, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int32_t)));
</span><span class="lines">@@ -1385,19 +1393,19 @@
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width64),
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Tmp(GPRInfo::regT1), Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::widthArg(Width64),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Tmp(GPRInfo::regT0),
</span><del>-        Arg::widthArg(Arg::Width64));
</del><ins>+        Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[2];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -1430,19 +1438,19 @@
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><del>-        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Arg::Width32),
</del><ins>+        Tmp(GPRInfo::regT0), Tmp(GPRInfo::regT1), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Tmp(GPRInfo::regT1), Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::widthArg(Width64),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT2), 1 * sizeof(int64_t)), Tmp(GPRInfo::regT0),
</span><del>-        Arg::widthArg(Arg::Width64));
</del><ins>+        Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     int64_t things[2];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT0), Arg::addr(base, 0 * sizeof(int64_t)));
</span><span class="cx">     root-&gt;append(Move, nullptr, Tmp(GPRInfo::regT1), Arg::addr(base, 1 * sizeof(int64_t)));
</span><span class="lines">@@ -1468,7 +1476,7 @@
</span><span class="cx">     memory[0] = 35000000000000ll;
</span><span class="cx">     memory[1] = 36000000000000ll;
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx">     regs.removeFirst(Reg(GPRInfo::regT0));
</span><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="lines">@@ -1479,18 +1487,18 @@
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><span class="cx">         Tmp(regs[0]), Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::widthArg(Width64),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Tmp(regs[1]),
</span><del>-        Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><del>-        regs.last(), regs[0], Arg::widthArg(Arg::Width64));
</del><ins>+        regs.last(), regs[0], Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = 2; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width64));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;int64_t&gt; things(regs.size(), 666);
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -1520,7 +1528,7 @@
</span><span class="cx">     memory[0] = 35000000000000ll;
</span><span class="cx">     memory[1] = 36000000000000ll;
</span><span class="cx"> 
</span><del>-    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(Arg::GP);
</del><ins>+    Vector&lt;Reg&gt; regs = code.regsInPriorityOrder(GP);
</ins><span class="cx">     regs.removeFirst(Reg(GPRInfo::regT0));
</span><span class="cx"> 
</span><span class="cx">     BasicBlock* root = code.addBlock();
</span><span class="lines">@@ -1531,18 +1539,18 @@
</span><span class="cx">         Shuffle, nullptr,
</span><span class="cx">         
</span><span class="cx">         Tmp(regs[0]), Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx">         
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 0 * sizeof(int64_t)),
</span><del>-        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Arg::Width64),
</del><ins>+        Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Arg::widthArg(Width64),
</ins><span class="cx"> 
</span><span class="cx">         Arg::addr(Tmp(GPRInfo::regT0), 1 * sizeof(int64_t)), Tmp(regs[1]),
</span><del>-        Arg::widthArg(Arg::Width32),
</del><ins>+        Arg::widthArg(Width32),
</ins><span class="cx"> 
</span><del>-        regs.last(), regs[0], Arg::widthArg(Arg::Width32));
</del><ins>+        regs.last(), regs[0], Arg::widthArg(Width32));
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned i = 2; i &lt; regs.size(); ++i)
</span><del>-        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Arg::Width64));
</del><ins>+        shuffle.append(Tmp(regs[i - 1]), Tmp(regs[i]), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;int64_t&gt; things(regs.size(), 666);
</span><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things[0])), Tmp(GPRInfo::regT0));
</span><span class="lines">@@ -1575,11 +1583,11 @@
</span><span class="cx">     loadDoubleConstant(root, 4, Tmp(FPRInfo::fpRegT3), Tmp(GPRInfo::regT0));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(FPRInfo::fpRegT2), Tmp(FPRInfo::fpRegT3), Arg::widthArg(Arg::Width64),
-        Tmp(FPRInfo::fpRegT3), Tmp(FPRInfo::fpRegT2), Arg::widthArg(Arg::Width64));
</del><ins>+        Tmp(FPRInfo::fpRegT2), Tmp(FPRInfo::fpRegT3), Arg::widthArg(Width64),
+        Tmp(FPRInfo::fpRegT3), Tmp(FPRInfo::fpRegT2), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     double things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(MoveDouble, nullptr, Tmp(FPRInfo::fpRegT0), Arg::addr(base, 0 * sizeof(double)));
</span><span class="cx">     root-&gt;append(MoveDouble, nullptr, Tmp(FPRInfo::fpRegT1), Arg::addr(base, 1 * sizeof(double)));
</span><span class="lines">@@ -1610,10 +1618,10 @@
</span><span class="cx">     loadDoubleConstant(root, 4, Tmp(FPRInfo::fpRegT3), Tmp(GPRInfo::regT0));
</span><span class="cx">     root-&gt;append(
</span><span class="cx">         Shuffle, nullptr,
</span><del>-        Tmp(FPRInfo::fpRegT2), Tmp(FPRInfo::fpRegT3), Arg::widthArg(Arg::Width64));
</del><ins>+        Tmp(FPRInfo::fpRegT2), Tmp(FPRInfo::fpRegT3), Arg::widthArg(Width64));
</ins><span class="cx"> 
</span><span class="cx">     double things[4];
</span><del>-    Tmp base = code.newTmp(Arg::GP);
</del><ins>+    Tmp base = code.newTmp(GP);
</ins><span class="cx">     root-&gt;append(Move, nullptr, Arg::bigImm(bitwise_cast&lt;intptr_t&gt;(&amp;things)), base);
</span><span class="cx">     root-&gt;append(MoveDouble, nullptr, Tmp(FPRInfo::fpRegT0), Arg::addr(base, 0 * sizeof(double)));
</span><span class="cx">     root-&gt;append(MoveDouble, nullptr, Tmp(FPRInfo::fpRegT1), Arg::addr(base, 1 * sizeof(double)));
</span></span></pre>
</div>
</div>

</body>
</html>