| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 
 | # frv testcase for mmulhs $GRi,$GRj,$ACCk
# mach: all
	.include "testutils.inc"
	start
	.global mmulhs
mmulhs:
	; Positive operands
	set_fr_iimmed  	2,3,fr7		; multiply small numbers
	set_fr_iimmed  	3,2,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	6,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	6,acc1
	set_fr_iimmed  	0,1,fr7		; multiply by 0
	set_fr_iimmed  	2,0,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	0,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	0,acc1
	set_fr_iimmed  	2,1,fr7		; multiply by 1
	set_fr_iimmed  	1,2,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	2,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	2,acc1
	set_fr_iimmed	0x3fff,2,fr7	; 15 bit result
	set_fr_iimmed  	2,0x3fff,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_limmed	0,0x7ffe,acc0
	test_accg_immed 	0,accg1
	test_acc_limmed	0,0x7ffe,acc1
	set_fr_iimmed	0x4000,2,fr7	; 16 bit result
	set_fr_iimmed  	2,0x4000,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_limmed	0x0000,0x8000,acc0
	test_accg_immed 	0,accg1
	test_acc_limmed	0x0000,0x8000,acc1
	set_fr_iimmed	0x7fff,0x7fff,fr7	; max positive result
	set_fr_iimmed	0x7fff,0x7fff,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_limmed 0x3fff,0x0001,acc0
	test_accg_immed 	0,accg1
	test_acc_limmed 0x3fff,0x0001,acc1
	; Mixed operands
	set_fr_iimmed  	2,0xfffd,fr7		; multiply small numbers
	set_fr_iimmed  	0xfffd,2,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0xff,accg0
	test_acc_immed 	-6,acc0
	test_accg_immed 	0xff,accg1
	test_acc_immed 	-6,acc1
	set_fr_iimmed  	0xfffe,1,fr7		; multiply by 1
	set_fr_iimmed  	1,0xfffe,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0xff,accg0
	test_acc_immed 	-2,acc0
	test_accg_immed 	0xff,accg1
	test_acc_immed 	-2,acc1
	set_fr_iimmed  	0xfffe,0,fr7		; multiply by 0
	set_fr_iimmed  	0,0xfffe,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	0,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	0,acc1
	set_fr_iimmed  	0x2001,0xfffe,fr7	; 15 bit result
	set_fr_iimmed  	0xfffe,0x2001,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0xff,accg0
	test_acc_limmed	0xffff,0xbffe,acc0
	test_accg_immed 	0xff,accg1
	test_acc_limmed	0xffff,0xbffe,acc1
	set_fr_iimmed	0x4000,0xfffe,fr7	; 16 bit result
	set_fr_iimmed  	0xfffe,0x4000,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0xff,accg0
	test_acc_limmed	0xffff,0x8000,acc0
	test_accg_immed 	0xff,accg1
	test_acc_limmed	0xffff,0x8000,acc1
	set_fr_iimmed	0x7fff,0x8000,fr7	; max negative result
	set_fr_iimmed	0x8000,0x7fff,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0xff,accg0
	test_acc_limmed	0xc000,0x8000,acc0
	test_accg_immed 	0xff,accg1
	test_acc_limmed	0xc000,0x8000,acc1
	; Negative operands
	set_fr_iimmed  	0xfffe,0xfffd,fr7		; multiply small numbers
	set_fr_iimmed  	0xfffd,0xfffe,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	6,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	6,acc1
	set_fr_iimmed  	0xffff,0xfffe,fr7		; multiply by -1
	set_fr_iimmed  	0xfffe,0xffff,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	2,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	2,acc1
	set_fr_iimmed	0x8001,0x8001,fr7	; almost max positive result
	set_fr_iimmed	0x8001,0x8001,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	0x3fff0001,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	0x3fff0001,acc1
	set_fr_iimmed	0x8000,0x8000,fr7	; max positive result
	set_fr_iimmed	0x8000,0x8000,fr8
	mmulhs      	fr7,fr8,acc0
	test_accg_immed 	0,accg0
	test_acc_immed 	0x40000000,acc0
	test_accg_immed 	0,accg1
	test_acc_immed 	0x40000000,acc1
	pass
 |