285
}
286
}
287
288
-static void vext_set_tail_elems_1s(target_ulong vl, void *vd,
288
+static void vext_set_tail_elems_1s(uint32_t vl, void *vd,
289
uint32_t desc, uint32_t nf,
290
uint32_t esz, uint32_t max_elems)
291
{
388
uint32_t evl = env->vstart + elems;
389
MMUAccessType access_type = is_load ? MMU_DATA_LOAD : MMU_DATA_STORE;
390
391
+ /*
392
+ * Maximum vector length is VLMAX == 2^16 == LMUL * VL / SEW, and
393
+ * occurs for LMUL == 8, SEW == 8, VL == 2^16.
394
+ */
395
+ g_assert(env->vstart < UINT16_MAX && UINT16_MAX - env->vstart >= elems);
396
+
397
/* Check page permission/pmp/watchpoint/etc. */
398
probe_pages(env, addr, size, ra, access_type, mmu_index, &host, &flags,
399
true);
2230
* define common macros for fixed point here.
2231
*/
2232
typedef void opivv2_rm_fn(void *vd, void *vs1, void *vs2, int i,
2227
- CPURISCVState *env, int vxrm);
2233
+ CPURISCVState *env, uint8_t vxrm);
2234
2235
#define OPIVV2_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
2236
static inline void \
2237
do_##NAME(void *vd, void *vs1, void *vs2, int i, \
2232
- CPURISCVState *env, int vxrm) \
2238
+ CPURISCVState *env, uint8_t vxrm) \
2239
{ \
2240
TX1 s1 = *((T1 *)vs1 + HS1(i)); \
2241
TX2 s2 = *((T2 *)vs2 + HS2(i)); \
2245
static inline void
2246
vext_vv_rm_1(void *vd, void *v0, void *vs1, void *vs2,
2247
CPURISCVState *env,
2242
- uint32_t vl, uint32_t vm, int vxrm,
2248
+ uint32_t vl, uint32_t vm, uint8_t vxrm,
2249
opivv2_rm_fn *fn, uint32_t vma, uint32_t esz)
2250
{
2251
for (uint32_t i = env->vstart; i < vl; i++) {
2304
do_##NAME, ESZ); \
2305
}
2306
2301
-static inline uint8_t saddu8(CPURISCVState *env, int vxrm, uint8_t a,
2307
+static inline uint8_t saddu8(CPURISCVState *env, uint8_t vxrm, uint8_t a,
2308
uint8_t b)
2309
{
2310
uint8_t res = a + b;
2315
return res;
2316
}
2317
2312
-static inline uint16_t saddu16(CPURISCVState *env, int vxrm, uint16_t a,
2318
+static inline uint16_t saddu16(CPURISCVState *env, uint8_t vxrm, uint16_t a,
2319
uint16_t b)
2320
{
2321
uint16_t res = a + b;
2326
return res;
2327
}
2328
2323
-static inline uint32_t saddu32(CPURISCVState *env, int vxrm, uint32_t a,
2329
+static inline uint32_t saddu32(CPURISCVState *env, uint8_t vxrm, uint32_t a,
2330
uint32_t b)
2331
{
2332
uint32_t res = a + b;
2337
return res;
2338
}
2339
2334
-static inline uint64_t saddu64(CPURISCVState *env, int vxrm, uint64_t a,
2340
+static inline uint64_t saddu64(CPURISCVState *env, uint8_t vxrm, uint64_t a,
2341
uint64_t b)
2342
{
2343
uint64_t res = a + b;
2358
GEN_VEXT_VV_RM(vsaddu_vv_d, 8)
2359
2360
typedef void opivx2_rm_fn(void *vd, target_long s1, void *vs2, int i,
2355
- CPURISCVState *env, int vxrm);
2361
+ CPURISCVState *env, uint8_t vxrm);
2362
2363
#define OPIVX2_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
2364
static inline void \
2365
do_##NAME(void *vd, target_long s1, void *vs2, int i, \
2360
- CPURISCVState *env, int vxrm) \
2366
+ CPURISCVState *env, uint8_t vxrm) \
2367
{ \
2368
TX2 s2 = *((T2 *)vs2 + HS2(i)); \
2369
*((TD *)vd + HD(i)) = OP(env, vxrm, s2, (TX1)(T1)s1); \
2372
static inline void
2373
vext_vx_rm_1(void *vd, void *v0, target_long s1, void *vs2,
2374
CPURISCVState *env,
2369
- uint32_t vl, uint32_t vm, int vxrm,
2375
+ uint32_t vl, uint32_t vm, uint8_t vxrm,
2376
opivx2_rm_fn *fn, uint32_t vma, uint32_t esz)
2377
{
2378
for (uint32_t i = env->vstart; i < vl; i++) {
2441
GEN_VEXT_VX_RM(vsaddu_vx_w, 4)
2442
GEN_VEXT_VX_RM(vsaddu_vx_d, 8)
2443
2438
-static inline int8_t sadd8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
2444
+static inline int8_t sadd8(CPURISCVState *env, uint8_t vxrm, int8_t a,
2445
+ int8_t b)
2446
{
2447
int8_t res = a + b;
2448
if ((res ^ a) & (res ^ b) & INT8_MIN) {
2452
return res;
2453
}
2454
2448
-static inline int16_t sadd16(CPURISCVState *env, int vxrm, int16_t a,
2455
+static inline int16_t sadd16(CPURISCVState *env, uint8_t vxrm, int16_t a,
2456
int16_t b)
2457
{
2458
int16_t res = a + b;
2463
return res;
2464
}
2465
2459
-static inline int32_t sadd32(CPURISCVState *env, int vxrm, int32_t a,
2466
+static inline int32_t sadd32(CPURISCVState *env, uint8_t vxrm, int32_t a,
2467
int32_t b)
2468
{
2469
int32_t res = a + b;
2474
return res;
2475
}
2476
2470
-static inline int64_t sadd64(CPURISCVState *env, int vxrm, int64_t a,
2477
+static inline int64_t sadd64(CPURISCVState *env, uint8_t vxrm, int64_t a,
2478
int64_t b)
2479
{
2480
int64_t res = a + b;
2503
GEN_VEXT_VX_RM(vsadd_vx_w, 4)
2504
GEN_VEXT_VX_RM(vsadd_vx_d, 8)
2505
2499
-static inline uint8_t ssubu8(CPURISCVState *env, int vxrm, uint8_t a,
2506
+static inline uint8_t ssubu8(CPURISCVState *env, uint8_t vxrm, uint8_t a,
2507
uint8_t b)
2508
{
2509
uint8_t res = a - b;
2514
return res;
2515
}
2516
2510
-static inline uint16_t ssubu16(CPURISCVState *env, int vxrm, uint16_t a,
2517
+static inline uint16_t ssubu16(CPURISCVState *env, uint8_t vxrm, uint16_t a,
2518
uint16_t b)
2519
{
2520
uint16_t res = a - b;
2525
return res;
2526
}
2527
2521
-static inline uint32_t ssubu32(CPURISCVState *env, int vxrm, uint32_t a,
2528
+static inline uint32_t ssubu32(CPURISCVState *env, uint8_t vxrm, uint32_t a,
2529
uint32_t b)
2530
{
2531
uint32_t res = a - b;
2536
return res;
2537
}
2538
2532
-static inline uint64_t ssubu64(CPURISCVState *env, int vxrm, uint64_t a,
2539
+static inline uint64_t ssubu64(CPURISCVState *env, uint8_t vxrm, uint64_t a,
2540
uint64_t b)
2541
{
2542
uint64_t res = a - b;
2565
GEN_VEXT_VX_RM(vssubu_vx_w, 4)
2566
GEN_VEXT_VX_RM(vssubu_vx_d, 8)
2567
2561
-static inline int8_t ssub8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
2568
+static inline int8_t ssub8(CPURISCVState *env, uint8_t vxrm, int8_t a,
2569
+ int8_t b)
2570
{
2571
int8_t res = a - b;
2572
if ((res ^ a) & (a ^ b) & INT8_MIN) {
2576
return res;
2577
}
2578
2571
-static inline int16_t ssub16(CPURISCVState *env, int vxrm, int16_t a,
2579
+static inline int16_t ssub16(CPURISCVState *env, uint8_t vxrm, int16_t a,
2580
int16_t b)
2581
{
2582
int16_t res = a - b;
2587
return res;
2588
}
2589
2582
-static inline int32_t ssub32(CPURISCVState *env, int vxrm, int32_t a,
2590
+static inline int32_t ssub32(CPURISCVState *env, uint8_t vxrm, int32_t a,
2591
int32_t b)
2592
{
2593
int32_t res = a - b;
2598
return res;
2599
}
2600
2593
-static inline int64_t ssub64(CPURISCVState *env, int vxrm, int64_t a,
2601
+static inline int64_t ssub64(CPURISCVState *env, uint8_t vxrm, int64_t a,
2602
int64_t b)
2603
{
2604
int64_t res = a - b;
2628
GEN_VEXT_VX_RM(vssub_vx_d, 8)
2629
2630
/* Vector Single-Width Averaging Add and Subtract */
2623
-static inline uint8_t get_round(int vxrm, uint64_t v, uint8_t shift)
2631
+static inline uint8_t get_round(uint8_t vxrm, uint64_t v, uint8_t shift)
2632
{
2633
uint8_t d = extract64(v, shift, 1);
2634
uint8_t d1;
2640
2641
d1 = extract64(v, shift - 1, 1);
2642
D1 = extract64(v, 0, shift);
2635
- if (vxrm == 0) { /* round-to-nearest-up (add +0.5 LSB) */
2643
+ switch (vxrm) {
2644
+ case 0:
2645
+ /* round-to-nearest-up (add +0.5 LSB) */
2646
return d1;
2637
- } else if (vxrm == 1) { /* round-to-nearest-even */
2647
+ case 1:
2648
+ /* round-to-nearest-even */
2649
if (shift > 1) {
2650
D2 = extract64(v, 0, shift - 1);
2651
return d1 & ((D2 != 0) | d);
2652
} else {
2653
return d1 & d;
2654
}
2644
- } else if (vxrm == 3) { /* round-to-odd (OR bits into LSB, aka "jam") */
2655
+ case 2:
2656
+ /* round-down (truncate) */
2657
+ return 0;
2658
+ case 3:
2659
+ /* round-to-odd (OR bits into LSB, aka "jam") */
2660
return !d & (D1 != 0);
2661
+ default:
2662
+ g_assert_not_reached();
2663
}
2647
- return 0; /* round-down (truncate) */
2664
}
2665
2650
-static inline int32_t aadd32(CPURISCVState *env, int vxrm, int32_t a,
2666
+static inline int32_t aadd32(CPURISCVState *env, uint8_t vxrm, int32_t a,
2667
int32_t b)
2668
{
2669
int64_t res = (int64_t)a + b;
2672
return (res >> 1) + round;
2673
}
2674
2659
-static inline int64_t aadd64(CPURISCVState *env, int vxrm, int64_t a,
2675
+static inline int64_t aadd64(CPURISCVState *env, uint8_t vxrm, int64_t a,
2676
int64_t b)
2677
{
2678
int64_t res = a + b;
2701
GEN_VEXT_VX_RM(vaadd_vx_w, 4)
2702
GEN_VEXT_VX_RM(vaadd_vx_d, 8)
2703
2688
-static inline uint32_t aaddu32(CPURISCVState *env, int vxrm,
2704
+static inline uint32_t aaddu32(CPURISCVState *env, uint8_t vxrm,
2705
uint32_t a, uint32_t b)
2706
{
2707
uint64_t res = (uint64_t)a + b;
2710
return (res >> 1) + round;
2711
}
2712
2697
-static inline uint64_t aaddu64(CPURISCVState *env, int vxrm,
2713
+static inline uint64_t aaddu64(CPURISCVState *env, uint8_t vxrm,
2714
uint64_t a, uint64_t b)
2715
{
2716
uint64_t res = a + b;
2738
GEN_VEXT_VX_RM(vaaddu_vx_w, 4)
2739
GEN_VEXT_VX_RM(vaaddu_vx_d, 8)
2740
2725
-static inline int32_t asub32(CPURISCVState *env, int vxrm, int32_t a,
2741
+static inline int32_t asub32(CPURISCVState *env, uint8_t vxrm, int32_t a,
2742
int32_t b)
2743
{
2744
int64_t res = (int64_t)a - b;
2747
return (res >> 1) + round;
2748
}
2749
2734
-static inline int64_t asub64(CPURISCVState *env, int vxrm, int64_t a,
2750
+static inline int64_t asub64(CPURISCVState *env, uint8_t vxrm, int64_t a,
2751
int64_t b)
2752
{
2753
int64_t res = (int64_t)a - b;
2776
GEN_VEXT_VX_RM(vasub_vx_w, 4)
2777
GEN_VEXT_VX_RM(vasub_vx_d, 8)
2778
2763
-static inline uint32_t asubu32(CPURISCVState *env, int vxrm,
2779
+static inline uint32_t asubu32(CPURISCVState *env, uint8_t vxrm,
2780
uint32_t a, uint32_t b)
2781
{
2782
int64_t res = (int64_t)a - b;
2785
return (res >> 1) + round;
2786
}
2787
2772
-static inline uint64_t asubu64(CPURISCVState *env, int vxrm,
2788
+static inline uint64_t asubu64(CPURISCVState *env, uint8_t vxrm,
2789
uint64_t a, uint64_t b)
2790
{
2791
uint64_t res = (uint64_t)a - b;
2814
GEN_VEXT_VX_RM(vasubu_vx_d, 8)
2815
2816
/* Vector Single-Width Fractional Multiply with Rounding and Saturation */
2801
-static inline int8_t vsmul8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
2817
+static inline int8_t vsmul8(CPURISCVState *env, uint8_t vxrm, int8_t a,
2818
+ int8_t b)
2819
{
2820
uint8_t round;
2821
int16_t res;
2835
}
2836
}
2837
2821
-static int16_t vsmul16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
2838
+static int16_t vsmul16(CPURISCVState *env, uint8_t vxrm, int16_t a, int16_t b)
2839
{
2840
uint8_t round;
2841
int32_t res;
2855
}
2856
}
2857
2841
-static int32_t vsmul32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
2858
+static int32_t vsmul32(CPURISCVState *env, uint8_t vxrm, int32_t a, int32_t b)
2859
{
2860
uint8_t round;
2861
int64_t res;
2875
}
2876
}
2877
2861
-static int64_t vsmul64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
2878
+static int64_t vsmul64(CPURISCVState *env, uint8_t vxrm, int64_t a, int64_t b)
2879
{
2880
uint8_t round;
2881
uint64_t hi_64, lo_64;
2923
2924
/* Vector Single-Width Scaling Shift Instructions */
2925
static inline uint8_t
2909
-vssrl8(CPURISCVState *env, int vxrm, uint8_t a, uint8_t b)
2926
+vssrl8(CPURISCVState *env, uint8_t vxrm, uint8_t a, uint8_t b)
2927
{
2928
uint8_t round, shift = b & 0x7;
2929
uint8_t res;
2933
return res;
2934
}
2935
static inline uint16_t
2919
-vssrl16(CPURISCVState *env, int vxrm, uint16_t a, uint16_t b)
2936
+vssrl16(CPURISCVState *env, uint8_t vxrm, uint16_t a, uint16_t b)
2937
{
2938
uint8_t round, shift = b & 0xf;
2939
2941
return (a >> shift) + round;
2942
}
2943
static inline uint32_t
2927
-vssrl32(CPURISCVState *env, int vxrm, uint32_t a, uint32_t b)
2944
+vssrl32(CPURISCVState *env, uint8_t vxrm, uint32_t a, uint32_t b)
2945
{
2946
uint8_t round, shift = b & 0x1f;
2947
2949
return (a >> shift) + round;
2950
}
2951
static inline uint64_t
2935
-vssrl64(CPURISCVState *env, int vxrm, uint64_t a, uint64_t b)
2952
+vssrl64(CPURISCVState *env, uint8_t vxrm, uint64_t a, uint64_t b)
2953
{
2954
uint8_t round, shift = b & 0x3f;
2955
2975
GEN_VEXT_VX_RM(vssrl_vx_d, 8)
2976
2977
static inline int8_t
2961
-vssra8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
2978
+vssra8(CPURISCVState *env, uint8_t vxrm, int8_t a, int8_t b)
2979
{
2980
uint8_t round, shift = b & 0x7;
2981
2983
return (a >> shift) + round;
2984
}
2985
static inline int16_t
2969
-vssra16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
2986
+vssra16(CPURISCVState *env, uint8_t vxrm, int16_t a, int16_t b)
2987
{
2988
uint8_t round, shift = b & 0xf;
2989
2991
return (a >> shift) + round;
2992
}
2993
static inline int32_t
2977
-vssra32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
2994
+vssra32(CPURISCVState *env, uint8_t vxrm, int32_t a, int32_t b)
2995
{
2996
uint8_t round, shift = b & 0x1f;
2997
2999
return (a >> shift) + round;
3000
}
3001
static inline int64_t
2985
-vssra64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
3002
+vssra64(CPURISCVState *env, uint8_t vxrm, int64_t a, int64_t b)
3003
{
3004
uint8_t round, shift = b & 0x3f;
3005
3027
3028
/* Vector Narrowing Fixed-Point Clip Instructions */
3029
static inline int8_t
3013
-vnclip8(CPURISCVState *env, int vxrm, int16_t a, int8_t b)
3030
+vnclip8(CPURISCVState *env, uint8_t vxrm, int16_t a, int8_t b)
3031
{
3032
uint8_t round, shift = b & 0xf;
3033
int16_t res;
3046
}
3047
3048
static inline int16_t
3032
-vnclip16(CPURISCVState *env, int vxrm, int32_t a, int16_t b)
3049
+vnclip16(CPURISCVState *env, uint8_t vxrm, int32_t a, int16_t b)
3050
{
3051
uint8_t round, shift = b & 0x1f;
3052
int32_t res;
3065
}
3066
3067
static inline int32_t
3051
-vnclip32(CPURISCVState *env, int vxrm, int64_t a, int32_t b)
3068
+vnclip32(CPURISCVState *env, uint8_t vxrm, int64_t a, int32_t b)
3069
{
3070
uint8_t round, shift = b & 0x3f;
3071
int64_t res;
3098
GEN_VEXT_VX_RM(vnclip_wx_w, 4)
3099
3100
static inline uint8_t
3084
-vnclipu8(CPURISCVState *env, int vxrm, uint16_t a, uint8_t b)
3101
+vnclipu8(CPURISCVState *env, uint8_t vxrm, uint16_t a, uint8_t b)
3102
{
3103
uint8_t round, shift = b & 0xf;
3104
uint16_t res;
3114
}
3115
3116
static inline uint16_t
3100
-vnclipu16(CPURISCVState *env, int vxrm, uint32_t a, uint16_t b)
3117
+vnclipu16(CPURISCVState *env, uint8_t vxrm, uint32_t a, uint16_t b)
3118
{
3119
uint8_t round, shift = b & 0x1f;
3120
uint32_t res;
3130
}
3131
3132
static inline uint32_t
3116
-vnclipu32(CPURISCVState *env, int vxrm, uint64_t a, uint32_t b)
3133
+vnclipu32(CPURISCVState *env, uint8_t vxrm, uint64_t a, uint32_t b)
3134
{
3135
uint8_t round, shift = b & 0x3f;
3136
uint64_t res;