您的位置:首页 > 编程语言 > Python开发

[Python] 自动转化gcc扩展中的designated Initializers

2012-09-04 21:48 417 查看
Designated Initializers作为gcc的一种主要扩展,是代码平台移植的主要障碍之一。下面是一个针对性的例子,其它形式的designated Initializers通过修改脚本中的正则表达式就可处理。

#!/usr/bin/python
# assume the offset is in order, or the result could be incorrect
import re

stru_list = ["sse_op_table1"]

leading_space = "    "

# we have the form [0x..] = {},
def print_without_offset(text):
val = text.split('=', 1);
if val:
print leading_space + val[1].lstrip()
else:
assert 0

def print_one_elem(text):
res = re.search(r"{", text)
if not res:
val = re.search(r"(.*) = (.*),(.*)", text)
if val:
print leading_space + "{ " + val.group(2) + " }," + val.group(3)
pass
else:
assert 0
else:
print_without_offset(text)

def translate_struct(size):
idx = 0x0
while True:
try:
text = raw_input()
except EOFError:
break

if (text.lstrip().rstrip() == "};"):    # meet the end of struct definition
if (idx != size):
for i in range(idx, (size - 1)):
print "%s{ NULL }," % (leading_space)
print "%s{ NULL }" % (leading_space)
print text # print "};"
break

result = re.search(r"^(\s*)\[0x([\da-f]+)\] =", text)
if not result:
print text  # probably blank line or comments
continue

cur_idx = int(result.group(2), 16)
assert(cur_idx >= idx)
if (idx != cur_idx):
leading_space = result.group(1)
for i in range(idx, cur_idx):
print "%s{ NULL }," % (leading_space)

# print the current one
print_one_elem(text)

idx = cur_idx + 1

while True:
try:
text = raw_input()
except EOFError:
break

for elem in stru_list:
elem = elem + r"\[(\d+)\]"
result = re.search(elem, text)
if result:
#TODO:
print text
translate_struct(int(result.group(1)))
break;

其中stru_list指定了要转化的结构体名称。

如有以下结构体(在a.c文件中),要转化为非gcc extension的格式。

static void *sse_op_table1[256][4] = {
/* 3DNow! extensions */
[0x0e] = { SSE_DUMMY }, /* femms */
[0x0f] = { SSE_DUMMY }, /* pf... */
/* pure SSE operations */
[0x10] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */
[0x11] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */
[0x12] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movlps, movlpd, movsldup, movddup */
[0x13] = { SSE_SPECIAL, SSE_SPECIAL },  /* movlps, movlpd */
[0x14] = { gen_helper_punpckldq_xmm, gen_helper_punpcklqdq_xmm },
[0x15] = { gen_helper_punpckhdq_xmm, gen_helper_punpckhqdq_xmm },
[0x16] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL },  /* movhps, movhpd, movshdup */
[0x17] = { SSE_SPECIAL, SSE_SPECIAL },  /* movhps, movhpd */

[0x28] = { SSE_SPECIAL, SSE_SPECIAL },  /* movaps, movapd */
[0x29] = { SSE_SPECIAL, SSE_SPECIAL },  /* movaps, movapd */
[0x2a] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtpi2ps, cvtpi2pd, cvtsi2ss, cvtsi2sd */
[0x2b] = { SSE_SPECIAL, SSE_SPECIAL },  /* movntps, movntpd */
[0x2c] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si */
[0x2d] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */
[0x2e] = { gen_helper_ucomiss, gen_helper_ucomisd },
[0x2f] = { gen_helper_comiss, gen_helper_comisd },
[0x38] = { SSE_SPECIAL, SSE_SPECIAL, NULL, SSE_SPECIAL }, /* SSSE3/SSE4 */
[0x3a] = { SSE_SPECIAL, SSE_SPECIAL }, /* SSSE3/SSE4 */

