@@ -35,10 +35,18 @@ _LC_BR_R1 = __LC_BR_R1
35
35
__THUNK_PROLOG_NAME __s390x_indirect_jump_r \r2 \()use_r \r1
36
36
.endm
37
37
38
+ .macro __THUNK_PROLOG_BC d0 ,r1 ,r2
39
+ __THUNK_PROLOG_NAME __s390x_indirect_branch_ \d0 \()_ \r2 \()use_ \r1
40
+ .endm
41
+
38
42
.macro __THUNK_BR r1 ,r2
39
43
jg __s390x_indirect_jump_r \r2 \()use_r \r1
40
44
.endm
41
45
46
+ .macro __THUNK_BC d0 ,r1 ,r2
47
+ jg __s390x_indirect_branch_ \d0 \()_ \r2 \()use_ \r1
48
+ .endm
49
+
42
50
.macro __THUNK_BRASL r1 ,r2 ,r3
43
51
brasl \r1 ,__s390x_indirect_jump_r \r3 \()use_r \r2
44
52
.endm
@@ -81,6 +89,23 @@ _LC_BR_R1 = __LC_BR_R1
81
89
.endif
82
90
.endm
83
91
92
+ .macro __DECODE_DRR expand ,disp ,reg ,ruse
93
+ .set __decode_fail ,1
94
+ .irp r1 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15
95
+ .ifc \reg ,%r \r1
96
+ .irp r2 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15
97
+ .ifc \ruse ,%r \r2
98
+ \expand \disp ,\r1 ,\r2
99
+ .set __decode_fail ,0
100
+ .endif
101
+ .endr
102
+ .endif
103
+ .endr
104
+ .if __decode_fail == 1
105
+ .error "__DECODE_DRR failed "
106
+ .endif
107
+ .endm
108
+
84
109
.macro __THUNK_EX_BR reg ,ruse
85
110
# Be very careful when adding instructions to this macro!
86
111
# The ALTERNATIVE replacement code has a .+10 which targets
@@ -101,17 +126,42 @@ _LC_BR_R1 = __LC_BR_R1
101
126
555 : br \reg
102
127
.endm
103
128
129
+ .macro __THUNK_EX_BC disp ,reg ,ruse
130
+ #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
131
+ exrl 0 ,556f
132
+ j .
133
+ #else
134
+ larl \ruse ,556f
135
+ ex 0 ,0 (\ruse )
136
+ j .
137
+ #endif
138
+ 556 : b \disp (\reg )
139
+ .endm
140
+
104
141
.macro GEN_BR_THUNK reg ,ruse = %r1
105
142
__DECODE_RR __THUNK_PROLOG_BR ,\reg ,\ruse
106
143
__THUNK_EX_BR \reg ,\ruse
107
144
__THUNK_EPILOG
108
145
.endm
109
146
147
+ .macro GEN_B_THUNK disp ,reg ,ruse = %r1
148
+ __DECODE_DRR __THUNK_PROLOG_BC ,\disp ,\reg ,\ruse
149
+ __THUNK_EX_BC \disp ,\reg ,\ruse
150
+ __THUNK_EPILOG
151
+ .endm
152
+
110
153
.macro BR_EX reg ,ruse = %r1
111
154
557 : __DECODE_RR __THUNK_BR ,\reg ,\ruse
112
155
.pushsection .s390_indirect_branches ,"a ",@progbits
113
156
.long 557b - .
114
157
.popsection
158
+ .endm
159
+
160
+ .macro B_EX disp ,reg ,ruse = %r1
161
+ 558 : __DECODE_DRR __THUNK_BC ,\disp ,\reg ,\ruse
162
+ .pushsection .s390_indirect_branches ,"a ",@progbits
163
+ .long 558b - .
164
+ .popsection
115
165
.endm
116
166
117
167
.macro BASR_EX rsave ,rtarget ,ruse = %r1
@@ -123,10 +173,17 @@ _LC_BR_R1 = __LC_BR_R1
123
173
124
174
#else
125
175
.macro GEN_BR_THUNK reg ,ruse = %r1
176
+ .endm
177
+
178
+ .macro GEN_B_THUNK disp ,reg ,ruse = %r1
126
179
.endm
127
180
128
181
.macro BR_EX reg ,ruse = %r1
129
182
br \reg
183
+ .endm
184
+
185
+ .macro B_EX disp ,reg ,ruse = %r1
186
+ b \disp (\reg )
130
187
.endm
131
188
132
189
.macro BASR_EX rsave ,rtarget ,ruse = %r1
0 commit comments