@@ -195,149 +195,6 @@ func ARM64RegisterShift(reg, op, count int16) (int64, error) {
195195 return int64 (reg & 31 )<< 16 | int64 (op )<< 22 | int64 (uint16 (count )), nil
196196}
197197
198- // ARM64RegisterExtension constructs an ARM64 register with extension or arrangement.
199- func ARM64RegisterExtension (a * obj.Addr , ext string , reg , num int16 , isAmount , isIndex bool ) error {
200- Rnum := (reg & 31 ) + int16 (num << 5 )
201- if isAmount {
202- if num < 0 || num > 7 {
203- return errors .New ("index shift amount is out of range" )
204- }
205- }
206- if reg <= arm64 .REG_R31 && reg >= arm64 .REG_R0 {
207- if ! isAmount {
208- return errors .New ("invalid register extension" )
209- }
210- switch ext {
211- case "UXTB" :
212- if a .Type == obj .TYPE_MEM {
213- return errors .New ("invalid shift for the register offset addressing mode" )
214- }
215- a .Reg = arm64 .REG_UXTB + Rnum
216- case "UXTH" :
217- if a .Type == obj .TYPE_MEM {
218- return errors .New ("invalid shift for the register offset addressing mode" )
219- }
220- a .Reg = arm64 .REG_UXTH + Rnum
221- case "UXTW" :
222- // effective address of memory is a base register value and an offset register value.
223- if a .Type == obj .TYPE_MEM {
224- a .Index = arm64 .REG_UXTW + Rnum
225- } else {
226- a .Reg = arm64 .REG_UXTW + Rnum
227- }
228- case "UXTX" :
229- if a .Type == obj .TYPE_MEM {
230- return errors .New ("invalid shift for the register offset addressing mode" )
231- }
232- a .Reg = arm64 .REG_UXTX + Rnum
233- case "SXTB" :
234- if a .Type == obj .TYPE_MEM {
235- return errors .New ("invalid shift for the register offset addressing mode" )
236- }
237- a .Reg = arm64 .REG_SXTB + Rnum
238- case "SXTH" :
239- if a .Type == obj .TYPE_MEM {
240- return errors .New ("invalid shift for the register offset addressing mode" )
241- }
242- a .Reg = arm64 .REG_SXTH + Rnum
243- case "SXTW" :
244- if a .Type == obj .TYPE_MEM {
245- a .Index = arm64 .REG_SXTW + Rnum
246- } else {
247- a .Reg = arm64 .REG_SXTW + Rnum
248- }
249- case "SXTX" :
250- if a .Type == obj .TYPE_MEM {
251- a .Index = arm64 .REG_SXTX + Rnum
252- } else {
253- a .Reg = arm64 .REG_SXTX + Rnum
254- }
255- case "LSL" :
256- a .Index = arm64 .REG_LSL + Rnum
257- default :
258- return errors .New ("unsupported general register extension type: " + ext )
259-
260- }
261- } else if reg <= arm64 .REG_V31 && reg >= arm64 .REG_V0 {
262- switch ext {
263- case "B8" :
264- if isIndex {
265- return errors .New ("invalid register extension" )
266- }
267- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_8B & 15 ) << 5 )
268- case "B16" :
269- if isIndex {
270- return errors .New ("invalid register extension" )
271- }
272- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_16B & 15 ) << 5 )
273- case "H4" :
274- if isIndex {
275- return errors .New ("invalid register extension" )
276- }
277- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_4H & 15 ) << 5 )
278- case "H8" :
279- if isIndex {
280- return errors .New ("invalid register extension" )
281- }
282- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_8H & 15 ) << 5 )
283- case "S2" :
284- if isIndex {
285- return errors .New ("invalid register extension" )
286- }
287- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_2S & 15 ) << 5 )
288- case "S4" :
289- if isIndex {
290- return errors .New ("invalid register extension" )
291- }
292- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_4S & 15 ) << 5 )
293- case "D1" :
294- if isIndex {
295- return errors .New ("invalid register extension" )
296- }
297- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_1D & 15 ) << 5 )
298- case "D2" :
299- if isIndex {
300- return errors .New ("invalid register extension" )
301- }
302- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_2D & 15 ) << 5 )
303- case "Q1" :
304- if isIndex {
305- return errors .New ("invalid register extension" )
306- }
307- a .Reg = arm64 .REG_ARNG + (reg & 31 ) + ((arm64 .ARNG_1Q & 15 ) << 5 )
308- case "B" :
309- if ! isIndex {
310- return nil
311- }
312- a .Reg = arm64 .REG_ELEM + (reg & 31 ) + ((arm64 .ARNG_B & 15 ) << 5 )
313- a .Index = num
314- case "H" :
315- if ! isIndex {
316- return nil
317- }
318- a .Reg = arm64 .REG_ELEM + (reg & 31 ) + ((arm64 .ARNG_H & 15 ) << 5 )
319- a .Index = num
320- case "S" :
321- if ! isIndex {
322- return nil
323- }
324- a .Reg = arm64 .REG_ELEM + (reg & 31 ) + ((arm64 .ARNG_S & 15 ) << 5 )
325- a .Index = num
326- case "D" :
327- if ! isIndex {
328- return nil
329- }
330- a .Reg = arm64 .REG_ELEM + (reg & 31 ) + ((arm64 .ARNG_D & 15 ) << 5 )
331- a .Index = num
332- default :
333- return errors .New ("unsupported simd register extension type: " + ext )
334- }
335- } else {
336- return errors .New ("invalid register and extension combination" )
337- }
338- return nil
339- }
340-
341198// ARM64RegisterArrangement constructs an ARM64 vector register arrangement.
342199func ARM64RegisterArrangement (reg int16 , name , arng string ) (int64 , error ) {
343200 var curQ , curSize uint16
0 commit comments