diff --git a/pydir/szbuild.py b/pydir/szbuild.py
index e922190..32311f1 100755
--- a/pydir/szbuild.py
+++ b/pydir/szbuild.py
@@ -61,6 +61,31 @@
         return True
     return default_match
 
+def AddOptionalArgs(argparser):
+    argparser.add_argument('--force', dest='force', action='store_true',
+                           help='Force all re-translations of the pexe')
+    argparser.add_argument('--include', '-i', default=[], dest='include',
+                           action='append',
+                           help='Subzero symbols to include ' +
+                                '(regex or line range)')
+    argparser.add_argument('--exclude', '-e', default=[], dest='exclude',
+                           action='append',
+                           help='Subzero symbols to exclude ' +
+                                '(regex or line range)')
+    argparser.add_argument('--output', '-o', default='a.out', dest='output',
+                           action='store',
+                           help='Output executable. Default %(default)s.')
+    argparser.add_argument('-O', default='2', dest='optlevel',
+                           choices=['m1', '-1', '0', '1', '2'],
+                           help='Optimization level ' +
+                                '(m1 and -1 are equivalent).' +
+                                ' Default %(default)s.')
+    argparser.add_argument('--verbose', '-v', dest='verbose',
+                           action='store_true',
+                           help='Display some extra debugging output')
+    argparser.add_argument('--stats', dest='stats', action='store_true',
+                           help='Enable Subzero stats output')
+
 def main():
     """Create a hybrid translation from Subzero and llc.
 
@@ -104,38 +129,20 @@
     argparser = argparse.ArgumentParser(
         description='    ' + main.__doc__,
         formatter_class=argparse.RawTextHelpFormatter)
+    AddOptionalArgs(argparser)
     argparser.add_argument('pexe', help='Finalized pexe to translate')
-    argparser.add_argument('--force', dest='force', action='store_true',
-                           help='Force all re-translations of the pexe')
-    argparser.add_argument('--include', '-i', default=[], dest='include',
-                           action='append',
-                           help='Subzero symbols to include ' +
-                                '(regex or line range)')
-    argparser.add_argument('--exclude', '-e', default=[], dest='exclude',
-                           action='append',
-                           help='Subzero symbols to exclude ' +
-                                '(regex or line range)')
-    argparser.add_argument('--output', '-o', default='a.out', dest='output',
-                           action='store',
-                           help='Output executable. Default %(default)s.')
-    argparser.add_argument('-O', default='2', dest='optlevel',
-                           choices=['m1', '-1', '0', '1', '2'],
-                           help='Optimization level ' +
-                                '(m1 and -1 are equivalent).' +
-                                ' Default %(default)s.')
-    argparser.add_argument('--verbose', '-v', dest='verbose',
-                           action='store_true',
-                           help='Display some extra debugging output')
     args = argparser.parse_args()
-
     pexe = args.pexe
+    exe = args.output
+    ProcessPexe(args, pexe, exe)
+
+def ProcessPexe(args, pexe, exe):
     [pexe_base, ext] = os.path.splitext(pexe)
     if ext != '.pexe':
         pexe_base = pexe
     pexe_base_unescaped = pexe_base
     pexe_base = pipes.quote(pexe_base)
     pexe = pipes.quote(pexe)
-    exe = args.output
 
     nacl_root = FindBaseNaCl()
     os.environ['PATH'] = (
@@ -181,7 +188,8 @@
             NewerThanOrNotThere(llvm2ice, obj_sz):
         shellcmd((
             '{l2i} -O{level} -bitcode-format=pnacl -disable-globals ' +
-            '-externalize -ffunction-sections {pexe} -o {asm}'
+            '-externalize -ffunction-sections {pexe} -o {asm}' +
+            (' --stats' if args.stats else '')
             ).format(l2i=llvm2ice, level=opt_level, pexe=pexe, asm=asm_sz),
                  echo=args.verbose)
         shellcmd((
diff --git a/pydir/szbuild_spec2k.py b/pydir/szbuild_spec2k.py
new file mode 100755
index 0000000..fb4321f
--- /dev/null
+++ b/pydir/szbuild_spec2k.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python2
+
+import argparse
+import os
+import sys
+
+import szbuild
+
+from utils import FindBaseNaCl
+
+def main():
+    """Build native gcc-style executables for one or all Spec2K components.
+
+    Afterwards, the executables can be run from the
+    native_client/tests/spec2k/ directory as:
+    './run_all.sh RunBenchmarks SetupGccX8632Opt {train|ref} ...'
+    """
+    nacl_root = FindBaseNaCl()
+    components = [ '164.gzip', '175.vpr', '176.gcc', '177.mesa', '179.art', 
+                   '181.mcf', '183.equake', '186.crafty', '188.ammp',
+                   '197.parser', '252.eon', '253.perlbmk', '254.gap',
+                   '255.vortex', '256.bzip2', '300.twolf' ]
+    
+    argparser = argparse.ArgumentParser(description=main.__doc__)
+    szbuild.AddOptionalArgs(argparser)
+    argparser.add_argument('comps', nargs='*', default=components)
+    args = argparser.parse_args()
+    bad = set(args.comps) - set(components)
+    if bad:
+        print 'Unknown component{s}: '.format(s='s' if len(bad) > 1 else '') + \
+            ' '.join(x for x in bad)
+        sys.exit(1)
+    for comp in args.comps:
+        name = os.path.splitext(comp)[1] or comp
+        if name[0] == '.':
+            name = name[1:]
+        szbuild.ProcessPexe(args,
+                            ('{root}/tests/spec2k/{comp}/' +
+                             '{name}.opt.stripped.pexe'
+                             ).format(root=nacl_root, comp=comp, name=name),
+                            ('{root}/tests/spec2k/{comp}/' +
+                             '{name}.gcc.opt.x8632'
+                             ).format(root=nacl_root, comp=comp, name=name))
+
+if __name__ == '__main__':
+    main()
