Home | History | Annotate | Download | only in arm64asm
      1 // Copyright 2017 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package arm64asm
      6 
      7 func extract_bit(value, bit uint32) uint32 {
      8 	return (value >> bit) & 1
      9 }
     10 
     11 func bfxpreferred_4(sf, opc1, imms, immr uint32) bool {
     12 	if imms < immr {
     13 		return false
     14 	}
     15 	if (imms>>5 == sf) && (imms&0x1f == 0x1f) {
     16 		return false
     17 	}
     18 	if immr == 0 {
     19 		if sf == 0 && (imms == 7 || imms == 15) {
     20 			return false
     21 		}
     22 		if sf == 1 && opc1 == 0 && (imms == 7 ||
     23 			imms == 15 || imms == 31) {
     24 			return false
     25 		}
     26 	}
     27 	return true
     28 }
     29 
     30 func move_wide_preferred_4(sf, N, imms, immr uint32) bool {
     31 	if sf == 1 && N != 1 {
     32 		return false
     33 	}
     34 	if sf == 0 && !(N == 0 && ((imms>>5)&1) == 0) {
     35 		return false
     36 	}
     37 	if imms < 16 {
     38 		return (-immr)%16 <= (15 - imms)
     39 	}
     40 	width := uint32(32)
     41 	if sf == 1 {
     42 		width = uint32(64)
     43 	}
     44 	if imms >= (width - 15) {
     45 		return (immr % 16) <= (imms - (width - 15))
     46 	}
     47 	return false
     48 }
     49 
     50 type Sys uint8
     51 
     52 const (
     53 	Sys_AT Sys = iota
     54 	Sys_DC
     55 	Sys_IC
     56 	Sys_TLBI
     57 	Sys_SYS
     58 )
     59 
     60 func sys_op_4(op1, crn, crm, op2 uint32) Sys {
     61 	// TODO: system instruction
     62 	return Sys_SYS
     63 }
     64 
     65 func is_zero(x uint32) bool {
     66 	return x == 0
     67 }
     68 
     69 func is_ones_n16(x uint32) bool {
     70 	return x == 0xffff
     71 }
     72 
     73 func bit_count(x uint32) uint8 {
     74 	var count uint8
     75 	for count = 0; x > 0; x >>= 1 {
     76 		if (x & 1) == 1 {
     77 			count++
     78 		}
     79 	}
     80 	return count
     81 }
     82