86
return rd;
87
}
88
89
+static uint64_t octeon_vmulu(uint64_t mpl0, uint64_t rs, uint64_t rt)
90
+{
91
+ uint64_t rd;
92
+
93
+ asm volatile(
94
+ "move $8, %[mpl0]\n\t"
95
+ "move $9, $0\n\t"
96
+ ".word 0x71090008\n\t" /* mtm0 $8, $9 */
97
+ "move $8, %[rs]\n\t"
98
+ "move $9, %[rt]\n\t"
99
+ ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */
100
+ "move %[rd], $10\n\t"
101
+ : [rd] "=r" (rd)
102
+ : [mpl0] "r" (mpl0), [rs] "r" (rs), [rt] "r" (rt)
103
+ : "$8", "$9", "$10");
104
+
105
+ return rd;
106
+}
107
+
108
+static uint64_t octeon_mtp0_zeroes_p1(void)
109
+{
110
+ uint64_t rd;
111
+
112
+ asm volatile(
113
+ "move $8, %[mpl0]\n\t"
114
+ "move $9, $0\n\t"
115
+ ".word 0x71090008\n\t" /* mtm0 $8, $9 */
116
+ "move $8, %[p1]\n\t"
117
+ "move $9, $0\n\t"
118
+ ".word 0x7109000a\n\t" /* mtp1 $8, $9 */
119
+ "move $8, $0\n\t"
120
+ "move $9, $0\n\t"
121
+ ".word 0x71090009\n\t" /* mtp0 $8, $9 */
122
+ "move $8, $0\n\t"
123
+ "move $9, $0\n\t"
124
+ ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */
125
+ "move $8, $0\n\t"
126
+ "move $9, $0\n\t"
127
+ ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */
128
+ "move %[rd], $10\n\t"
129
+ : [rd] "=r" (rd)
130
+ : [mpl0] "r" (0ULL), [p1] "r" (1ULL)
131
+ : "$8", "$9", "$10");
132
+
133
+ return rd;
134
+}
135
+
136
int main(void)
137
{
138
assert(octeon_baddu(0x123, 0x0f0) == 0x13);
142
assert(octeon_seq(0xabc, 0xdef) == 0);
143
assert(octeon_sne(0xabc, 0xabc) == 0);
144
assert(octeon_sne(0xabc, 0xdef) == 1);
145
+ assert(octeon_vmulu(5, 7, 11) == 46);
146
+ assert(octeon_mtp0_zeroes_p1() == 0);
147
148
return 0;
149
}