1// Based on cmd/internal/obj/ppc64/a.out.go.
2//
3//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
4//	Portions Copyright © 1995-1997 C H Forsyth ([email protected])
5//	Portions Copyright © 1997-1999 Vita Nuova Limited
6//	Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
7//	Portions Copyright © 2004,2006 Bruce Ellis
8//	Portions Copyright © 2005-2007 C H Forsyth ([email protected])
9//	Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
10//	Portions Copyright © 2009 The Go Authors. All rights reserved.
11//
12// Permission is hereby granted, free of charge, to any person obtaining a copy
13// of this software and associated documentation files (the "Software"), to deal
14// in the Software without restriction, including without limitation the rights
15// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16// copies of the Software, and to permit persons to whom the Software is
17// furnished to do so, subject to the following conditions:
18//
19// The above copyright notice and this permission notice shall be included in
20// all copies or substantial portions of the Software.
21//
22// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28// THE SOFTWARE.
29
30package s390x
31
32import "cmd/internal/obj"
33
34//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p s390x
35
36const (
37	NSNAME = 8
38	NSYM   = 50
39	NREG   = 16 // number of general purpose registers
40	NFREG  = 16 // number of floating point registers
41)
42
43const (
44	// General purpose registers (GPRs).
45	REG_R0 = obj.RBaseS390X + iota
46	REG_R1
47	REG_R2
48	REG_R3
49	REG_R4
50	REG_R5
51	REG_R6
52	REG_R7
53	REG_R8
54	REG_R9
55	REG_R10
56	REG_R11
57	REG_R12
58	REG_R13
59	REG_R14
60	REG_R15
61
62	// Floating point registers (FPRs).
63	REG_F0
64	REG_F1
65	REG_F2
66	REG_F3
67	REG_F4
68	REG_F5
69	REG_F6
70	REG_F7
71	REG_F8
72	REG_F9
73	REG_F10
74	REG_F11
75	REG_F12
76	REG_F13
77	REG_F14
78	REG_F15
79
80	// Vector registers (VRs) - only available when the vector
81	// facility is installed.
82	// V0-V15 are aliases for F0-F15.
83	// We keep them in a separate space to make printing etc. easier
84	// If the code generator ever emits vector instructions it will
85	// need to take into account the aliasing.
86	REG_V0
87	REG_V1
88	REG_V2
89	REG_V3
90	REG_V4
91	REG_V5
92	REG_V6
93	REG_V7
94	REG_V8
95	REG_V9
96	REG_V10
97	REG_V11
98	REG_V12
99	REG_V13
100	REG_V14
101	REG_V15
102	REG_V16
103	REG_V17
104	REG_V18
105	REG_V19
106	REG_V20
107	REG_V21
108	REG_V22
109	REG_V23
110	REG_V24
111	REG_V25
112	REG_V26
113	REG_V27
114	REG_V28
115	REG_V29
116	REG_V30
117	REG_V31
118
119	// Access registers (ARs).
120	// The thread pointer is typically stored in the register pair
121	// AR0 and AR1.
122	REG_AR0
123	REG_AR1
124	REG_AR2
125	REG_AR3
126	REG_AR4
127	REG_AR5
128	REG_AR6
129	REG_AR7
130	REG_AR8
131	REG_AR9
132	REG_AR10
133	REG_AR11
134	REG_AR12
135	REG_AR13
136	REG_AR14
137	REG_AR15
138
139	REG_RESERVED // end of allocated registers
140
141	REGARG  = -1      // -1 disables passing the first argument in register
142	REGRT1  = REG_R3  // used during zeroing of the stack - not reserved
143	REGRT2  = REG_R4  // used during zeroing of the stack - not reserved
144	REGTMP  = REG_R10 // scratch register used in the assembler and linker
145	REGTMP2 = REG_R11 // scratch register used in the assembler and linker
146	REGCTXT = REG_R12 // context for closures
147	REGG    = REG_R13 // G
148	REG_LR  = REG_R14 // link register
149	REGSP   = REG_R15 // stack pointer
150)
151
152// LINUX for zSeries ELF Application Binary Interface Supplement
153// https://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_zSeries/x1472.html
154var S390XDWARFRegisters = map[int16]int16{}
155
156func init() {
157	// f assigns dwarfregisters[from:to by step] = (base):((to-from)/step+base)
158	f := func(from, step, to, base int16) {
159		for r := int16(from); r <= to; r += step {
160			S390XDWARFRegisters[r] = (r-from)/step + base
161		}
162	}
163	f(REG_R0, 1, REG_R15, 0)
164
165	f(REG_F0, 2, REG_F6, 16)
166	f(REG_F1, 2, REG_F7, 20)
167	f(REG_F8, 2, REG_F14, 24)
168	f(REG_F9, 2, REG_F15, 28)
169
170	f(REG_V0, 2, REG_V6, 16) // V0:15 aliased to F0:15
171	f(REG_V1, 2, REG_V7, 20) // TODO what about V16:31?
172	f(REG_V8, 2, REG_V14, 24)
173	f(REG_V9, 2, REG_V15, 28)
174
175	f(REG_AR0, 1, REG_AR15, 48)
176}
177
178const (
179	BIG    = 32768 - 8
180	DISP12 = 4096
181	DISP16 = 65536
182	DISP20 = 1048576
183)
184
185const (
186	// mark flags
187	LEAF = 1 << iota
188	BRANCH
189	USETMP // generated code of this Prog uses REGTMP
190)
191
192const ( // comments from func aclass in asmz.go
193	C_NONE     = iota
194	C_REG      // general-purpose register (64-bit)
195	C_FREG     // floating-point register (64-bit)
196	C_VREG     // vector register (128-bit)
197	C_AREG     // access register (32-bit)
198	C_ZCON     // constant == 0
199	C_SCON     // 0 <= constant <= 0x7fff (positive int16)
200	C_UCON     // constant & 0xffff == 0 (int16 or uint16)
201	C_ADDCON   // 0 > constant >= -0x8000 (negative int16)
202	C_ANDCON   // constant <= 0xffff
203	C_LCON     // constant (int32 or uint32)
204	C_DCON     // constant (int64 or uint64)
205	C_SACON    // computed address, 16-bit displacement, possibly SP-relative
206	C_LACON    // computed address, 32-bit displacement, possibly SP-relative
207	C_DACON    // computed address, 64-bit displacement?
208	C_SBRA     // short branch
209	C_LBRA     // long branch
210	C_SAUTO    // short auto
211	C_LAUTO    // long auto
212	C_ZOREG    // heap address, register-based, displacement == 0
213	C_SOREG    // heap address, register-based, int16 displacement
214	C_LOREG    // heap address, register-based, int32 displacement
215	C_TLS_LE   // TLS - local exec model (for executables)
216	C_TLS_IE   // TLS - initial exec model (for shared libraries loaded at program startup)
217	C_GOK      // general address
218	C_ADDR     // relocation for extern or static symbols (loads and stores)
219	C_SYMADDR  // relocation for extern or static symbols (address taking)
220	C_GOTADDR  // GOT slot for a symbol in -dynlink mode
221	C_TEXTSIZE // text size
222	C_ANY
223	C_NCLASS // must be the last
224)
225
226const (
227	// integer arithmetic
228	AADD = obj.ABaseS390X + obj.A_ARCHSPECIFIC + iota
229	AADDC
230	AADDE
231	AADDW
232	ADIVW
233	ADIVWU
234	ADIVD
235	ADIVDU
236	AMODW
237	AMODWU
238	AMODD
239	AMODDU
240	AMULLW
241	AMULLD
242	AMULHD
243	AMULHDU
244	AMLGR
245	ASUB
246	ASUBC
247	ASUBV
248	ASUBE
249	ASUBW
250	ANEG
251	ANEGW
252
253	// integer moves
254	AMOVWBR
255	AMOVB
256	AMOVBZ
257	AMOVH
258	AMOVHBR
259	AMOVHZ
260	AMOVW
261	AMOVWZ
262	AMOVD
263	AMOVDBR
264
265	// conditional moves
266	AMOVDEQ
267	AMOVDGE
268	AMOVDGT
269	AMOVDLE
270	AMOVDLT
271	AMOVDNE
272	ALOCR
273	ALOCGR
274
275	// find leftmost one
276	AFLOGR
277
278	// population count
279	APOPCNT
280
281	// integer bitwise
282	AAND
283	AANDW
284	AOR
285	AORW
286	AXOR
287	AXORW
288	ASLW
289	ASLD
290	ASRW
291	ASRAW
292	ASRD
293	ASRAD
294	ARLL
295	ARLLG
296	ARNSBG
297	ARXSBG
298	AROSBG
299	ARNSBGT
300	ARXSBGT
301	AROSBGT
302	ARISBG
303	ARISBGN
304	ARISBGZ
305	ARISBGNZ
306	ARISBHG
307	ARISBLG
308	ARISBHGZ
309	ARISBLGZ
310
311	// floating point
312	AFABS
313	AFADD
314	AFADDS
315	AFCMPO
316	AFCMPU
317	ACEBR
318	AFDIV
319	AFDIVS
320	AFMADD
321	AFMADDS
322	AFMOVD
323	AFMOVS
324	AFMSUB
325	AFMSUBS
326	AFMUL
327	AFMULS
328	AFNABS
329	AFNEG
330	AFNEGS
331	ALEDBR
332	ALDEBR
333	ALPDFR
334	ALNDFR
335	AFSUB
336	AFSUBS
337	AFSQRT
338	AFSQRTS
339	AFIEBR
340	AFIDBR
341	ACPSDR
342	ALTEBR
343	ALTDBR
344	ATCEB
345	ATCDB
346
347	// move from GPR to FPR and vice versa
348	ALDGR
349	ALGDR
350
351	// convert from int32/int64 to float/float64
352	ACEFBRA
353	ACDFBRA
354	ACEGBRA
355	ACDGBRA
356
357	// convert from float/float64 to int32/int64
358	ACFEBRA
359	ACFDBRA
360	ACGEBRA
361	ACGDBRA
362
363	// convert from uint32/uint64 to float/float64
364	ACELFBR
365	ACDLFBR
366	ACELGBR
367	ACDLGBR
368
369	// convert from float/float64 to uint32/uint64
370	ACLFEBR
371	ACLFDBR
372	ACLGEBR
373	ACLGDBR
374
375	// compare
376	ACMP
377	ACMPU
378	ACMPW
379	ACMPWU
380
381	// test under mask
382	ATMHH
383	ATMHL
384	ATMLH
385	ATMLL
386
387	// insert program mask
388	AIPM
389
390	// set program mask
391	ASPM
392
393	// compare and swap
394	ACS
395	ACSG
396
397	// serialize
398	ASYNC
399
400	// branch
401	ABC
402	ABCL
403	ABRC
404	ABEQ
405	ABGE
406	ABGT
407	ABLE
408	ABLT
409	ABLEU
410	ABLTU
411	ABNE
412	ABVC
413	ABVS
414	ASYSCALL
415
416	// branch on count
417	ABRCT
418	ABRCTG
419
420	// compare and branch
421	ACRJ
422	ACGRJ
423	ACLRJ
424	ACLGRJ
425	ACIJ
426	ACGIJ
427	ACLIJ
428	ACLGIJ
429	ACMPBEQ
430	ACMPBGE
431	ACMPBGT
432	ACMPBLE
433	ACMPBLT
434	ACMPBNE
435	ACMPUBEQ
436	ACMPUBGE
437	ACMPUBGT
438	ACMPUBLE
439	ACMPUBLT
440	ACMPUBNE
441
442	// storage-and-storage
443	AMVC
444	AMVCIN
445	ACLC
446	AXC
447	AOC
448	ANC
449
450	// load
451	AEXRL
452	ALARL
453	ALA
454	ALAY
455
456	// interlocked load and op
457	ALAA
458	ALAAG
459	ALAAL
460	ALAALG
461	ALAN
462	ALANG
463	ALAX
464	ALAXG
465	ALAO
466	ALAOG
467
468	// load/store multiple
469	ALMY
470	ALMG
471	ASTMY
472	ASTMG
473
474	// store clock
475	ASTCK
476	ASTCKC
477	ASTCKE
478	ASTCKF
479
480	// macros
481	ACLEAR
482
483	// crypto
484	AKM
485	AKMC
486	AKLMD
487	AKIMD
488	AKDSA
489	AKMA
490	AKMCTR
491
492	// vector
493	AVA
494	AVAB
495	AVAH
496	AVAF
497	AVAG
498	AVAQ
499	AVACC
500	AVACCB
501	AVACCH
502	AVACCF
503	AVACCG
504	AVACCQ
505	AVAC
506	AVACQ
507	AVACCC
508	AVACCCQ
509	AVN
510	AVNC
511	AVAVG
512	AVAVGB
513	AVAVGH
514	AVAVGF
515	AVAVGG
516	AVAVGL
517	AVAVGLB
518	AVAVGLH
519	AVAVGLF
520	AVAVGLG
521	AVCKSM
522	AVCEQ
523	AVCEQB
524	AVCEQH
525	AVCEQF
526	AVCEQG
527	AVCEQBS
528	AVCEQHS
529	AVCEQFS
530	AVCEQGS
531	AVCH
532	AVCHB
533	AVCHH
534	AVCHF
535	AVCHG
536	AVCHBS
537	AVCHHS
538	AVCHFS
539	AVCHGS
540	AVCHL
541	AVCHLB
542	AVCHLH
543	AVCHLF
544	AVCHLG
545	AVCHLBS
546	AVCHLHS
547	AVCHLFS
548	AVCHLGS
549	AVCLZ
550	AVCLZB
551	AVCLZH
552	AVCLZF
553	AVCLZG
554	AVCTZ
555	AVCTZB
556	AVCTZH
557	AVCTZF
558	AVCTZG
559	AVEC
560	AVECB
561	AVECH
562	AVECF
563	AVECG
564	AVECL
565	AVECLB
566	AVECLH
567	AVECLF
568	AVECLG
569	AVERIM
570	AVERIMB
571	AVERIMH
572	AVERIMF
573	AVERIMG
574	AVERLL
575	AVERLLB
576	AVERLLH
577	AVERLLF
578	AVERLLG
579	AVERLLV
580	AVERLLVB
581	AVERLLVH
582	AVERLLVF
583	AVERLLVG
584	AVESLV
585	AVESLVB
586	AVESLVH
587	AVESLVF
588	AVESLVG
589	AVESL
590	AVESLB
591	AVESLH
592	AVESLF
593	AVESLG
594	AVESRA
595	AVESRAB
596	AVESRAH
597	AVESRAF
598	AVESRAG
599	AVESRAV
600	AVESRAVB
601	AVESRAVH
602	AVESRAVF
603	AVESRAVG
604	AVESRL
605	AVESRLB
606	AVESRLH
607	AVESRLF
608	AVESRLG
609	AVESRLV
610	AVESRLVB
611	AVESRLVH
612	AVESRLVF
613	AVESRLVG
614	AVX
615	AVFAE
616	AVFAEB
617	AVFAEH
618	AVFAEF
619	AVFAEBS
620	AVFAEHS
621	AVFAEFS
622	AVFAEZB
623	AVFAEZH
624	AVFAEZF
625	AVFAEZBS
626	AVFAEZHS
627	AVFAEZFS
628	AVFEE
629	AVFEEB
630	AVFEEH
631	AVFEEF
632	AVFEEBS
633	AVFEEHS
634	AVFEEFS
635	AVFEEZB
636	AVFEEZH
637	AVFEEZF
638	AVFEEZBS
639	AVFEEZHS
640	AVFEEZFS
641	AVFENE
642	AVFENEB
643	AVFENEH
644	AVFENEF
645	AVFENEBS
646	AVFENEHS
647	AVFENEFS
648	AVFENEZB
649	AVFENEZH
650	AVFENEZF
651	AVFENEZBS
652	AVFENEZHS
653	AVFENEZFS
654	AVFA
655	AVFADB
656	AWFADB
657	AWFK
658	AWFKDB
659	AVFCE
660	AVFCEDB
661	AVFCEDBS
662	AWFCEDB
663	AWFCEDBS
664	AVFCH
665	AVFCHDB
666	AVFCHDBS
667	AWFCHDB
668	AWFCHDBS
669	AVFCHE
670	AVFCHEDB
671	AVFCHEDBS
672	AWFCHEDB
673	AWFCHEDBS
674	AWFC
675	AWFCDB
676	AVCDG
677	AVCDGB
678	AWCDGB
679	AVCDLG
680	AVCDLGB
681	AWCDLGB
682	AVCGD
683	AVCGDB
684	AWCGDB
685	AVCLGD
686	AVCLGDB
687	AWCLGDB
688	AVFD
689	AVFDDB
690	AWFDDB
691	AVLDE
692	AVLDEB
693	AWLDEB
694	AVLED
695	AVLEDB
696	AWLEDB
697	AVFM
698	AVFMDB
699	AWFMDB
700	AVFMA
701	AVFMADB
702	AWFMADB
703	AVFMS
704	AVFMSDB
705	AWFMSDB
706	AVFPSO
707	AVFPSODB
708	AWFPSODB
709	AVFLCDB
710	AWFLCDB
711	AVFLNDB
712	AWFLNDB
713	AVFLPDB
714	AWFLPDB
715	AVFSQ
716	AVFSQDB
717	AWFSQDB
718	AVFS
719	AVFSDB
720	AWFSDB
721	AVFTCI
722	AVFTCIDB
723	AWFTCIDB
724	AVGFM
725	AVGFMB
726	AVGFMH
727	AVGFMF
728	AVGFMG
729	AVGFMA
730	AVGFMAB
731	AVGFMAH
732	AVGFMAF
733	AVGFMAG
734	AVGEF
735	AVGEG
736	AVGBM
737	AVZERO
738	AVONE
739	AVGM
740	AVGMB
741	AVGMH
742	AVGMF
743	AVGMG
744	AVISTR
745	AVISTRB
746	AVISTRH
747	AVISTRF
748	AVISTRBS
749	AVISTRHS
750	AVISTRFS
751	AVL
752	AVLR
753	AVLREP
754	AVLREPB
755	AVLREPH
756	AVLREPF
757	AVLREPG
758	AVLC
759	AVLCB
760	AVLCH
761	AVLCF
762	AVLCG
763	AVLEH
764	AVLEF
765	AVLEG
766	AVLEB
767	AVLEIH
768	AVLEIF
769	AVLEIG
770	AVLEIB
771	AVFI
772	AVFIDB
773	AWFIDB
774	AVLGV
775	AVLGVB
776	AVLGVH
777	AVLGVF
778	AVLGVG
779	AVLLEZ
780	AVLLEZB
781	AVLLEZH
782	AVLLEZF
783	AVLLEZG
784	AVLM
785	AVLP
786	AVLPB
787	AVLPH
788	AVLPF
789	AVLPG
790	AVLBB
791	AVLVG
792	AVLVGB
793	AVLVGH
794	AVLVGF
795	AVLVGG
796	AVLVGP
797	AVLL
798	AVMX
799	AVMXB
800	AVMXH
801	AVMXF
802	AVMXG
803	AVMXL
804	AVMXLB
805	AVMXLH
806	AVMXLF
807	AVMXLG
808	AVMRH
809	AVMRHB
810	AVMRHH
811	AVMRHF
812	AVMRHG
813	AVMRL
814	AVMRLB
815	AVMRLH
816	AVMRLF
817	AVMRLG
818	AVMN
819	AVMNB
820	AVMNH
821	AVMNF
822	AVMNG
823	AVMNL
824	AVMNLB
825	AVMNLH
826	AVMNLF
827	AVMNLG
828	AVMAE
829	AVMAEB
830	AVMAEH
831	AVMAEF
832	AVMAH
833	AVMAHB
834	AVMAHH
835	AVMAHF
836	AVMALE
837	AVMALEB
838	AVMALEH
839	AVMALEF
840	AVMALH
841	AVMALHB
842	AVMALHH
843	AVMALHF
844	AVMALO
845	AVMALOB
846	AVMALOH
847	AVMALOF
848	AVMAL
849	AVMALB
850	AVMALHW
851	AVMALF
852	AVMAO
853	AVMAOB
854	AVMAOH
855	AVMAOF
856	AVME
857	AVMEB
858	AVMEH
859	AVMEF
860	AVMH
861	AVMHB
862	AVMHH
863	AVMHF
864	AVMLE
865	AVMLEB
866	AVMLEH
867	AVMLEF
868	AVMLH
869	AVMLHB
870	AVMLHH
871	AVMLHF
872	AVMLO
873	AVMLOB
874	AVMLOH
875	AVMLOF
876	AVML
877	AVMLB
878	AVMLHW
879	AVMLF
880	AVMO
881	AVMOB
882	AVMOH
883	AVMOF
884	AVNO
885	AVNOT
886	AVO
887	AVPK
888	AVPKH
889	AVPKF
890	AVPKG
891	AVPKLS
892	AVPKLSH
893	AVPKLSF
894	AVPKLSG
895	AVPKLSHS
896	AVPKLSFS
897	AVPKLSGS
898	AVPKS
899	AVPKSH
900	AVPKSF
901	AVPKSG
902	AVPKSHS
903	AVPKSFS
904	AVPKSGS
905	AVPERM
906	AVPDI
907	AVPOPCT
908	AVREP
909	AVREPB
910	AVREPH
911	AVREPF
912	AVREPG
913	AVREPI
914	AVREPIB
915	AVREPIH
916	AVREPIF
917	AVREPIG
918	AVSCEF
919	AVSCEG
920	AVSEL
921	AVSL
922	AVSLB
923	AVSLDB
924	AVSRA
925	AVSRAB
926	AVSRL
927	AVSRLB
928	AVSEG
929	AVSEGB
930	AVSEGH
931	AVSEGF
932	AVST
933	AVSTEH
934	AVSTEF
935	AVSTEG
936	AVSTEB
937	AVSTM
938	AVSTL
939	AVSTRC
940	AVSTRCB
941	AVSTRCH
942	AVSTRCF
943	AVSTRCBS
944	AVSTRCHS
945	AVSTRCFS
946	AVSTRCZB
947	AVSTRCZH
948	AVSTRCZF
949	AVSTRCZBS
950	AVSTRCZHS
951	AVSTRCZFS
952	AVS
953	AVSB
954	AVSH
955	AVSF
956	AVSG
957	AVSQ
958	AVSCBI
959	AVSCBIB
960	AVSCBIH
961	AVSCBIF
962	AVSCBIG
963	AVSCBIQ
964	AVSBCBI
965	AVSBCBIQ
966	AVSBI
967	AVSBIQ
968	AVSUMG
969	AVSUMGH
970	AVSUMGF
971	AVSUMQ
972	AVSUMQF
973	AVSUMQG
974	AVSUM
975	AVSUMB
976	AVSUMH
977	AVTM
978	AVUPH
979	AVUPHB
980	AVUPHH
981	AVUPHF
982	AVUPLH
983	AVUPLHB
984	AVUPLHH
985	AVUPLHF
986	AVUPLL
987	AVUPLLB
988	AVUPLLH
989	AVUPLLF
990	AVUPL
991	AVUPLB
992	AVUPLHW
993	AVUPLF
994	AVMSLG
995	AVMSLEG
996	AVMSLOG
997	AVMSLEOG
998
999	ANOPH // NOP
1000
1001	// binary
1002	ABYTE
1003	AWORD
1004	ADWORD
1005
1006	// Breakpoint
1007	ABRRK
1008
1009	// end marker
1010	ALAST
1011
1012	// aliases
1013	ABR = obj.AJMP
1014	ABL = obj.ACALL
1015)
1016