@@ -3201,21 +3201,126 @@ RVOP(
3201
3201
3202
3202
RVOP (
3203
3203
vle8_v ,
3204
- { V_NOP ; },
3204
+ {
3205
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
3206
+ uint32_t addr = rv -> X [ir -> rs1 ];
3207
+
3208
+ if (ir -> eew > sew ) {
3209
+ /* Illegal */
3210
+ rv -> csr_vtype = 0x80000000 ;
3211
+ rv -> csr_vl = 0 ;
3212
+ return true;
3213
+ } else {
3214
+ uint8_t i = 0 ;
3215
+ uint8_t j = 0 ;
3216
+ for (uint32_t cnt = 0 ; rv -> csr_vl - cnt >= 4 ;) {
3217
+ i %= VREG_U32_COUNT ;
3218
+ /* Set illegal when trying to access vector register that is
3219
+ * larger then 31.
3220
+ */
3221
+ assert (ir -> vd + j < 32 );
3222
+ /* Process full 32-bit words */
3223
+ rv -> V [ir -> vd + j ][i ] = 0 ;
3224
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_b (rv , addr );
3225
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_b (rv , addr + 1 ) << 8 ;
3226
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_b (rv , addr + 2 ) << 16 ;
3227
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_b (rv , addr + 3 ) << 24 ;
3228
+ cnt += 4 ;
3229
+ i ++ ;
3230
+
3231
+ /* Move to next vector register after filling VLEN */
3232
+ if (!(cnt % (VREG_U32_COUNT << 2 ))) {
3233
+ j ++ ;
3234
+ i = 0 ;
3235
+ }
3236
+ addr += 4 ;
3237
+ }
3238
+ /* Clear corresponding bits of eews */
3239
+ if (rv -> csr_vl % 4 ) {
3240
+ rv -> V [ir -> vd + j ][i ] %= 0xFFFFFFFF << ((rv -> csr_vl % 4 ) << 3 );
3241
+ }
3242
+ /* Handle eews that is narrower then a word */
3243
+ for (uint32_t cnt = 0 ; cnt < (rv -> csr_vl % 4 ); cnt ++ ) {
3244
+ assert (ir -> vd + j < 32 ); /* Illegal */
3245
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_b (rv , addr + cnt )
3246
+ << (cnt << 3 );
3247
+ }
3248
+ }
3249
+ },
3205
3250
GEN ({
3206
3251
assert ; /* FIXME: Implement */
3207
3252
}))
3208
3253
3209
3254
RVOP (
3210
3255
vle16_v ,
3211
- { V_NOP ; },
3256
+ {
3257
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
3258
+ uint32_t addr = rv -> X [ir -> rs1 ];
3259
+
3260
+ if (ir -> eew > sew ) {
3261
+ /* Illegal */
3262
+ rv -> csr_vtype = 0x80000000 ;
3263
+ rv -> csr_vl = 0 ;
3264
+ return true;
3265
+ } else {
3266
+ uint8_t i = 0 ;
3267
+ uint8_t j = 0 ;
3268
+ for (uint32_t cnt = 0 ; rv -> csr_vl - cnt >= 2 ;) {
3269
+ i %= VREG_U32_COUNT ;
3270
+ assert (ir -> vd + j < 32 );
3271
+ /* Process full 32-bit words */
3272
+ rv -> V [ir -> vd + j ][i ] = 0 ;
3273
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_s (rv , addr );
3274
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_s (rv , addr + 2 ) << 16 ;
3275
+ cnt += 2 ;
3276
+ i ++ ;
3277
+
3278
+ /* Move to next vector register after filling VLEN */
3279
+ if (!(cnt % (VREG_U32_COUNT << 1 ))) {
3280
+ j ++ ;
3281
+ i = 0 ;
3282
+ }
3283
+ addr += 4 ;
3284
+ }
3285
+ if (rv -> csr_vl % 2 ) {
3286
+ assert (ir -> vd + j < 32 ); /* Illegal */
3287
+ rv -> V [ir -> vd + j ][i ] |= rv -> io .mem_read_s (rv , addr );
3288
+ }
3289
+ }
3290
+ },
3212
3291
GEN ({
3213
3292
assert ; /* FIXME: Implement */
3214
3293
}))
3215
3294
3216
3295
RVOP (
3217
3296
vle32_v ,
3218
- { V_NOP ; },
3297
+ {
3298
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
3299
+ uint32_t addr = rv -> X [ir -> rs1 ];
3300
+
3301
+ if (ir -> eew > sew ) {
3302
+ /* Illegal */
3303
+ rv -> csr_vtype = 0x80000000 ;
3304
+ rv -> csr_vl = 0 ;
3305
+ return true;
3306
+ } else {
3307
+ uint8_t i = 0 ;
3308
+ uint8_t j = 0 ;
3309
+ for (uint32_t cnt = 0 ; rv -> csr_vl > cnt ;) {
3310
+ i %= VREG_U32_COUNT ;
3311
+ assert (ir -> vd + j < 32 );
3312
+ rv -> V [ir -> vd + j ][i ] = rv -> io .mem_read_w (rv , addr );
3313
+ cnt += 1 ;
3314
+ i ++ ;
3315
+
3316
+ if (!(cnt % VREG_U32_COUNT )) {
3317
+ j ++ ;
3318
+ i = 0 ;
3319
+ }
3320
+ addr += 4 ;
3321
+ }
3322
+ }
3323
+ },
3219
3324
GEN ({
3220
3325
assert ; /* FIXME: Implement */
3221
3326
}))
@@ -4440,21 +4545,120 @@ RVOP(
4440
4545
4441
4546
RVOP (
4442
4547
vse8_v ,
4443
- { V_NOP ; },
4548
+ {
4549
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
4550
+ uint32_t addr = rv -> X [ir -> rs1 ];
4551
+
4552
+ if (ir -> eew > sew ) {
4553
+ /* Illegal */
4554
+ rv -> csr_vtype = 0x80000000 ;
4555
+ rv -> csr_vl = 0 ;
4556
+ return true;
4557
+ } else {
4558
+ uint8_t i = 0 ;
4559
+ uint8_t j = 0 ;
4560
+ for (uint32_t cnt = 0 ; rv -> csr_vl - cnt >= 4 ;) {
4561
+ i %= VREG_U32_COUNT ;
4562
+ /* Set illegal when trying to access vector register that is
4563
+ * larger then 31.
4564
+ */
4565
+ assert (ir -> vs3 + j < 32 );
4566
+ uint32_t tmp = rv -> V [ir -> vs3 + j ][i ];
4567
+ /* Process full 32-bit words */
4568
+ rv -> io .mem_write_b (rv , addr , (tmp ) & 0xff );
4569
+ rv -> io .mem_write_b (rv , addr + 1 , (tmp >> 8 ) & 0xff );
4570
+ rv -> io .mem_write_b (rv , addr + 2 , (tmp >> 16 ) & 0xff );
4571
+ rv -> io .mem_write_b (rv , addr + 3 , (tmp >> 24 ) & 0xff );
4572
+ cnt += 4 ;
4573
+ i ++ ;
4574
+
4575
+ /* Move to next vector register after filling VLEN */
4576
+ if (!(cnt % (VREG_U32_COUNT << 2 ))) {
4577
+ j ++ ;
4578
+ i = 0 ;
4579
+ }
4580
+ addr += 4 ;
4581
+ }
4582
+ /* Handle eews that is narrower then a word */
4583
+ for (uint32_t cnt = 0 ; cnt < (rv -> csr_vl % 4 ); cnt ++ ) {
4584
+ assert (ir -> vs3 + j < 32 ); /* Illegal */
4585
+ uint8_t tmp = (rv -> V [ir -> vs3 + j ][i ] >> (cnt << 3 )) & 0xff ;
4586
+ rv -> io .mem_write_b (rv , addr + cnt , tmp );
4587
+ }
4588
+ }
4589
+ },
4444
4590
GEN ({
4445
4591
assert ; /* FIXME: Implement */
4446
4592
}))
4447
4593
4448
4594
RVOP (
4449
4595
vse16_v ,
4450
- { V_NOP ; },
4596
+ {
4597
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
4598
+ uint32_t addr = rv -> X [ir -> rs1 ];
4599
+
4600
+ if (ir -> eew > sew ) {
4601
+ /* Illegal */
4602
+ rv -> csr_vtype = 0x80000000 ;
4603
+ rv -> csr_vl = 0 ;
4604
+ return true;
4605
+ } else {
4606
+ uint8_t i = 0 ;
4607
+ uint8_t j = 0 ;
4608
+ for (uint32_t cnt = 0 ; rv -> csr_vl - cnt >= 2 ;) {
4609
+ i %= VREG_U32_COUNT ;
4610
+ assert (ir -> vs3 + j < 32 );
4611
+ uint32_t tmp = rv -> V [ir -> vs3 + j ][i ];
4612
+ /* Process full 32-bit words */
4613
+ rv -> io .mem_write_s (rv , addr , (tmp ) & 0xffff );
4614
+ rv -> io .mem_write_s (rv , addr + 2 , (tmp >> 16 ) & 0xffff );
4615
+ cnt += 2 ;
4616
+ i ++ ;
4617
+
4618
+ if (!(cnt % (VREG_U32_COUNT << 1 ))) {
4619
+ j ++ ;
4620
+ i = 0 ;
4621
+ }
4622
+ addr += 4 ;
4623
+ }
4624
+ if (rv -> csr_vl % 2 ) {
4625
+ rv -> io .mem_write_s (rv , addr , rv -> V [ir -> vs3 + j ][i ] & 0xffff );
4626
+ }
4627
+ }
4628
+ },
4451
4629
GEN ({
4452
4630
assert ; /* FIXME: Implement */
4453
4631
}))
4454
4632
4455
4633
RVOP (
4456
4634
vse32_v ,
4457
- { V_NOP ; },
4635
+ {
4636
+ uint8_t sew = 8 << ((rv -> csr_vtype >> 3 ) & 0b111 );
4637
+ uint32_t addr = rv -> X [ir -> rs1 ];
4638
+
4639
+ if (ir -> eew > sew ) {
4640
+ /* Illegal */
4641
+ rv -> csr_vtype = 0x80000000 ;
4642
+ rv -> csr_vl = 0 ;
4643
+ return true;
4644
+ } else {
4645
+ uint8_t i = 0 ;
4646
+ uint8_t j = 0 ;
4647
+ for (uint32_t cnt = 0 ; rv -> csr_vl > cnt ;) {
4648
+ i %= VREG_U32_COUNT ;
4649
+ assert (ir -> vs3 + j < 32 );
4650
+ rv -> io .mem_write_w (rv , addr , rv -> V [ir -> vs3 + j ][i ]);
4651
+ cnt += 1 ;
4652
+ i ++ ;
4653
+
4654
+ if (!(cnt % (VREG_U32_COUNT ))) {
4655
+ j ++ ;
4656
+ i = 0 ;
4657
+ }
4658
+ addr += 4 ;
4659
+ }
4660
+ }
4661
+ },
4458
4662
GEN ({
4459
4663
assert ; /* FIXME: Implement */
4460
4664
}))
0 commit comments