[0x50] = { SSE_SPECIAL, SSE_SPECIAL }, /* movmskps, movmskpd */
[0x51] = SSE_FOP(sqrt),
[0x52] = { gen_helper_rsqrtps, NULL, gen_helper_rsqrtss, NULL },
[0x53] = { gen_helper_rcpps, NULL, gen_helper_rcpss, NULL },
[0x54] = { gen_helper_pand_xmm, gen_helper_pand_xmm }, /* andps, andpd */
[0x55] = { gen_helper_pandn_xmm, gen_helper_pandn_xmm }, /* andnps, andnpd */
[0x56] = { gen_helper_por_xmm, gen_helper_por_xmm }, /* orps, orpd */
[0x57] = { gen_helper_pxor_xmm, gen_helper_pxor_xmm }, /* xorps, xorpd */
[0x58] = SSE_FOP(add),
[0x59] = SSE_FOP(mul),
[0x5a] = { gen_helper_cvtps2pd, gen_helper_cvtpd2ps,
gen_helper_cvtss2sd, gen_helper_cvtsd2ss },
[0x5b] = { gen_helper_cvtdq2ps, gen_helper_cvtps2dq, gen_helper_cvttps2dq },
[0x5c] = SSE_FOP(sub),
[0x5d] = SSE_FOP(min),
[0x5e] = SSE_FOP(div),
[0x5f] = SSE_FOP(max),

/* MMX ops and their SSE extensions */
[0x60] = MMX_OP2(punpcklbw),
[0x61] = MMX_OP2(punpcklwd),
[0x62] = MMX_OP2(punpckldq),
[0x63] = MMX_OP2(packsswb),
[0x64] = MMX_OP2(pcmpgtb),
[0x65] = MMX_OP2(pcmpgtw),
[0x66] = MMX_OP2(pcmpgtl),
[0x67] = MMX_OP2(packuswb),
[0x68] = MMX_OP2(punpckhbw),
[0x69] = MMX_OP2(punpckhwd),
[0x6a] = MMX_OP2(punpckhdq),
[0x6b] = MMX_OP2(packssdw),
[0x6c] = { NULL, gen_helper_punpcklqdq_xmm },
[0x6d] = { NULL, gen_helper_punpckhqdq_xmm },
[0x6e] = { SSE_SPECIAL, SSE_SPECIAL }, /* movd mm, ea */
[0x6f] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, , movqdu */
[0x70] = { gen_helper_pshufw_mmx,
gen_helper_pshufd_xmm,
gen_helper_pshufhw_xmm,
gen_helper_pshuflw_xmm },
[0x71] = { SSE_SPECIAL, SSE_SPECIAL }, /* shiftw */
[0x72] = { SSE_SPECIAL, SSE_SPECIAL }, /* shiftd */
[0x73] = { SSE_SPECIAL, SSE_SPECIAL }, /* shiftq */
[0x74] = MMX_OP2(pcmpeqb),
[0x75] = MMX_OP2(pcmpeqw),
[0x76] = MMX_OP2(pcmpeql),
[0x77] = { SSE_DUMMY }, /* emms */
[0x7c] = { NULL, gen_helper_haddpd, NULL, gen_helper_haddps },
[0x7d] = { NULL, gen_helper_hsubpd, NULL, gen_helper_hsubps },
[0x7e] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movd, movd, , movq */
[0x7f] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, movdqu */
[0xc2] = SSE_FOP(cmpeq),
[0xc4] = { SSE_SPECIAL, SSE_SPECIAL }, /* pinsrw */
[0xc5] = { SSE_SPECIAL, SSE_SPECIAL }, /* pextrw */
[0xc6] = { gen_helper_shufps, gen_helper_shufpd },

