hipe_arm_encode.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 978 行 · 第 1/3 页

ERL
978
字号
    'teq' -> teq(Opnds);    'tst' -> tst(Opnds);    'umlal' -> umlal(Opnds);    'umull' -> umull(Opnds);    _ -> exit({?MODULE,insn_encode,Op})  end.%%%%%% Testing Interface%%%-ifdef(TESTING).say(OS, Str) ->  file:write(OS, Str).hex_digit(Dig0) ->  Dig = Dig0 band 16#F,  if Dig >= 16#A -> $A + (Dig - 16#A);     true -> $0 + Dig  end.say_byte(OS, Byte) ->  say(OS, [hex_digit(Byte bsr 4)]),  say(OS, [hex_digit(Byte)]).say_word(OS, Word) ->  say(OS, "0x"),  say_byte(OS, Word bsr 24),  say_byte(OS, Word bsr 16),  say_byte(OS, Word bsr 8),  say_byte(OS, Word).t(OS, Op, Opnds) ->  Word = insn_encode(Op, Opnds),  say(OS, "\t.long "),  say_word(OS, Word),  say(OS, "\n").dotest1(OS) ->  say(OS, "\t.text\n\t.align 4\n"),  %%  Rn = {r,9},  Rd = {r,8},	% must be even and less than 14 for some insns  Rm = {r,7},  Rs = {r,6},  RdLo = Rn,  RdHi = Rd,  Registers = [Rm,Rs,Rd],	% must exclude Rn for some insns  CRd = {cr,15},  CRn = {cr,14},  CRm = {cr,13},  BT0 = {bt,0},  BT1 = {bt,1},  CpNum = {cpnum,15},  CpOp3 = {cpop3,16#3},  CpOp4 = {cpop4,16#F},  L0 = {l,0},  L1 = {l,1},  S0 = {s,0},  S1 = {s,1},  FieldMask4 = {field_mask,16#F},  Imm4 = {imm4,16#F},  Imm5 = {imm5,16#1F},  Imm8 = {imm8,16#FF},  Imm12 = {imm12,16#FFF},  Imm16 = {imm16,16#FFFF},  Imm24 = {imm24,16#FFFFF},  Imm25 = {imm25,16#FFFFF1},  %%  AM1_1 = {Imm8,Imm4},  AM1_2 = Rm,  AM1_3_1 = {Rm,{'lsl',Imm5}},  AM1_3_2 = {Rm,{'lsr',Imm5}},  AM1_3_3 = {Rm,{'asr',Imm5}},  AM1_3_4 = {Rm,{'ror',Imm5}},  AM1_3_5 = {Rm,{'lsl',Rs}},  AM1_3_6 = {Rm,{'lsr',Rs}},  AM1_3_7 = {Rm,{'asr',Rs}},  AM1_3_8 = {Rm,{'ror',Rs}},  AM1_3_9 = {Rm,'rrx'},  %%  AM2ShiftOp1 = {'lsl',Imm5},  AM2ShiftOp2 = {'lsr',Imm5},  AM2ShiftOp3 = {'asr',Imm5},  AM2ShiftOp4 = {'ror',Imm5},  AM2ShiftOp5 = 'rrx',  SignP = '+',  SignM = '-',  AM2_1_1 = {immediate_offset,Rn,SignP,Imm12},  AM2_1_2 = {immediate_offset,Rn,SignM,Imm12},  AM2_2_1 = {register_offset,Rn,SignP,Rm},  AM2_2_2 = {register_offset,Rn,SignM,Rm},  AM2_3_1 = {scaled_register_offset,Rn,SignP,Rm,AM2ShiftOp1},  AM2_3_2 = {scaled_register_offset,Rn,SignM,Rm,AM2ShiftOp2},  AM2_3_3 = {scaled_register_offset,Rn,SignP,Rm,AM2ShiftOp3},  AM2_3_4 = {scaled_register_offset,Rn,SignM,Rm,AM2ShiftOp4},  AM2_3_5 = {scaled_register_offset,Rn,SignP,Rm,AM2ShiftOp5},  AM2_4_1 = {immediate_pre_indexed,Rn,SignP,Imm12},  AM2_4_2 = {immediate_pre_indexed,Rn,SignM,Imm12},  AM2_5_1 = {register_pre_indexed,Rn,SignP,Rm},  AM2_5_2 = {register_pre_indexed,Rn,SignM,Rm},  AM2_6_1 = {scaled_register_pre_indexed,Rn,SignP,Rm,AM2ShiftOp1},  AM2_6_2 = {scaled_register_pre_indexed,Rn,SignM,Rm,AM2ShiftOp2},  AM2_6_3 = {scaled_register_pre_indexed,Rn,SignP,Rm,AM2ShiftOp3},  AM2_6_4 = {scaled_register_pre_indexed,Rn,SignM,Rm,AM2ShiftOp4},  AM2_6_5 = {scaled_register_pre_indexed,Rn,SignP,Rm,AM2ShiftOp5},  AM2_7_1 = {immediate_post_indexed,Rn,SignP,Imm12},  AM2_7_2 = {immediate_post_indexed,Rn,SignM,Imm12},  AM2_8_1 = {register_post_indexed,Rn,SignP,Rm},  AM2_8_2 = {register_post_indexed,Rn,SignM,Rm},  AM2_9_1 = {scaled_register_post_indexed,Rn,SignP,Rm,AM2ShiftOp1},  AM2_9_2 = {scaled_register_post_indexed,Rn,SignM,Rm,AM2ShiftOp2},  AM2_9_3 = {scaled_register_post_indexed,Rn,SignP,Rm,AM2ShiftOp3},  AM2_9_4 = {scaled_register_post_indexed,Rn,SignM,Rm,AM2ShiftOp4},  AM2_9_5 = {scaled_register_post_indexed,Rn,SignP,Rm,AM2ShiftOp5},  %%  AM3_1_1 = {immediate_offset,Rn,SignP,Imm8},  AM3_1_2 = {immediate_offset,Rn,SignM,Imm8},  AM3_2_1 = {register_offset,Rn,SignP,Rm},  AM3_2_2 = {register_offset,Rn,SignM,Rm},  AM3_3_1 = {immediate_pre_indexed,Rn,SignP,Imm8},  AM3_3_2 = {immediate_pre_indexed,Rn,SignM,Imm8},  AM3_4_1 = {register_pre_indexed,Rn,SignP,Rm},  AM3_4_2 = {register_pre_indexed,Rn,SignM,Rm},  AM3_5_1 = {immediate_post_indexed,Rn,SignP,Imm8},  AM3_5_2 = {immediate_post_indexed,Rn,SignM,Imm8},  AM3_6_1 = {register_post_indexed,Rn,SignP,Rm},  AM3_6_2 = {register_post_indexed,Rn,SignM,Rm},  %%  AM4_1 = 'ia',  AM4_2 = 'ib',  AM4_3 = 'da',  AM4_4 = 'db',  AM4_5 = 'fa',  AM4_6 = 'fd',  AM4_7 = 'ea',  AM4_8 = 'ed',  %%  AM5_1_1 = {offset,Rn,SignP,Imm8},  AM5_1_2 = {offset,Rn,SignM,Imm8},  AM5_2_1 = {pre_indexed,Rn,SignP,Imm8},  AM5_2_2 = {pre_indexed,Rn,SignM,Imm8},  AM5_3_1 = {post_indexed,Rn,SignP,Imm8},  AM5_3_2 = {post_indexed,Rn,SignM,Imm8},  AM5_4 = {unindexed,Rn,Imm8},  %%  Cond_eq = {'cond','eq'},  Cond_ne = {'cond','ne'},  Cond_cs = {'cond','cs'},  Cond_hs = {'cond','hs'},  Cond_cc = {'cond','cc'},  Cond_lo = {'cond','lo'},  Cond_mi = {'cond','mi'},  Cond_pl = {'cond','pl'},  Cond_vs = {'cond','vs'},  Cond_vc = {'cond','vc'},  Cond_hi = {'cond','hi'},  Cond_ls = {'cond','ls'},  Cond_ge = {'cond','ge'},  Cond_lt = {'cond','lt'},  Cond_gt = {'cond','gt'},  Cond_le = {'cond','le'},  Cond_al = {'cond','al'},  %%  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_1}),		% test all AM1 operands  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_2}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_1}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_2}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_3}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_4}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_5}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_6}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_7}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_8}),  t(OS,'adc',{Cond_al,S0,Rd,Rn,AM1_3_9}),  t(OS,'add',{Cond_al,S0,Rd,Rn,AM1_1}),		% test all S operands  t(OS,'add',{Cond_al,S1,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_eq,S0,Rd,Rn,AM1_1}),		% test all Cond operands  t(OS,'and',{Cond_ne,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_cs,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_hs,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_cc,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_lo,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_mi,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_pl,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_vs,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_vc,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_hi,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_ls,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_ge,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_lt,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_gt,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_le,S0,Rd,Rn,AM1_1}),  t(OS,'and',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'b',{Cond_al,Imm24}),  t(OS,'bic',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'bkpt',{Imm16}),  t(OS,'bl',{Cond_al,Imm24}),  t(OS,'blx',{Imm25}),  t(OS,'blx',{Cond_al,Rm}),  t(OS,'bx',{Cond_al,Rm}),  t(OS,'cdp',{Cond_al,CpNum,CpOp4,CRd,CRn,CRm,CpOp3}),  t(OS,'cdp2',{CpNum,CpOp4,CRd,CRn,CRm,CpOp3}),  t(OS,'clz',{Cond_al,Rd,Rm}),  t(OS,'cmn',{Cond_al,Rn,AM1_1}),  t(OS,'cmp',{Cond_al,Rn,AM1_1}),  t(OS,'eor',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'ldc',{Cond_al,L0,CpNum,CRd,AM5_1_1}),	% test all AM5 operands  t(OS,'ldc',{Cond_al,L1,CpNum,CRd,AM5_1_2}),  t(OS,'ldc',{Cond_al,L0,CpNum,CRd,AM5_2_1}),  t(OS,'ldc',{Cond_al,L1,CpNum,CRd,AM5_2_2}),  t(OS,'ldc',{Cond_al,L0,CpNum,CRd,AM5_3_1}),  t(OS,'ldc',{Cond_al,L1,CpNum,CRd,AM5_3_2}),  t(OS,'ldc',{Cond_al,L0,CpNum,CRd,AM5_4}),  t(OS,'ldc2',{L0,CpNum,CRd,AM5_1_1}),  t(OS,'ldm',{Cond_al,AM4_1,Rn,'!',Registers}),  t(OS,'ldm',{Cond_al,AM4_1,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_2,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_3,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_4,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_5,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_6,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_7,Rn,Registers}),	% test all AM4 operands  t(OS,'ldm',{Cond_al,AM4_8,Rn,Registers}),	% test all AM4 operands  t(OS,'ldr',{Cond_al,Rd,AM2_1_1}),		% test all AM2 operands  t(OS,'ldr',{Cond_al,Rd,AM2_1_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_2_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_2_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_3_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_3_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_3_3}),  t(OS,'ldr',{Cond_al,Rd,AM2_3_4}),  t(OS,'ldr',{Cond_al,Rd,AM2_3_5}),  t(OS,'ldr',{Cond_al,Rd,AM2_4_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_4_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_5_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_5_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_6_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_6_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_6_3}),  t(OS,'ldr',{Cond_al,Rd,AM2_6_4}),  t(OS,'ldr',{Cond_al,Rd,AM2_6_5}),  t(OS,'ldr',{Cond_al,Rd,AM2_7_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_7_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_8_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_8_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_9_1}),  t(OS,'ldr',{Cond_al,Rd,AM2_9_2}),  t(OS,'ldr',{Cond_al,Rd,AM2_9_3}),  t(OS,'ldr',{Cond_al,Rd,AM2_9_4}),  t(OS,'ldr',{Cond_al,Rd,AM2_9_5}),  t(OS,'ldrb',{Cond_al,Rd,AM2_1_1}),  t(OS,'ldrd',{Cond_al,Rd,AM3_1_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_1_1}),	% test all AM3 operands  t(OS,'ldrh',{Cond_al,Rd,AM3_1_2}),  t(OS,'ldrh',{Cond_al,Rd,AM3_2_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_2_2}),  t(OS,'ldrh',{Cond_al,Rd,AM3_3_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_3_2}),  t(OS,'ldrh',{Cond_al,Rd,AM3_4_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_4_2}),  t(OS,'ldrh',{Cond_al,Rd,AM3_5_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_5_2}),  t(OS,'ldrh',{Cond_al,Rd,AM3_6_1}),  t(OS,'ldrh',{Cond_al,Rd,AM3_6_2}),  t(OS,'ldrsb',{Cond_al,Rd,AM3_1_1}),  t(OS,'ldrsh',{Cond_al,Rd,AM3_1_1}),  t(OS,'mcr',{Cond_al,CpNum,CpOp3,Rd,CRn,CRm,CpOp3}),  t(OS,'mcr2',{CpNum,CpOp3,Rd,CRn,CRm,CpOp3}),  t(OS,'mcrr',{Cond_al,CpNum,CpOp4,Rd,Rn,CRm}),  t(OS,'mla',{Cond_al,S0,Rd,Rm,Rs,Rn}),  t(OS,'mov',{Cond_al,S0,Rd,AM1_1}),  t(OS,'mrc',{Cond_al,CpNum,CpOp3,Rd,CRn,CRm,CpOp3}),  t(OS,'mrc2',{CpNum,CpOp3,Rd,CRn,CRm,CpOp3}),  t(OS,'mrrc',{Cond_al,CpNum,CpOp4,Rd,Rn,CRm}),  t(OS,'mrs',{Cond_al,Rd,'cpsr'}),  t(OS,'msr',{Cond_al,'cpsr',FieldMask4,Imm8,Imm4}),  t(OS,'msr',{Cond_al,'cpsr',FieldMask4,Rm}),  t(OS,'mul',{Cond_al,S0,Rd,Rm,Rs}),  t(OS,'mvn',{Cond_al,S1,Rd,AM1_1}),  t(OS,'orr',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'pld',{AM2_1_1}),  t(OS,'qadd',{Cond_al,Rd,Rm,Rn}),  t(OS,'qdadd',{Cond_al,Rd,Rm,Rn}),  t(OS,'qdsub',{Cond_al,Rd,Rm,Rn}),  t(OS,'qsub',{Cond_al,Rd,Rm,Rn}),  t(OS,'rsb',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'rsc',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'sbc',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'smla',{BT0,BT0,Cond_al,Rd,Rm,Rs,Rn}),  t(OS,'smla',{BT0,BT1,Cond_al,Rd,Rm,Rs,Rn}),  t(OS,'smla',{BT1,BT0,Cond_al,Rd,Rm,Rs,Rn}),  t(OS,'smla',{BT1,BT1,Cond_al,Rd,Rm,Rs,Rn}),  t(OS,'smlal',{Cond_al,S0,RdLo,RdHi,Rm,Rs}),  t(OS,'smlal',{BT0,BT1,Cond_al,RdLo,RdHi,Rm,Rs}),  t(OS,'smlaw',{BT1,Cond_al,Rd,Rm,Rs,Rn}),  t(OS,'smull',{Cond_al,S0,RdLo,RdHi,Rm,Rs}),  t(OS,'smul',{BT1,BT0,Cond_al,Rd,Rm,Rs}),  t(OS,'smulw',{BT1,Cond_al,Rd,Rm,Rs}),  t(OS,'stc',{Cond_al,L0,CpNum,CRd,AM5_1_1}),  t(OS,'stc2',{L0,CpNum,CRd,AM5_1_1}),  t(OS,'stm',{Cond_al,AM4_1,Rn,Registers}),  t(OS,'str',{Cond_al,Rd,AM2_1_1}),  t(OS,'strb',{Cond_al,Rd,AM2_1_1}),  t(OS,'strd',{Cond_al,Rd,AM3_1_1}),  t(OS,'strh',{Cond_al,Rd,AM3_1_1}),  t(OS,'sub',{Cond_al,S0,Rd,Rn,AM1_1}),  t(OS,'swi',{Cond_al,Imm24}),  t(OS,'swp',{Cond_al,Rd,Rm,Rn}),  t(OS,'swpb',{Cond_al,Rd,Rm,Rn}),  t(OS,'teq',{Cond_al,Rn,AM1_1}),  t(OS,'tst',{Cond_al,Rn,AM1_1}),  t(OS,'umlal',{Cond_al,S0,RdLo,RdHi,Rm,Rs}),  t(OS,'umull',{Cond_al,S0,RdLo,RdHi,Rm,Rs}),  [].dotest() -> dotest1(group_leader()).dotest(File) ->  {ok,OS} = file:open(File, [write]),  dotest1(OS),  file:close(OS).-endif.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?