aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jumper/build_stages.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jumper/build_stages.py')
-rwxr-xr-xsrc/jumper/build_stages.py99
1 files changed, 50 insertions, 49 deletions
diff --git a/src/jumper/build_stages.py b/src/jumper/build_stages.py
index fd50f1a328..fd584265d4 100755
--- a/src/jumper/build_stages.py
+++ b/src/jumper/build_stages.py
@@ -71,7 +71,15 @@ subprocess.check_call(clang + cflags + vfp4 +
['-c', 'src/jumper/SkJumper_stages.cpp'] +
['-o', 'vfp4.o'])
-def parse_object_file(dot_o, array_type, target=None):
+def parse_object_file(dot_o, directive, target=None):
+ globl, label, comment = '.globl', ':', '// '
+ if 'win' in dot_o:
+ globl, label, comment = 'PUBLIC', ' LABEL PROC', '; '
+
+ dehex = lambda h: '0x'+h
+ if directive != '.long':
+ dehex = lambda h: str(int(h,16))
+
cmd = [objdump]
if target:
cmd += ['--target', target]
@@ -84,7 +92,6 @@ def parse_object_file(dot_o, array_type, target=None):
assert snippet not in section_headers
# Ok. Let's disassemble.
- active = False
disassemble = ['-d', '--insn-width=10', dot_o]
for line in subprocess.check_output(cmd + disassemble).split('\n'):
line = line.strip()
@@ -95,11 +102,9 @@ def parse_object_file(dot_o, array_type, target=None):
# E.g. 00000000000003a4 <_load_f16>:
m = re.match('''[0-9a-f]+ <_?(.*)>:''', line)
if m:
- if active:
- print '};'
print
- print 'CODE const', array_type, m.group(1) + '[] = {'
- active = True
+ print globl + ' _' + m.group(1)
+ print '_' + m.group(1) + label
continue
columns = line.split('\t')
@@ -113,54 +118,50 @@ def parse_object_file(dot_o, array_type, target=None):
inst, args = columns[2].split(' ', 1)
code, inst, args = code.strip(), inst.strip(), args.strip()
- dehex = lambda x: '0x'+x
- if array_type == 'uint8_t':
- dehex = lambda x: str(int(x, 16))
-
- hexed = ''.join(dehex(x) + ',' for x in code.split(' '))
- print ' ' + hexed + ' '*(40-len(hexed)) + \
- '//' + inst + (' '*(14-len(inst)) + args if args else '')
- print '};'
-
-sys.stdout = open('src/jumper/SkJumper_generated.cpp', 'w')
-
-print '''/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-// This file is generated semi-automatically with this command:
-// $ src/jumper/build_stages.py
-
-#include <stdint.h>
-
-#if defined(_MSC_VER)
- #pragma section("code", read,execute)
- #define CODE extern "C" __declspec(allocate("code"))
-#elif defined(__MACH__)
- #define CODE extern "C" __attribute__((section("__TEXT,__text")))
-#else
- #define CODE extern "C" __attribute__((section(".text")))
-#endif
+ hexed = ','.join(dehex(x) for x in code.split(' '))
+ print ' ' + directive + ' ' + hexed + ' '*(36-len(hexed)) + \
+ comment + inst + (' '*(14-len(inst)) + args if args else '')
+
+sys.stdout = open('src/jumper/SkJumper_generated.S', 'w')
+
+print '''# Copyright 2017 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file is generated semi-automatically with this command:
+# $ src/jumper/build_stages.py
'''
+print '.text'
print '#if defined(__aarch64__)'
-parse_object_file('aarch64.o', 'uint32_t')
+print '.balign 4'
+parse_object_file('aarch64.o', '.long')
print '#elif defined(__arm__)'
-parse_object_file('vfp4.o', 'uint32_t', target='elf32-littlearm')
+print '.balign 4'
+parse_object_file('vfp4.o', '.long', target='elf32-littlearm')
print '#elif defined(__x86_64__)'
-parse_object_file('hsw.o', 'uint8_t')
-parse_object_file('avx.o', 'uint8_t')
-parse_object_file('sse41.o', 'uint8_t')
-parse_object_file('sse2.o', 'uint8_t')
-
-print '#elif defined(_M_X64)'
-parse_object_file('win_hsw.o', 'uint8_t')
-parse_object_file('win_avx.o', 'uint8_t')
-parse_object_file('win_sse41.o', 'uint8_t')
-parse_object_file('win_sse2.o', 'uint8_t')
+parse_object_file('hsw.o', '.byte')
+parse_object_file('avx.o', '.byte')
+parse_object_file('sse41.o', '.byte')
+parse_object_file('sse2.o', '.byte')
print '#endif'
+
+sys.stdout = open('src/jumper/SkJumper_generated_win.S', 'w')
+print '''; Copyright 2017 Google Inc.
+;
+; Use of this source code is governed by a BSD-style license that can be
+; found in the LICENSE file.
+
+; This file is generated semi-automatically with this command:
+; $ src/jumper/build_stages.py
+'''
+
+print '_text SEGMENT'
+parse_object_file('win_hsw.o', 'DB')
+parse_object_file('win_avx.o', 'DB')
+parse_object_file('win_sse41.o', 'DB')
+parse_object_file('win_sse2.o', 'DB')
+print 'END'