[0xd0] = { NULL, gen_helper_addsubpd, NULL, gen_helper_addsubps },
[0xd1] = MMX_OP2(psrlw),
[0xd2] = MMX_OP2(psrld),
[0xd3] = MMX_OP2(psrlq),
[0xd4] = MMX_OP2(paddq),
[0xd5] = MMX_OP2(pmullw),
[0xd6] = { NULL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL },
[0xd7] = { SSE_SPECIAL, SSE_SPECIAL }, /* pmovmskb */
[0xd8] = MMX_OP2(psubusb),
[0xd9] = MMX_OP2(psubusw),
[0xda] = MMX_OP2(pminub),
[0xdb] = MMX_OP2(pand),
[0xdc] = MMX_OP2(paddusb),
[0xdd] = MMX_OP2(paddusw),
[0xde] = MMX_OP2(pmaxub),
[0xdf] = MMX_OP2(pandn),
[0xe0] = MMX_OP2(pavgb),
[0xe1] = MMX_OP2(psraw),
[0xe2] = MMX_OP2(psrad),
[0xe3] = MMX_OP2(pavgw),
[0xe4] = MMX_OP2(pmulhuw),
[0xe5] = MMX_OP2(pmulhw),
[0xe6] = { NULL, gen_helper_cvttpd2dq, gen_helper_cvtdq2pd, gen_helper_cvtpd2dq },
[0xe7] = { SSE_SPECIAL , SSE_SPECIAL },  /* movntq, movntq */
[0xe8] = MMX_OP2(psubsb),
[0xe9] = MMX_OP2(psubsw),
[0xea] = MMX_OP2(pminsw),
[0xeb] = MMX_OP2(por),
[0xec] = MMX_OP2(paddsb),
[0xed] = MMX_OP2(paddsw),
[0xee] = MMX_OP2(pmaxsw),
[0xef] = MMX_OP2(pxor),
[0xf0] = { NULL, NULL, NULL, SSE_SPECIAL }, /* lddqu */
[0xf1] = MMX_OP2(psllw),
[0xf2] = MMX_OP2(pslld),
[0xf3] = MMX_OP2(psllq),
[0xf4] = MMX_OP2(pmuludq),
[0xf5] = MMX_OP2(pmaddwd),
[0xf6] = MMX_OP2(psadbw),
[0xf7] = MMX_OP2(maskmov),
[0xf8] = MMX_OP2(psubb),
[0xf9] = MMX_OP2(psubw),
[0xfa] = MMX_OP2(psubl),
[0xfb] = MMX_OP2(psubq),
[0xfc] = MMX_OP2(paddb),
[0xfd] = MMX_OP2(paddw),
[0xfe] = MMX_OP2(paddl),
};


运行上面的脚本

./main.py < a.c > b.c

则产生b.c文件:

static void *sse_op_table1[256][4] = {
/* 3DNow! extensions */
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ SSE_DUMMY }, /* femms */
{ SSE_DUMMY }, /* pf... */
/* pure SSE operations */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movlps, movlpd, movsldup, movddup */
{ SSE_SPECIAL, SSE_SPECIAL },  /* movlps, movlpd */
{ gen_helper_punpckldq_xmm, gen_helper_punpcklqdq_xmm },
{ gen_helper_punpckhdq_xmm, gen_helper_punpckhqdq_xmm },
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL },  /* movhps, movhpd, movshdup */
{ SSE_SPECIAL, SSE_SPECIAL },  /* movhps, movhpd */

{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ SSE_SPECIAL, SSE_SPECIAL },  /* movaps, movapd */
{ SSE_SPECIAL, SSE_SPECIAL },  /* movaps, movapd */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtpi2ps, cvtpi2pd, cvtsi2ss, cvtsi2sd */
{ SSE_SPECIAL, SSE_SPECIAL },  /* movntps, movntpd */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */
{ gen_helper_ucomiss, gen_helper_ucomisd },
{ gen_helper_comiss, gen_helper_comisd },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ SSE_SPECIAL, SSE_SPECIAL, NULL, SSE_SPECIAL }, /* SSSE3/SSE4 */
{ NULL },
{ SSE_SPECIAL, SSE_SPECIAL }, /* SSSE3/SSE4 */

{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ SSE_SPECIAL, SSE_SPECIAL }, /* movmskps, movmskpd */
{ SSE_FOP(sqrt) },
{ gen_helper_rsqrtps, NULL, gen_helper_rsqrtss, NULL },
{ gen_helper_rcpps, NULL, gen_helper_rcpss, NULL },
{ gen_helper_pand_xmm, gen_helper_pand_xmm }, /* andps, andpd */
{ gen_helper_pandn_xmm, gen_helper_pandn_xmm }, /* andnps, andnpd */
{ gen_helper_por_xmm, gen_helper_por_xmm }, /* orps, orpd */
{ gen_helper_pxor_xmm, gen_helper_pxor_xmm }, /* xorps, xorpd */
{ SSE_FOP(add) },
{ SSE_FOP(mul) },
{ gen_helper_cvtps2pd, gen_helper_cvtpd2ps,
gen_helper_cvtss2sd, gen_helper_cvtsd2ss },
{ gen_helper_cvtdq2ps, gen_helper_cvtps2dq, gen_helper_cvttps2dq },
{ SSE_FOP(sub) },
{ SSE_FOP(min) },
{ SSE_FOP(div) },
{ SSE_FOP(max) },

