Method: Tem::Benchmarks#vm_perf_seclosure

Defined in:
lib/tem/benchmarks/vm_perf.rb

#vm_perf_seclosureObject

The SEClosure used in the vm_perf benchmark.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/tem/benchmarks/vm_perf.rb', line 14

def vm_perf_seclosure
  @tem.assemble { |s|
    s.ldwc 48 * 10
    s.outnew

    s.ldwc 10 # number of times to loop (4 instructions in loop)
    s.label :main_loop      

    # arithmetic (18 instructions, 10 bytes out)
    s.ldwc 0x1234
    s.ldwc 0x5678
    s.dupn :n => 2
    s.add
    s.outw
    s.sub
    s.outw
    s.ldwc 0x0155
    s.ldwc 0x02AA
    s.mul
    s.outw
    s.ldwc 0x390C
    s.ldwc 0x00AA
    s.dupn :n => 2
    s.div
    s.outw
    s.mod
    s.outw
    
    # memory (28 instructions, 16 bytes out)
    s.ldwc 0x55AA
    s.stw :clobber
    s.ldb :clobber
    s.outw
    s.ldw :clobber
    s.outw
    s.ldbc 0xA5 - (1 << 8)
    s.stb :clobber
    s.ldw :clobber
    s.outw
    s.ldwc :clobber2
    s.dupn :n => 1
    s.dupn :n => 2
    s.ldwc 0x9966 - (1 << 16)
    s.stwv
    s.ldbv
    s.outw
    s.ldbc 0x98 - (1 << 8)
    s.stbv
    s.ldwv
    s.outw
    s.ldwc 0x1122
    s.ldwc 0x3344
    s.ldwc 0x5566
    s.flipn :n => 3
    s.outw
    s.outw
    s.outw
    
    # memory comparisons (22 instructions, 16 bytes out)
    s.ldwc :const => 6
    s.ldwc :cmp_med
    s.ldwc :cmp_lo
    s.mcmpvb
    s.outw
    s.mcmpfxb :size => 6, :op1 => :cmp_med, :op2 => :cmp_hi
    s.outw
    s.ldwc :const => 4
    s.ldwc :cmp_lo
    s.ldwc :cmp_med
    s.mcmpvb
    s.outw            
    s.mcfxb :size => 6, :from => :cmp_hi, :to => :copy_buf
    s.pop
    s.outfxb :size => 6, :from => :copy_buf      
    s.ldwc :const => 4
    s.ldwc :cmp_hi
    s.ldwc :copy_buf2
    s.mcvb
    s.pop
    s.outfxb :size => 4, :from => :copy_buf2            
    
    # jumps (30 instructions, 6 bytes) from 6 * (5 instructions, 1 byte)
    failed = 0xFA - (1 << 8)
    [
      [:ja,  [1, 1, failed]],
      [:jae, [1, 4, failed]], 
      [:jb,  [1, failed, 7]],
      [:jbe, [1, failed, 10]],
      [:jz,  [1, failed, 13]],
      [:jne, [1, 16, failed]], 
    ].each do |op_line|
      op = op_line.shift
      op_line.each_index do |i|
        then_label = "#{op}_l#{i}_t".to_sym
        out_label  = "#{op}_l#{i}_o".to_sym
        
        s.ldbc op_line[i][0]        
        s.send op, :to => then_label
        s.ldbc op_line[i][2]
        s.jmp :to => out_label
        s.label then_label
        s.ldbc op_line[i][1]
        s.label out_label
        s.outb          
      end
    end

    # loop back
    s.ldbc 1
    s.sub
    s.dupn :n => 1
    s.ja :to => :main_loop
    
    s.label :done
    s.halt
    
    s.label :cmp_lo
    s.data :tem_ubyte, [0xA3, 0x2C, 0x51, 0x63, 0x2C, 0x12]
    s.label :cmp_med
    s.data :tem_ubyte, [0xA3, 0x2C, 0x51, 0x63, 0x2D, 0x11]
    s.label :cmp_hi
    s.data :tem_ubyte, [0xA3, 0x2C, 0x51, 0x63, 0x2E, 0x10]
    s.label :cmp_hi2
    s.data :tem_ubyte, [0xA3, 0x2C, 0x51, 0x63, 0x2E, 0x10]
    s.label :copy_buf
    s.zeros :tem_ubyte, 6
    s.label :copy_buf2
    s.zeros :tem_ubyte, 4      
    s.label :clobber
    s.zeros :tem_ubyte, 2
    s.label :clobber2
    s.zeros :tem_ubyte, 2
    s.label :stack
    s.stack 12
  }
end