| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build riscv64 |
| |
| package testbranch |
| |
| import ( |
| "testing" |
| ) |
| |
| func testBEQZ(a int64) (r bool) |
| func testBGE(a, b int64) (r bool) |
| func testBGEU(a, b int64) (r bool) |
| func testBGEZ(a int64) (r bool) |
| func testBGT(a, b int64) (r bool) |
| func testBGTU(a, b int64) (r bool) |
| func testBGTZ(a int64) (r bool) |
| func testBLE(a, b int64) (r bool) |
| func testBLEU(a, b int64) (r bool) |
| func testBLEZ(a int64) (r bool) |
| func testBLT(a, b int64) (r bool) |
| func testBLTU(a, b int64) (r bool) |
| func testBLTZ(a int64) (r bool) |
| func testBNEZ(a int64) (r bool) |
| |
| func testGoBGE(a, b int64) bool { return a >= b } |
| func testGoBGEU(a, b int64) bool { return uint64(a) >= uint64(b) } |
| func testGoBGT(a, b int64) bool { return a > b } |
| func testGoBGTU(a, b int64) bool { return uint64(a) > uint64(b) } |
| func testGoBLE(a, b int64) bool { return a <= b } |
| func testGoBLEU(a, b int64) bool { return uint64(a) <= uint64(b) } |
| func testGoBLT(a, b int64) bool { return a < b } |
| func testGoBLTZ(a, b int64) bool { return uint64(a) < uint64(b) } |
| |
| func TestBranchCondition(t *testing.T) { |
| tests := []struct { |
| ins string |
| a int64 |
| b int64 |
| fn func(a, b int64) bool |
| goFn func(a, b int64) bool |
| want bool |
| }{ |
| {"BGE", 0, 1, testBGE, testGoBGE, false}, |
| {"BGE", 0, 0, testBGE, testGoBGE, true}, |
| {"BGE", 0, -1, testBGE, testGoBGE, true}, |
| {"BGE", -1, 0, testBGE, testGoBGE, false}, |
| {"BGE", 1, 0, testBGE, testGoBGE, true}, |
| {"BGEU", 0, 1, testBGEU, testGoBGEU, false}, |
| {"BGEU", 0, 0, testBGEU, testGoBGEU, true}, |
| {"BGEU", 0, -1, testBGEU, testGoBGEU, false}, |
| {"BGEU", -1, 0, testBGEU, testGoBGEU, true}, |
| {"BGEU", 1, 0, testBGEU, testGoBGEU, true}, |
| {"BGT", 0, 1, testBGT, testGoBGT, false}, |
| {"BGT", 0, 0, testBGT, testGoBGT, false}, |
| {"BGT", 0, -1, testBGT, testGoBGT, true}, |
| {"BGT", -1, 0, testBGT, testGoBGT, false}, |
| {"BGT", 1, 0, testBGT, testGoBGT, true}, |
| {"BGTU", 0, 1, testBGTU, testGoBGTU, false}, |
| {"BGTU", 0, 0, testBGTU, testGoBGTU, false}, |
| {"BGTU", 0, -1, testBGTU, testGoBGTU, false}, |
| {"BGTU", -1, 0, testBGTU, testGoBGTU, true}, |
| {"BGTU", 1, 0, testBGTU, testGoBGTU, true}, |
| {"BLE", 0, 1, testBLE, testGoBLE, true}, |
| {"BLE", 0, 0, testBLE, testGoBLE, true}, |
| {"BLE", 0, -1, testBLE, testGoBLE, false}, |
| {"BLE", -1, 0, testBLE, testGoBLE, true}, |
| {"BLE", 1, 0, testBLE, testGoBLE, false}, |
| {"BLEU", 0, 1, testBLEU, testGoBLEU, true}, |
| {"BLEU", 0, 0, testBLEU, testGoBLEU, true}, |
| {"BLEU", 0, -1, testBLEU, testGoBLEU, true}, |
| {"BLEU", -1, 0, testBLEU, testGoBLEU, false}, |
| {"BLEU", 1, 0, testBLEU, testGoBLEU, false}, |
| {"BLT", 0, 1, testBLT, testGoBLT, true}, |
| {"BLT", 0, 0, testBLT, testGoBLT, false}, |
| {"BLT", 0, -1, testBLT, testGoBLT, false}, |
| {"BLT", -1, 0, testBLT, testGoBLT, true}, |
| {"BLT", 1, 0, testBLT, testGoBLT, false}, |
| {"BLTU", 0, 1, testBLTU, testGoBLTU, true}, |
| {"BLTU", 0, 0, testBLTU, testGoBLTU, false}, |
| {"BLTU", 0, -1, testBLTU, testGoBLTU, true}, |
| {"BLTU", -1, 0, testBLTU, testGoBLTU, false}, |
| {"BLTU", 1, 0, testBLTU, testGoBLTU, false}, |
| } |
| for _, test := range tests { |
| t.Run(test.ins, func(t *testing.T) { |
| if got := test.fn(test.a, test.b); got != test.want { |
| t.Errorf("Assembly %v %v, %v = %v, want %v", test.ins, test.a, test.b, got, test.want) |
| } |
| if got := test.goFn(test.a, test.b); got != test.want { |
| t.Errorf("Go %v %v, %v = %v, want %v", test.ins, test.a, test.b, got, test.want) |
| } |
| }) |
| } |
| } |
| |
| func TestBranchZero(t *testing.T) { |
| tests := []struct { |
| ins string |
| a int64 |
| fn func(a int64) bool |
| want bool |
| }{ |
| {"BEQZ", -1, testBEQZ, false}, |
| {"BEQZ", 0, testBEQZ, true}, |
| {"BEQZ", 1, testBEQZ, false}, |
| {"BGEZ", -1, testBGEZ, false}, |
| {"BGEZ", 0, testBGEZ, true}, |
| {"BGEZ", 1, testBGEZ, true}, |
| {"BGTZ", -1, testBGTZ, false}, |
| {"BGTZ", 0, testBGTZ, false}, |
| {"BGTZ", 1, testBGTZ, true}, |
| {"BLEZ", -1, testBLEZ, true}, |
| {"BLEZ", 0, testBLEZ, true}, |
| {"BLEZ", 1, testBLEZ, false}, |
| {"BLTZ", -1, testBLTZ, true}, |
| {"BLTZ", 0, testBLTZ, false}, |
| {"BLTZ", 1, testBLTZ, false}, |
| {"BNEZ", -1, testBNEZ, true}, |
| {"BNEZ", 0, testBNEZ, false}, |
| {"BNEZ", 1, testBNEZ, true}, |
| } |
| for _, test := range tests { |
| t.Run(test.ins, func(t *testing.T) { |
| if got := test.fn(test.a); got != test.want { |
| t.Errorf("%v %v = %v, want %v", test.ins, test.a, got, test.want) |
| } |
| }) |
| } |
| } |