/* MMX ops and their SSE extensions */
{ MMX_OP2(punpcklbw) },
{ MMX_OP2(punpcklwd) },
{ MMX_OP2(punpckldq) },
{ MMX_OP2(packsswb) },
{ MMX_OP2(pcmpgtb) },
{ MMX_OP2(pcmpgtw) },
{ MMX_OP2(pcmpgtl) },
{ MMX_OP2(packuswb) },
{ MMX_OP2(punpckhbw) },
{ MMX_OP2(punpckhwd) },
{ MMX_OP2(punpckhdq) },
{ MMX_OP2(packssdw) },
{ NULL, gen_helper_punpcklqdq_xmm },
{ NULL, gen_helper_punpckhqdq_xmm },
{ SSE_SPECIAL, SSE_SPECIAL }, /* movd mm, ea */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, , movqdu */
{ gen_helper_pshufw_mmx,
gen_helper_pshufd_xmm,
gen_helper_pshufhw_xmm,
gen_helper_pshuflw_xmm },
{ SSE_SPECIAL, SSE_SPECIAL }, /* shiftw */
{ SSE_SPECIAL, SSE_SPECIAL }, /* shiftd */
{ SSE_SPECIAL, SSE_SPECIAL }, /* shiftq */
{ MMX_OP2(pcmpeqb) },
{ MMX_OP2(pcmpeqw) },
{ MMX_OP2(pcmpeql) },
{ SSE_DUMMY }, /* emms */
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL, gen_helper_haddpd, NULL, gen_helper_haddps },
{ NULL, gen_helper_hsubpd, NULL, gen_helper_hsubps },
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movd, movd, , movq */
{ SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, movdqu */
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ SSE_FOP(cmpeq) },
{ NULL },
{ SSE_SPECIAL, SSE_SPECIAL }, /* pinsrw */
{ SSE_SPECIAL, SSE_SPECIAL }, /* pextrw */
{ gen_helper_shufps, gen_helper_shufpd },

{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL },
{ NULL, gen_helper_addsubpd, NULL, gen_helper_addsubps },
{ MMX_OP2(psrlw) },
{ MMX_OP2(psrld) },
{ MMX_OP2(psrlq) },
{ MMX_OP2(paddq) },
{ MMX_OP2(pmullw) },
{ NULL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL },
{ SSE_SPECIAL, SSE_SPECIAL }, /* pmovmskb */
{ MMX_OP2(psubusb) },
{ MMX_OP2(psubusw) },
{ MMX_OP2(pminub) },
{ MMX_OP2(pand) },
{ MMX_OP2(paddusb) },
{ MMX_OP2(paddusw) },
{ MMX_OP2(pmaxub) },
{ MMX_OP2(pandn) },
{ MMX_OP2(pavgb) },
{ MMX_OP2(psraw) },
{ MMX_OP2(psrad) },
{ MMX_OP2(pavgw) },
{ MMX_OP2(pmulhuw) },
{ MMX_OP2(pmulhw) },
{ NULL, gen_helper_cvttpd2dq, gen_helper_cvtdq2pd, gen_helper_cvtpd2dq },
{ SSE_SPECIAL , SSE_SPECIAL },  /* movntq, movntq */
{ MMX_OP2(psubsb) },
{ MMX_OP2(psubsw) },
{ MMX_OP2(pminsw) },
{ MMX_OP2(por) },
{ MMX_OP2(paddsb) },
{ MMX_OP2(paddsw) },
{ MMX_OP2(pmaxsw) },
{ MMX_OP2(pxor) },
{ NULL, NULL, NULL, SSE_SPECIAL }, /* lddqu */
{ MMX_OP2(psllw) },
{ MMX_OP2(pslld) },
{ MMX_OP2(psllq) },
{ MMX_OP2(pmuludq) },
{ MMX_OP2(pmaddwd) },
{ MMX_OP2(psadbw) },
{ MMX_OP2(maskmov) },
{ MMX_OP2(psubb) },
{ MMX_OP2(psubw) },
{ MMX_OP2(psubl) },
{ MMX_OP2(psubq) },
{ MMX_OP2(paddb) },
{ MMX_OP2(paddw) },
{ MMX_OP2(paddl) },
{ NULL }
};


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: