1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ci# The inner loop instruction sequence and the IP/FP modifications are from
10e1051a39Sopenharmony_ci# Svend Olaf Mikkelsen.
11e1051a39Sopenharmony_ci
12e1051a39Sopenharmony_ci$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
13e1051a39Sopenharmony_cipush(@INC,"${dir}","${dir}../../perlasm");
14e1051a39Sopenharmony_cirequire "x86asm.pl";
15e1051a39Sopenharmony_cirequire "cbc.pl";
16e1051a39Sopenharmony_cirequire "desboth.pl";
17e1051a39Sopenharmony_ci
18e1051a39Sopenharmony_ci# base code is in Microsoft
19e1051a39Sopenharmony_ci# op dest, source
20e1051a39Sopenharmony_ci# format.
21e1051a39Sopenharmony_ci#
22e1051a39Sopenharmony_ci
23e1051a39Sopenharmony_ci$output=pop and open STDOUT,">$output";
24e1051a39Sopenharmony_ci
25e1051a39Sopenharmony_ci&asm_init($ARGV[0]);
26e1051a39Sopenharmony_ci
27e1051a39Sopenharmony_ci$L="edi";
28e1051a39Sopenharmony_ci$R="esi";
29e1051a39Sopenharmony_ci$trans="ebp";
30e1051a39Sopenharmony_ci$small_footprint=1 if (grep(/\-DOPENSSL_SMALL_FOOTPRINT/,@ARGV));
31e1051a39Sopenharmony_ci# one can discuss setting this variable to 1 unconditionally, as
32e1051a39Sopenharmony_ci# the folded loop is only 3% slower than unrolled, but >7 times smaller
33e1051a39Sopenharmony_ci
34e1051a39Sopenharmony_ci&public_label("DES_SPtrans");
35e1051a39Sopenharmony_ci&static_label("des_sptrans");
36e1051a39Sopenharmony_ci
37e1051a39Sopenharmony_ci&DES_encrypt_internal();
38e1051a39Sopenharmony_ci&DES_decrypt_internal();
39e1051a39Sopenharmony_ci&DES_encrypt("DES_encrypt1",1);
40e1051a39Sopenharmony_ci&DES_encrypt("DES_encrypt2",0);
41e1051a39Sopenharmony_ci&DES_encrypt3("DES_encrypt3",1);
42e1051a39Sopenharmony_ci&DES_encrypt3("DES_decrypt3",0);
43e1051a39Sopenharmony_ci&cbc("DES_ncbc_encrypt","DES_encrypt1","DES_encrypt1",0,4,5,3,5,-1);
44e1051a39Sopenharmony_ci&cbc("DES_ede3_cbc_encrypt","DES_encrypt3","DES_decrypt3",0,6,7,3,4,5);
45e1051a39Sopenharmony_ci&DES_SPtrans();
46e1051a39Sopenharmony_ci
47e1051a39Sopenharmony_ci&asm_finish();
48e1051a39Sopenharmony_ci
49e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!";
50e1051a39Sopenharmony_ci
51e1051a39Sopenharmony_cisub DES_encrypt_internal()
52e1051a39Sopenharmony_ci	{
53e1051a39Sopenharmony_ci	&function_begin_B("_x86_DES_encrypt");
54e1051a39Sopenharmony_ci
55e1051a39Sopenharmony_ci	if ($small_footprint)
56e1051a39Sopenharmony_ci	    {
57e1051a39Sopenharmony_ci	    &lea("edx",&DWP(128,"ecx"));
58e1051a39Sopenharmony_ci	    &push("edx");
59e1051a39Sopenharmony_ci	    &push("ecx");
60e1051a39Sopenharmony_ci	    &set_label("eloop");
61e1051a39Sopenharmony_ci		&D_ENCRYPT(0,$L,$R,0,$trans,"eax","ebx","ecx","edx",&swtmp(0));
62e1051a39Sopenharmony_ci		&comment("");
63e1051a39Sopenharmony_ci		&D_ENCRYPT(1,$R,$L,2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
64e1051a39Sopenharmony_ci		&comment("");
65e1051a39Sopenharmony_ci		&add("ecx",16);
66e1051a39Sopenharmony_ci		&cmp("ecx",&swtmp(1));
67e1051a39Sopenharmony_ci		&mov(&swtmp(0),"ecx");
68e1051a39Sopenharmony_ci		&jb(&label("eloop"));
69e1051a39Sopenharmony_ci	    &add("esp",8);
70e1051a39Sopenharmony_ci	    }
71e1051a39Sopenharmony_ci	else
72e1051a39Sopenharmony_ci	    {
73e1051a39Sopenharmony_ci	    &push("ecx");
74e1051a39Sopenharmony_ci	    for ($i=0; $i<16; $i+=2)
75e1051a39Sopenharmony_ci		{
76e1051a39Sopenharmony_ci		&comment("Round $i");
77e1051a39Sopenharmony_ci		&D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
78e1051a39Sopenharmony_ci		&comment("Round ".sprintf("%d",$i+1));
79e1051a39Sopenharmony_ci		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
80e1051a39Sopenharmony_ci		}
81e1051a39Sopenharmony_ci	    &add("esp",4);
82e1051a39Sopenharmony_ci	}
83e1051a39Sopenharmony_ci	&ret();
84e1051a39Sopenharmony_ci
85e1051a39Sopenharmony_ci	&function_end_B("_x86_DES_encrypt");
86e1051a39Sopenharmony_ci	}
87e1051a39Sopenharmony_ci
88e1051a39Sopenharmony_cisub DES_decrypt_internal()
89e1051a39Sopenharmony_ci	{
90e1051a39Sopenharmony_ci	&function_begin_B("_x86_DES_decrypt");
91e1051a39Sopenharmony_ci
92e1051a39Sopenharmony_ci	if ($small_footprint)
93e1051a39Sopenharmony_ci	    {
94e1051a39Sopenharmony_ci	    &push("ecx");
95e1051a39Sopenharmony_ci	    &lea("ecx",&DWP(128,"ecx"));
96e1051a39Sopenharmony_ci	    &push("ecx");
97e1051a39Sopenharmony_ci	    &set_label("dloop");
98e1051a39Sopenharmony_ci		&D_ENCRYPT(0,$L,$R,-2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
99e1051a39Sopenharmony_ci		&comment("");
100e1051a39Sopenharmony_ci		&D_ENCRYPT(1,$R,$L,-4,$trans,"eax","ebx","ecx","edx",&swtmp(0));
101e1051a39Sopenharmony_ci		&comment("");
102e1051a39Sopenharmony_ci		&sub("ecx",16);
103e1051a39Sopenharmony_ci		&cmp("ecx",&swtmp(1));
104e1051a39Sopenharmony_ci		&mov(&swtmp(0),"ecx");
105e1051a39Sopenharmony_ci		&ja(&label("dloop"));
106e1051a39Sopenharmony_ci	    &add("esp",8);
107e1051a39Sopenharmony_ci	    }
108e1051a39Sopenharmony_ci	else
109e1051a39Sopenharmony_ci	    {
110e1051a39Sopenharmony_ci	    &push("ecx");
111e1051a39Sopenharmony_ci	    for ($i=15; $i>0; $i-=2)
112e1051a39Sopenharmony_ci		{
113e1051a39Sopenharmony_ci		&comment("Round $i");
114e1051a39Sopenharmony_ci		&D_ENCRYPT(15-$i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
115e1051a39Sopenharmony_ci		&comment("Round ".sprintf("%d",$i-1));
116e1051a39Sopenharmony_ci		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$trans,"eax","ebx","ecx","edx",&swtmp(0));
117e1051a39Sopenharmony_ci		}
118e1051a39Sopenharmony_ci	    &add("esp",4);
119e1051a39Sopenharmony_ci	    }
120e1051a39Sopenharmony_ci	&ret();
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ci	&function_end_B("_x86_DES_decrypt");
123e1051a39Sopenharmony_ci	}
124e1051a39Sopenharmony_ci
125e1051a39Sopenharmony_cisub DES_encrypt
126e1051a39Sopenharmony_ci	{
127e1051a39Sopenharmony_ci	local($name,$do_ip)=@_;
128e1051a39Sopenharmony_ci
129e1051a39Sopenharmony_ci	&function_begin_B($name);
130e1051a39Sopenharmony_ci
131e1051a39Sopenharmony_ci	&push("esi");
132e1051a39Sopenharmony_ci	&push("edi");
133e1051a39Sopenharmony_ci
134e1051a39Sopenharmony_ci	&comment("");
135e1051a39Sopenharmony_ci	&comment("Load the 2 words");
136e1051a39Sopenharmony_ci
137e1051a39Sopenharmony_ci	if ($do_ip)
138e1051a39Sopenharmony_ci		{
139e1051a39Sopenharmony_ci		&mov($R,&wparam(0));
140e1051a39Sopenharmony_ci		 &xor(	"ecx",		"ecx"		);
141e1051a39Sopenharmony_ci
142e1051a39Sopenharmony_ci		&push("ebx");
143e1051a39Sopenharmony_ci		&push("ebp");
144e1051a39Sopenharmony_ci
145e1051a39Sopenharmony_ci		&mov("eax",&DWP(0,$R,"",0));
146e1051a39Sopenharmony_ci		 &mov("ebx",&wparam(2));	# get encrypt flag
147e1051a39Sopenharmony_ci		&mov($L,&DWP(4,$R,"",0));
148e1051a39Sopenharmony_ci		&comment("");
149e1051a39Sopenharmony_ci		&comment("IP");
150e1051a39Sopenharmony_ci		&IP_new("eax",$L,$R,3);
151e1051a39Sopenharmony_ci		}
152e1051a39Sopenharmony_ci	else
153e1051a39Sopenharmony_ci		{
154e1051a39Sopenharmony_ci		&mov("eax",&wparam(0));
155e1051a39Sopenharmony_ci		 &xor(	"ecx",		"ecx"		);
156e1051a39Sopenharmony_ci
157e1051a39Sopenharmony_ci		&push("ebx");
158e1051a39Sopenharmony_ci		&push("ebp");
159e1051a39Sopenharmony_ci
160e1051a39Sopenharmony_ci		&mov($R,&DWP(0,"eax","",0));
161e1051a39Sopenharmony_ci		 &mov("ebx",&wparam(2));	# get encrypt flag
162e1051a39Sopenharmony_ci		&rotl($R,3);
163e1051a39Sopenharmony_ci		&mov($L,&DWP(4,"eax","",0));
164e1051a39Sopenharmony_ci		&rotl($L,3);
165e1051a39Sopenharmony_ci		}
166e1051a39Sopenharmony_ci
167e1051a39Sopenharmony_ci	# PIC-ification:-)
168e1051a39Sopenharmony_ci	&call	(&label("pic_point"));
169e1051a39Sopenharmony_ci	&set_label("pic_point");
170e1051a39Sopenharmony_ci	&blindpop($trans);
171e1051a39Sopenharmony_ci	&lea	($trans,&DWP(&label("des_sptrans")."-".&label("pic_point"),$trans));
172e1051a39Sopenharmony_ci
173e1051a39Sopenharmony_ci	&mov(	"ecx",	&wparam(1)	);
174e1051a39Sopenharmony_ci
175e1051a39Sopenharmony_ci	&cmp("ebx","0");
176e1051a39Sopenharmony_ci	&je(&label("decrypt"));
177e1051a39Sopenharmony_ci	&call("_x86_DES_encrypt");
178e1051a39Sopenharmony_ci	&jmp(&label("done"));
179e1051a39Sopenharmony_ci	&set_label("decrypt");
180e1051a39Sopenharmony_ci	&call("_x86_DES_decrypt");
181e1051a39Sopenharmony_ci	&set_label("done");
182e1051a39Sopenharmony_ci
183e1051a39Sopenharmony_ci	if ($do_ip)
184e1051a39Sopenharmony_ci		{
185e1051a39Sopenharmony_ci		&comment("");
186e1051a39Sopenharmony_ci		&comment("FP");
187e1051a39Sopenharmony_ci		&mov("edx",&wparam(0));
188e1051a39Sopenharmony_ci		&FP_new($L,$R,"eax",3);
189e1051a39Sopenharmony_ci
190e1051a39Sopenharmony_ci		&mov(&DWP(0,"edx","",0),"eax");
191e1051a39Sopenharmony_ci		&mov(&DWP(4,"edx","",0),$R);
192e1051a39Sopenharmony_ci		}
193e1051a39Sopenharmony_ci	else
194e1051a39Sopenharmony_ci		{
195e1051a39Sopenharmony_ci		&comment("");
196e1051a39Sopenharmony_ci		&comment("Fixup");
197e1051a39Sopenharmony_ci		&rotr($L,3);		# r
198e1051a39Sopenharmony_ci		 &mov("eax",&wparam(0));
199e1051a39Sopenharmony_ci		&rotr($R,3);		# l
200e1051a39Sopenharmony_ci		 &mov(&DWP(0,"eax","",0),$L);
201e1051a39Sopenharmony_ci		 &mov(&DWP(4,"eax","",0),$R);
202e1051a39Sopenharmony_ci		}
203e1051a39Sopenharmony_ci
204e1051a39Sopenharmony_ci	&pop("ebp");
205e1051a39Sopenharmony_ci	&pop("ebx");
206e1051a39Sopenharmony_ci	&pop("edi");
207e1051a39Sopenharmony_ci	&pop("esi");
208e1051a39Sopenharmony_ci	&ret();
209e1051a39Sopenharmony_ci
210e1051a39Sopenharmony_ci	&function_end_B($name);
211e1051a39Sopenharmony_ci	}
212e1051a39Sopenharmony_ci
213e1051a39Sopenharmony_cisub D_ENCRYPT
214e1051a39Sopenharmony_ci	{
215e1051a39Sopenharmony_ci	local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t,$wp1)=@_;
216e1051a39Sopenharmony_ci
217e1051a39Sopenharmony_ci	 &mov(	$u,		&DWP(&n2a($S*4),$tmp2,"",0));
218e1051a39Sopenharmony_ci	&xor(	$tmp1,		$tmp1);
219e1051a39Sopenharmony_ci	 &mov(	$t,		&DWP(&n2a(($S+1)*4),$tmp2,"",0));
220e1051a39Sopenharmony_ci	&xor(	$u,		$R);
221e1051a39Sopenharmony_ci	&xor(	$tmp2,		$tmp2);
222e1051a39Sopenharmony_ci	 &xor(	$t,		$R);
223e1051a39Sopenharmony_ci	&and(	$u,		"0xfcfcfcfc"	);
224e1051a39Sopenharmony_ci	 &and(	$t,		"0xcfcfcfcf"	);
225e1051a39Sopenharmony_ci	&movb(	&LB($tmp1),	&LB($u)	);
226e1051a39Sopenharmony_ci	 &movb(	&LB($tmp2),	&HB($u)	);
227e1051a39Sopenharmony_ci	&rotr(	$t,		4		);
228e1051a39Sopenharmony_ci	&xor(	$L,		&DWP("     ",$trans,$tmp1,0));
229e1051a39Sopenharmony_ci	 &movb(	&LB($tmp1),	&LB($t)	);
230e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x200",$trans,$tmp2,0));
231e1051a39Sopenharmony_ci	 &movb(	&LB($tmp2),	&HB($t)	);
232e1051a39Sopenharmony_ci	&shr(	$u,		16);
233e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x100",$trans,$tmp1,0));
234e1051a39Sopenharmony_ci	 &movb(	&LB($tmp1),	&HB($u)	);
235e1051a39Sopenharmony_ci	&shr(	$t,		16);
236e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x300",$trans,$tmp2,0));
237e1051a39Sopenharmony_ci	&movb(	&LB($tmp2),	&HB($t)	);
238e1051a39Sopenharmony_ci	 &and(	$u,		"0xff"	);
239e1051a39Sopenharmony_ci	&and(	$t,		"0xff"	);
240e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x600",$trans,$tmp1,0));
241e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x700",$trans,$tmp2,0));
242e1051a39Sopenharmony_ci	&mov(	$tmp2,		$wp1	);
243e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x400",$trans,$u,0));
244e1051a39Sopenharmony_ci	 &xor(	$L,		&DWP("0x500",$trans,$t,0));
245e1051a39Sopenharmony_ci	}
246e1051a39Sopenharmony_ci
247e1051a39Sopenharmony_cisub n2a
248e1051a39Sopenharmony_ci	{
249e1051a39Sopenharmony_ci	sprintf("%d",$_[0]);
250e1051a39Sopenharmony_ci	}
251e1051a39Sopenharmony_ci
252e1051a39Sopenharmony_ci# now has a side affect of rotating $a by $shift
253e1051a39Sopenharmony_cisub R_PERM_OP
254e1051a39Sopenharmony_ci	{
255e1051a39Sopenharmony_ci	local($a,$b,$tt,$shift,$mask,$last)=@_;
256e1051a39Sopenharmony_ci
257e1051a39Sopenharmony_ci	&rotl(	$a,		$shift		) if ($shift != 0);
258e1051a39Sopenharmony_ci	&mov(	$tt,		$a		);
259e1051a39Sopenharmony_ci	&xor(	$a,		$b		);
260e1051a39Sopenharmony_ci	&and(	$a,		$mask		);
261e1051a39Sopenharmony_ci	# This can never succeed, and besides it is difficult to see what the
262e1051a39Sopenharmony_ci	# idea was - Ben 13 Feb 99
263e1051a39Sopenharmony_ci	if (!$last eq $b)
264e1051a39Sopenharmony_ci		{
265e1051a39Sopenharmony_ci		&xor(	$b,		$a		);
266e1051a39Sopenharmony_ci		&xor(	$tt,		$a		);
267e1051a39Sopenharmony_ci		}
268e1051a39Sopenharmony_ci	else
269e1051a39Sopenharmony_ci		{
270e1051a39Sopenharmony_ci		&xor(	$tt,		$a		);
271e1051a39Sopenharmony_ci		&xor(	$b,		$a		);
272e1051a39Sopenharmony_ci		}
273e1051a39Sopenharmony_ci	&comment("");
274e1051a39Sopenharmony_ci	}
275e1051a39Sopenharmony_ci
276e1051a39Sopenharmony_cisub IP_new
277e1051a39Sopenharmony_ci	{
278e1051a39Sopenharmony_ci	local($l,$r,$tt,$lr)=@_;
279e1051a39Sopenharmony_ci
280e1051a39Sopenharmony_ci	&R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l);
281e1051a39Sopenharmony_ci	&R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l);
282e1051a39Sopenharmony_ci	&R_PERM_OP($l,$tt,$r,14,"0x33333333",$r);
283e1051a39Sopenharmony_ci	&R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r);
284e1051a39Sopenharmony_ci	&R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r);
285e1051a39Sopenharmony_ci
286e1051a39Sopenharmony_ci	if ($lr != 3)
287e1051a39Sopenharmony_ci		{
288e1051a39Sopenharmony_ci		if (($lr-3) < 0)
289e1051a39Sopenharmony_ci			{ &rotr($tt,	3-$lr); }
290e1051a39Sopenharmony_ci		else	{ &rotl($tt,	$lr-3); }
291e1051a39Sopenharmony_ci		}
292e1051a39Sopenharmony_ci	if ($lr != 2)
293e1051a39Sopenharmony_ci		{
294e1051a39Sopenharmony_ci		if (($lr-2) < 0)
295e1051a39Sopenharmony_ci			{ &rotr($r,	2-$lr); }
296e1051a39Sopenharmony_ci		else	{ &rotl($r,	$lr-2); }
297e1051a39Sopenharmony_ci		}
298e1051a39Sopenharmony_ci	}
299e1051a39Sopenharmony_ci
300e1051a39Sopenharmony_cisub FP_new
301e1051a39Sopenharmony_ci	{
302e1051a39Sopenharmony_ci	local($l,$r,$tt,$lr)=@_;
303e1051a39Sopenharmony_ci
304e1051a39Sopenharmony_ci	if ($lr != 2)
305e1051a39Sopenharmony_ci		{
306e1051a39Sopenharmony_ci		if (($lr-2) < 0)
307e1051a39Sopenharmony_ci			{ &rotl($r,	2-$lr); }
308e1051a39Sopenharmony_ci		else	{ &rotr($r,	$lr-2); }
309e1051a39Sopenharmony_ci		}
310e1051a39Sopenharmony_ci	if ($lr != 3)
311e1051a39Sopenharmony_ci		{
312e1051a39Sopenharmony_ci		if (($lr-3) < 0)
313e1051a39Sopenharmony_ci			{ &rotl($l,	3-$lr); }
314e1051a39Sopenharmony_ci		else	{ &rotr($l,	$lr-3); }
315e1051a39Sopenharmony_ci		}
316e1051a39Sopenharmony_ci
317e1051a39Sopenharmony_ci	&R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r);
318e1051a39Sopenharmony_ci	&R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r);
319e1051a39Sopenharmony_ci	&R_PERM_OP($l,$r,$tt,10,"0x33333333",$l);
320e1051a39Sopenharmony_ci	&R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l);
321e1051a39Sopenharmony_ci	&R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r);
322e1051a39Sopenharmony_ci	&rotr($tt	, 4);
323e1051a39Sopenharmony_ci	}
324e1051a39Sopenharmony_ci
325e1051a39Sopenharmony_cisub DES_SPtrans
326e1051a39Sopenharmony_ci	{
327e1051a39Sopenharmony_ci	&set_label("DES_SPtrans",64);
328e1051a39Sopenharmony_ci	&set_label("des_sptrans");
329e1051a39Sopenharmony_ci	&data_word(0x02080800, 0x00080000, 0x02000002, 0x02080802);
330e1051a39Sopenharmony_ci	&data_word(0x02000000, 0x00080802, 0x00080002, 0x02000002);
331e1051a39Sopenharmony_ci	&data_word(0x00080802, 0x02080800, 0x02080000, 0x00000802);
332e1051a39Sopenharmony_ci	&data_word(0x02000802, 0x02000000, 0x00000000, 0x00080002);
333e1051a39Sopenharmony_ci	&data_word(0x00080000, 0x00000002, 0x02000800, 0x00080800);
334e1051a39Sopenharmony_ci	&data_word(0x02080802, 0x02080000, 0x00000802, 0x02000800);
335e1051a39Sopenharmony_ci	&data_word(0x00000002, 0x00000800, 0x00080800, 0x02080002);
336e1051a39Sopenharmony_ci	&data_word(0x00000800, 0x02000802, 0x02080002, 0x00000000);
337e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x02080802, 0x02000800, 0x00080002);
338e1051a39Sopenharmony_ci	&data_word(0x02080800, 0x00080000, 0x00000802, 0x02000800);
339e1051a39Sopenharmony_ci	&data_word(0x02080002, 0x00000800, 0x00080800, 0x02000002);
340e1051a39Sopenharmony_ci	&data_word(0x00080802, 0x00000002, 0x02000002, 0x02080000);
341e1051a39Sopenharmony_ci	&data_word(0x02080802, 0x00080800, 0x02080000, 0x02000802);
342e1051a39Sopenharmony_ci	&data_word(0x02000000, 0x00000802, 0x00080002, 0x00000000);
343e1051a39Sopenharmony_ci	&data_word(0x00080000, 0x02000000, 0x02000802, 0x02080800);
344e1051a39Sopenharmony_ci	&data_word(0x00000002, 0x02080002, 0x00000800, 0x00080802);
345e1051a39Sopenharmony_ci	# nibble 1
346e1051a39Sopenharmony_ci	&data_word(0x40108010, 0x00000000, 0x00108000, 0x40100000);
347e1051a39Sopenharmony_ci	&data_word(0x40000010, 0x00008010, 0x40008000, 0x00108000);
348e1051a39Sopenharmony_ci	&data_word(0x00008000, 0x40100010, 0x00000010, 0x40008000);
349e1051a39Sopenharmony_ci	&data_word(0x00100010, 0x40108000, 0x40100000, 0x00000010);
350e1051a39Sopenharmony_ci	&data_word(0x00100000, 0x40008010, 0x40100010, 0x00008000);
351e1051a39Sopenharmony_ci	&data_word(0x00108010, 0x40000000, 0x00000000, 0x00100010);
352e1051a39Sopenharmony_ci	&data_word(0x40008010, 0x00108010, 0x40108000, 0x40000010);
353e1051a39Sopenharmony_ci	&data_word(0x40000000, 0x00100000, 0x00008010, 0x40108010);
354e1051a39Sopenharmony_ci	&data_word(0x00100010, 0x40108000, 0x40008000, 0x00108010);
355e1051a39Sopenharmony_ci	&data_word(0x40108010, 0x00100010, 0x40000010, 0x00000000);
356e1051a39Sopenharmony_ci	&data_word(0x40000000, 0x00008010, 0x00100000, 0x40100010);
357e1051a39Sopenharmony_ci	&data_word(0x00008000, 0x40000000, 0x00108010, 0x40008010);
358e1051a39Sopenharmony_ci	&data_word(0x40108000, 0x00008000, 0x00000000, 0x40000010);
359e1051a39Sopenharmony_ci	&data_word(0x00000010, 0x40108010, 0x00108000, 0x40100000);
360e1051a39Sopenharmony_ci	&data_word(0x40100010, 0x00100000, 0x00008010, 0x40008000);
361e1051a39Sopenharmony_ci	&data_word(0x40008010, 0x00000010, 0x40100000, 0x00108000);
362e1051a39Sopenharmony_ci	# nibble 2
363e1051a39Sopenharmony_ci	&data_word(0x04000001, 0x04040100, 0x00000100, 0x04000101);
364e1051a39Sopenharmony_ci	&data_word(0x00040001, 0x04000000, 0x04000101, 0x00040100);
365e1051a39Sopenharmony_ci	&data_word(0x04000100, 0x00040000, 0x04040000, 0x00000001);
366e1051a39Sopenharmony_ci	&data_word(0x04040101, 0x00000101, 0x00000001, 0x04040001);
367e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x00040001, 0x04040100, 0x00000100);
368e1051a39Sopenharmony_ci	&data_word(0x00000101, 0x04040101, 0x00040000, 0x04000001);
369e1051a39Sopenharmony_ci	&data_word(0x04040001, 0x04000100, 0x00040101, 0x04040000);
370e1051a39Sopenharmony_ci	&data_word(0x00040100, 0x00000000, 0x04000000, 0x00040101);
371e1051a39Sopenharmony_ci	&data_word(0x04040100, 0x00000100, 0x00000001, 0x00040000);
372e1051a39Sopenharmony_ci	&data_word(0x00000101, 0x00040001, 0x04040000, 0x04000101);
373e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x04040100, 0x00040100, 0x04040001);
374e1051a39Sopenharmony_ci	&data_word(0x00040001, 0x04000000, 0x04040101, 0x00000001);
375e1051a39Sopenharmony_ci	&data_word(0x00040101, 0x04000001, 0x04000000, 0x04040101);
376e1051a39Sopenharmony_ci	&data_word(0x00040000, 0x04000100, 0x04000101, 0x00040100);
377e1051a39Sopenharmony_ci	&data_word(0x04000100, 0x00000000, 0x04040001, 0x00000101);
378e1051a39Sopenharmony_ci	&data_word(0x04000001, 0x00040101, 0x00000100, 0x04040000);
379e1051a39Sopenharmony_ci	# nibble 3
380e1051a39Sopenharmony_ci	&data_word(0x00401008, 0x10001000, 0x00000008, 0x10401008);
381e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x10400000, 0x10001008, 0x00400008);
382e1051a39Sopenharmony_ci	&data_word(0x10401000, 0x10000008, 0x10000000, 0x00001008);
383e1051a39Sopenharmony_ci	&data_word(0x10000008, 0x00401008, 0x00400000, 0x10000000);
384e1051a39Sopenharmony_ci	&data_word(0x10400008, 0x00401000, 0x00001000, 0x00000008);
385e1051a39Sopenharmony_ci	&data_word(0x00401000, 0x10001008, 0x10400000, 0x00001000);
386e1051a39Sopenharmony_ci	&data_word(0x00001008, 0x00000000, 0x00400008, 0x10401000);
387e1051a39Sopenharmony_ci	&data_word(0x10001000, 0x10400008, 0x10401008, 0x00400000);
388e1051a39Sopenharmony_ci	&data_word(0x10400008, 0x00001008, 0x00400000, 0x10000008);
389e1051a39Sopenharmony_ci	&data_word(0x00401000, 0x10001000, 0x00000008, 0x10400000);
390e1051a39Sopenharmony_ci	&data_word(0x10001008, 0x00000000, 0x00001000, 0x00400008);
391e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x10400008, 0x10401000, 0x00001000);
392e1051a39Sopenharmony_ci	&data_word(0x10000000, 0x10401008, 0x00401008, 0x00400000);
393e1051a39Sopenharmony_ci	&data_word(0x10401008, 0x00000008, 0x10001000, 0x00401008);
394e1051a39Sopenharmony_ci	&data_word(0x00400008, 0x00401000, 0x10400000, 0x10001008);
395e1051a39Sopenharmony_ci	&data_word(0x00001008, 0x10000000, 0x10000008, 0x10401000);
396e1051a39Sopenharmony_ci	# nibble 4
397e1051a39Sopenharmony_ci	&data_word(0x08000000, 0x00010000, 0x00000400, 0x08010420);
398e1051a39Sopenharmony_ci	&data_word(0x08010020, 0x08000400, 0x00010420, 0x08010000);
399e1051a39Sopenharmony_ci	&data_word(0x00010000, 0x00000020, 0x08000020, 0x00010400);
400e1051a39Sopenharmony_ci	&data_word(0x08000420, 0x08010020, 0x08010400, 0x00000000);
401e1051a39Sopenharmony_ci	&data_word(0x00010400, 0x08000000, 0x00010020, 0x00000420);
402e1051a39Sopenharmony_ci	&data_word(0x08000400, 0x00010420, 0x00000000, 0x08000020);
403e1051a39Sopenharmony_ci	&data_word(0x00000020, 0x08000420, 0x08010420, 0x00010020);
404e1051a39Sopenharmony_ci	&data_word(0x08010000, 0x00000400, 0x00000420, 0x08010400);
405e1051a39Sopenharmony_ci	&data_word(0x08010400, 0x08000420, 0x00010020, 0x08010000);
406e1051a39Sopenharmony_ci	&data_word(0x00010000, 0x00000020, 0x08000020, 0x08000400);
407e1051a39Sopenharmony_ci	&data_word(0x08000000, 0x00010400, 0x08010420, 0x00000000);
408e1051a39Sopenharmony_ci	&data_word(0x00010420, 0x08000000, 0x00000400, 0x00010020);
409e1051a39Sopenharmony_ci	&data_word(0x08000420, 0x00000400, 0x00000000, 0x08010420);
410e1051a39Sopenharmony_ci	&data_word(0x08010020, 0x08010400, 0x00000420, 0x00010000);
411e1051a39Sopenharmony_ci	&data_word(0x00010400, 0x08010020, 0x08000400, 0x00000420);
412e1051a39Sopenharmony_ci	&data_word(0x00000020, 0x00010420, 0x08010000, 0x08000020);
413e1051a39Sopenharmony_ci	# nibble 5
414e1051a39Sopenharmony_ci	&data_word(0x80000040, 0x00200040, 0x00000000, 0x80202000);
415e1051a39Sopenharmony_ci	&data_word(0x00200040, 0x00002000, 0x80002040, 0x00200000);
416e1051a39Sopenharmony_ci	&data_word(0x00002040, 0x80202040, 0x00202000, 0x80000000);
417e1051a39Sopenharmony_ci	&data_word(0x80002000, 0x80000040, 0x80200000, 0x00202040);
418e1051a39Sopenharmony_ci	&data_word(0x00200000, 0x80002040, 0x80200040, 0x00000000);
419e1051a39Sopenharmony_ci	&data_word(0x00002000, 0x00000040, 0x80202000, 0x80200040);
420e1051a39Sopenharmony_ci	&data_word(0x80202040, 0x80200000, 0x80000000, 0x00002040);
421e1051a39Sopenharmony_ci	&data_word(0x00000040, 0x00202000, 0x00202040, 0x80002000);
422e1051a39Sopenharmony_ci	&data_word(0x00002040, 0x80000000, 0x80002000, 0x00202040);
423e1051a39Sopenharmony_ci	&data_word(0x80202000, 0x00200040, 0x00000000, 0x80002000);
424e1051a39Sopenharmony_ci	&data_word(0x80000000, 0x00002000, 0x80200040, 0x00200000);
425e1051a39Sopenharmony_ci	&data_word(0x00200040, 0x80202040, 0x00202000, 0x00000040);
426e1051a39Sopenharmony_ci	&data_word(0x80202040, 0x00202000, 0x00200000, 0x80002040);
427e1051a39Sopenharmony_ci	&data_word(0x80000040, 0x80200000, 0x00202040, 0x00000000);
428e1051a39Sopenharmony_ci	&data_word(0x00002000, 0x80000040, 0x80002040, 0x80202000);
429e1051a39Sopenharmony_ci	&data_word(0x80200000, 0x00002040, 0x00000040, 0x80200040);
430e1051a39Sopenharmony_ci	# nibble 6
431e1051a39Sopenharmony_ci	&data_word(0x00004000, 0x00000200, 0x01000200, 0x01000004);
432e1051a39Sopenharmony_ci	&data_word(0x01004204, 0x00004004, 0x00004200, 0x00000000);
433e1051a39Sopenharmony_ci	&data_word(0x01000000, 0x01000204, 0x00000204, 0x01004000);
434e1051a39Sopenharmony_ci	&data_word(0x00000004, 0x01004200, 0x01004000, 0x00000204);
435e1051a39Sopenharmony_ci	&data_word(0x01000204, 0x00004000, 0x00004004, 0x01004204);
436e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x01000200, 0x01000004, 0x00004200);
437e1051a39Sopenharmony_ci	&data_word(0x01004004, 0x00004204, 0x01004200, 0x00000004);
438e1051a39Sopenharmony_ci	&data_word(0x00004204, 0x01004004, 0x00000200, 0x01000000);
439e1051a39Sopenharmony_ci	&data_word(0x00004204, 0x01004000, 0x01004004, 0x00000204);
440e1051a39Sopenharmony_ci	&data_word(0x00004000, 0x00000200, 0x01000000, 0x01004004);
441e1051a39Sopenharmony_ci	&data_word(0x01000204, 0x00004204, 0x00004200, 0x00000000);
442e1051a39Sopenharmony_ci	&data_word(0x00000200, 0x01000004, 0x00000004, 0x01000200);
443e1051a39Sopenharmony_ci	&data_word(0x00000000, 0x01000204, 0x01000200, 0x00004200);
444e1051a39Sopenharmony_ci	&data_word(0x00000204, 0x00004000, 0x01004204, 0x01000000);
445e1051a39Sopenharmony_ci	&data_word(0x01004200, 0x00000004, 0x00004004, 0x01004204);
446e1051a39Sopenharmony_ci	&data_word(0x01000004, 0x01004200, 0x01004000, 0x00004004);
447e1051a39Sopenharmony_ci	# nibble 7
448e1051a39Sopenharmony_ci	&data_word(0x20800080, 0x20820000, 0x00020080, 0x00000000);
449e1051a39Sopenharmony_ci	&data_word(0x20020000, 0x00800080, 0x20800000, 0x20820080);
450e1051a39Sopenharmony_ci	&data_word(0x00000080, 0x20000000, 0x00820000, 0x00020080);
451e1051a39Sopenharmony_ci	&data_word(0x00820080, 0x20020080, 0x20000080, 0x20800000);
452e1051a39Sopenharmony_ci	&data_word(0x00020000, 0x00820080, 0x00800080, 0x20020000);
453e1051a39Sopenharmony_ci	&data_word(0x20820080, 0x20000080, 0x00000000, 0x00820000);
454e1051a39Sopenharmony_ci	&data_word(0x20000000, 0x00800000, 0x20020080, 0x20800080);
455e1051a39Sopenharmony_ci	&data_word(0x00800000, 0x00020000, 0x20820000, 0x00000080);
456e1051a39Sopenharmony_ci	&data_word(0x00800000, 0x00020000, 0x20000080, 0x20820080);
457e1051a39Sopenharmony_ci	&data_word(0x00020080, 0x20000000, 0x00000000, 0x00820000);
458e1051a39Sopenharmony_ci	&data_word(0x20800080, 0x20020080, 0x20020000, 0x00800080);
459e1051a39Sopenharmony_ci	&data_word(0x20820000, 0x00000080, 0x00800080, 0x20020000);
460e1051a39Sopenharmony_ci	&data_word(0x20820080, 0x00800000, 0x20800000, 0x20000080);
461e1051a39Sopenharmony_ci	&data_word(0x00820000, 0x00020080, 0x20020080, 0x20800000);
462e1051a39Sopenharmony_ci	&data_word(0x00000080, 0x20820000, 0x00820080, 0x00000000);
463e1051a39Sopenharmony_ci	&data_word(0x20000000, 0x20800080, 0x00020000, 0x00820080);
464e1051a39Sopenharmony_ci	}
465