golang.org/x/arch@v0.17.0/loong64/loong64asm/objdump_test.go (about)

     1  // Copyright 2024 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 loong64asm
     6  
     7  import (
     8  	"strconv"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func TestObjdumpLoong64TestDecodeGNUSyntaxdata(t *testing.T) {
    14  	testObjdumpLoong64(t, testdataCases(t, "gnu"))
    15  }
    16  
    17  func TestObjdumpLoong64TestDecodeGoSyntaxdata(t *testing.T) {
    18  	testObjdumpLoong64(t, testdataCases(t, "plan9"))
    19  }
    20  
    21  func TestObjdumpLoong64Manual(t *testing.T) {
    22  	testObjdumpLoong64(t, hexCases(t, objdumpManualTests))
    23  }
    24  
    25  // objdumpManualTests holds test cases that will be run by TestObjdumpLoong64Manual.
    26  // If you are debugging a few cases that turned up in a longer run, it can be useful
    27  // to list them here and then use -run=Manual, particularly with tracing enabled.
    28  // Note that these are byte sequences, so they must be reversed from the usual
    29  // word presentation.
    30  var objdumpManualTests = `
    31  00007238
    32  00807238
    33  00004003
    34  00100050
    35  ac410028
    36  ac41002a
    37  ac41c028
    38  ac414028
    39  ac41402a
    40  ac418028
    41  ac41802a
    42  ac397838
    43  acb97938
    44  acb97838
    45  ac397938
    46  ac397a38
    47  acb97b38
    48  acb97a38
    49  ac397b38
    50  ac110026
    51  ac110024
    52  ac390038
    53  ac392038
    54  ac390c38
    55  ac390438
    56  ac392438
    57  ac390838
    58  ac392838
    59  ac391600
    60  ac391400
    61  ac391500
    62  ac418003
    63  `
    64  
    65  // allowedMismatchObjdump reports whether the mismatch between text and dec
    66  // should be allowed by the test.
    67  func allowedMismatchObjdump(text string, inst *Inst, dec ExtInst) bool {
    68  	// GNU objdump use register, decode use alias of register, so corrected it in here
    69  	var dec_text = strings.Replace(dec.text, " ", ",", -1)
    70  	var decsp []string = strings.Split(dec_text, ",")
    71  	var num int = cap(decsp)
    72  	for i := 0; i < num; i++ {
    73  		dex := strings.Index(decsp[i], "$r")
    74  		fdex := strings.Index(decsp[i], "$f")
    75  		ddex := strings.Index(decsp[i], "(")
    76  		if ddex > 0 {
    77  			// ldptr.w $r12,$r13,16(0x10)
    78  			decsp[i] = decsp[i][0:ddex]
    79  		}
    80  		xdex := strings.Index(decsp[i], "0x")
    81  		// convert registers to registers aliases
    82  		if dex >= 0 {
    83  			reg, _ := strconv.Atoi(decsp[i][dex+2:])
    84  			// r12~r20 $t0~t8
    85  			if reg >= 12 && reg <= 20 {
    86  				decsp[i] = strings.Join([]string{"t", strconv.Itoa(reg - 12)}, "")
    87  			}
    88  			// r4~r11 $a0~a7
    89  			if reg >= 4 && reg <= 11 {
    90  				decsp[i] = strings.Join([]string{"a", strconv.Itoa(reg - 4)}, "")
    91  			}
    92  			// r23~r31 $s0~s8
    93  			if reg >= 23 && reg <= 31 {
    94  				decsp[i] = strings.Join([]string{"s", strconv.Itoa(reg - 23)}, "")
    95  			}
    96  			// r0 zero
    97  			if reg == 0 {
    98  				decsp[i] = strings.Join([]string{"zero"}, "")
    99  			}
   100  			// r1 ra
   101  			if reg == 1 {
   102  				decsp[i] = strings.Join([]string{"ra"}, "")
   103  			}
   104  			// r2 tp
   105  			if reg == 2 {
   106  				decsp[i] = strings.Join([]string{"tp"}, "")
   107  			}
   108  			// r3 sp
   109  			if reg == 3 {
   110  				decsp[i] = strings.Join([]string{"sp"}, "")
   111  			}
   112  			// r21 x
   113  			if reg == 21 {
   114  				decsp[i] = strings.Join([]string{"x"}, "")
   115  			}
   116  			// r22 fp
   117  			if reg == 22 {
   118  				decsp[i] = strings.Join([]string{"fp"}, "")
   119  			}
   120  		}
   121  		// convert hexadecimal to decimal
   122  		if xdex >= 0 {
   123  			parseint, _ := strconv.ParseInt(decsp[i][xdex+2:], 16, 32)
   124  			decsp[i] = strings.Join([]string{strconv.Itoa(int(parseint))}, "")
   125  		}
   126  		// convert floating-point registers to floating-point aliases
   127  		if fdex >= 0 && !strings.Contains(decsp[i], "$fcc") {
   128  			freg, _ := strconv.Atoi(decsp[i][fdex+2:])
   129  			// f0~f7 fa0~fa7
   130  			if freg >= 0 && freg <= 7 {
   131  				decsp[i] = strings.Join([]string{"fa", strconv.Itoa(freg - 0)}, "")
   132  			}
   133  			// f8~f23 ft0~ft15
   134  			if freg >= 8 && freg <= 23 {
   135  				decsp[i] = strings.Join([]string{"ft", strconv.Itoa(freg - 8)}, "")
   136  			}
   137  			// f24~f31 fs0~fs7
   138  			if freg >= 24 && freg <= 31 {
   139  				decsp[i] = strings.Join([]string{"fs", strconv.Itoa(freg - 24)}, "")
   140  			}
   141  		}
   142  	}
   143  
   144  	return false
   145  }