1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN %s 3 4; Check lowering of some large insertelement that use the stack 5; instead of register indexing. 6 7define amdgpu_kernel void @v_insert_v64i32_varidx(<64 x i32> addrspace(1)* %out.ptr, <64 x i32> addrspace(1)* %ptr, i32 %val, i32 %idx) #0 { 8; GCN-LABEL: v_insert_v64i32_varidx: 9; GCN: ; %bb.0: 10; GCN-NEXT: s_load_dwordx4 s[8:11], s[4:5], 0x0 11; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x10 12; GCN-NEXT: s_add_u32 s0, s0, s7 13; GCN-NEXT: v_mov_b32_e32 v16, 0x100 14; GCN-NEXT: s_addc_u32 s1, s1, 0 15; GCN-NEXT: s_waitcnt lgkmcnt(0) 16; GCN-NEXT: s_load_dwordx16 s[36:51], s[10:11], 0x0 17; GCN-NEXT: s_load_dwordx16 s[52:67], s[10:11], 0x40 18; GCN-NEXT: s_load_dwordx16 s[12:27], s[10:11], 0x80 19; GCN-NEXT: v_add_u32_e32 v31, 64, v16 20; GCN-NEXT: v_add_u32_e32 v32, 0x44, v16 21; GCN-NEXT: s_waitcnt lgkmcnt(0) 22; GCN-NEXT: v_mov_b32_e32 v0, s36 23; GCN-NEXT: v_mov_b32_e32 v1, s37 24; GCN-NEXT: v_mov_b32_e32 v2, s38 25; GCN-NEXT: v_mov_b32_e32 v3, s39 26; GCN-NEXT: v_mov_b32_e32 v4, s40 27; GCN-NEXT: v_mov_b32_e32 v5, s41 28; GCN-NEXT: v_mov_b32_e32 v6, s42 29; GCN-NEXT: v_mov_b32_e32 v7, s43 30; GCN-NEXT: v_mov_b32_e32 v8, s44 31; GCN-NEXT: v_mov_b32_e32 v9, s45 32; GCN-NEXT: v_mov_b32_e32 v10, s46 33; GCN-NEXT: v_mov_b32_e32 v11, s47 34; GCN-NEXT: v_mov_b32_e32 v12, s48 35; GCN-NEXT: v_mov_b32_e32 v13, s49 36; GCN-NEXT: v_mov_b32_e32 v14, s50 37; GCN-NEXT: v_mov_b32_e32 v15, s51 38; GCN-NEXT: s_load_dwordx16 s[36:51], s[10:11], 0xc0 39; GCN-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:256 40; GCN-NEXT: v_add_u32_e32 v0, 4, v16 41; GCN-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen 42; GCN-NEXT: v_mov_b32_e32 v1, s52 43; GCN-NEXT: buffer_store_dword v1, v31, s[0:3], 0 offen 44; GCN-NEXT: v_mov_b32_e32 v1, s53 45; GCN-NEXT: buffer_store_dword v1, v32, s[0:3], 0 offen 46; GCN-NEXT: v_add_u32_e32 v33, 0x48, v16 47; GCN-NEXT: v_mov_b32_e32 v1, s54 48; GCN-NEXT: buffer_store_dword v1, v33, s[0:3], 0 offen 49; GCN-NEXT: v_add_u32_e32 v34, 0x4c, v16 50; GCN-NEXT: v_mov_b32_e32 v1, s55 51; GCN-NEXT: buffer_store_dword v1, v34, s[0:3], 0 offen 52; GCN-NEXT: v_add_u32_e32 v35, 0x50, v16 53; GCN-NEXT: v_mov_b32_e32 v1, s56 54; GCN-NEXT: buffer_store_dword v1, v35, s[0:3], 0 offen 55; GCN-NEXT: v_add_u32_e32 v36, 0x54, v16 56; GCN-NEXT: v_mov_b32_e32 v1, s57 57; GCN-NEXT: buffer_store_dword v1, v36, s[0:3], 0 offen 58; GCN-NEXT: v_add_u32_e32 v37, 0x58, v16 59; GCN-NEXT: v_mov_b32_e32 v1, s58 60; GCN-NEXT: buffer_store_dword v1, v37, s[0:3], 0 offen 61; GCN-NEXT: v_add_u32_e32 v38, 0x5c, v16 62; GCN-NEXT: v_mov_b32_e32 v1, s59 63; GCN-NEXT: buffer_store_dword v1, v38, s[0:3], 0 offen 64; GCN-NEXT: v_add_u32_e32 v39, 0x60, v16 65; GCN-NEXT: v_mov_b32_e32 v1, s60 66; GCN-NEXT: buffer_store_dword v1, v39, s[0:3], 0 offen 67; GCN-NEXT: v_add_u32_e32 v40, 0x64, v16 68; GCN-NEXT: v_mov_b32_e32 v1, s61 69; GCN-NEXT: buffer_store_dword v1, v40, s[0:3], 0 offen 70; GCN-NEXT: v_add_u32_e32 v41, 0x68, v16 71; GCN-NEXT: v_mov_b32_e32 v1, s62 72; GCN-NEXT: buffer_store_dword v1, v41, s[0:3], 0 offen 73; GCN-NEXT: v_add_u32_e32 v42, 0x6c, v16 74; GCN-NEXT: v_mov_b32_e32 v1, s63 75; GCN-NEXT: buffer_store_dword v1, v42, s[0:3], 0 offen 76; GCN-NEXT: v_add_u32_e32 v43, 0x70, v16 77; GCN-NEXT: v_mov_b32_e32 v1, s64 78; GCN-NEXT: buffer_store_dword v1, v43, s[0:3], 0 offen 79; GCN-NEXT: v_add_u32_e32 v44, 0x74, v16 80; GCN-NEXT: v_mov_b32_e32 v1, s65 81; GCN-NEXT: buffer_store_dword v1, v44, s[0:3], 0 offen 82; GCN-NEXT: v_add_u32_e32 v45, 0x78, v16 83; GCN-NEXT: v_mov_b32_e32 v1, s66 84; GCN-NEXT: buffer_store_dword v1, v45, s[0:3], 0 offen 85; GCN-NEXT: v_add_u32_e32 v46, 0x7c, v16 86; GCN-NEXT: v_mov_b32_e32 v1, s67 87; GCN-NEXT: buffer_store_dword v1, v46, s[0:3], 0 offen 88; GCN-NEXT: v_add_u32_e32 v47, 0x80, v16 89; GCN-NEXT: v_mov_b32_e32 v1, s12 90; GCN-NEXT: buffer_store_dword v1, v47, s[0:3], 0 offen 91; GCN-NEXT: v_add_u32_e32 v48, 0x84, v16 92; GCN-NEXT: v_mov_b32_e32 v1, s13 93; GCN-NEXT: buffer_store_dword v1, v48, s[0:3], 0 offen 94; GCN-NEXT: v_add_u32_e32 v49, 0x88, v16 95; GCN-NEXT: v_mov_b32_e32 v1, s14 96; GCN-NEXT: buffer_store_dword v1, v49, s[0:3], 0 offen 97; GCN-NEXT: v_add_u32_e32 v50, 0x8c, v16 98; GCN-NEXT: v_mov_b32_e32 v1, s15 99; GCN-NEXT: buffer_store_dword v1, v50, s[0:3], 0 offen 100; GCN-NEXT: v_add_u32_e32 v51, 0x90, v16 101; GCN-NEXT: v_mov_b32_e32 v1, s16 102; GCN-NEXT: buffer_store_dword v1, v51, s[0:3], 0 offen 103; GCN-NEXT: v_add_u32_e32 v52, 0x94, v16 104; GCN-NEXT: v_mov_b32_e32 v1, s17 105; GCN-NEXT: buffer_store_dword v1, v52, s[0:3], 0 offen 106; GCN-NEXT: v_add_u32_e32 v53, 0x98, v16 107; GCN-NEXT: v_mov_b32_e32 v1, s18 108; GCN-NEXT: buffer_store_dword v1, v53, s[0:3], 0 offen 109; GCN-NEXT: v_add_u32_e32 v54, 0x9c, v16 110; GCN-NEXT: v_mov_b32_e32 v1, s19 111; GCN-NEXT: buffer_store_dword v1, v54, s[0:3], 0 offen 112; GCN-NEXT: v_add_u32_e32 v55, 0xa0, v16 113; GCN-NEXT: v_mov_b32_e32 v1, s20 114; GCN-NEXT: buffer_store_dword v1, v55, s[0:3], 0 offen 115; GCN-NEXT: v_add_u32_e32 v56, 0xa4, v16 116; GCN-NEXT: v_mov_b32_e32 v1, s21 117; GCN-NEXT: buffer_store_dword v1, v56, s[0:3], 0 offen 118; GCN-NEXT: v_add_u32_e32 v57, 0xa8, v16 119; GCN-NEXT: v_mov_b32_e32 v1, s22 120; GCN-NEXT: buffer_store_dword v1, v57, s[0:3], 0 offen 121; GCN-NEXT: v_add_u32_e32 v58, 0xac, v16 122; GCN-NEXT: v_mov_b32_e32 v1, s23 123; GCN-NEXT: buffer_store_dword v1, v58, s[0:3], 0 offen 124; GCN-NEXT: v_add_u32_e32 v59, 0xb0, v16 125; GCN-NEXT: v_mov_b32_e32 v1, s24 126; GCN-NEXT: buffer_store_dword v1, v59, s[0:3], 0 offen 127; GCN-NEXT: v_add_u32_e32 v60, 0xb4, v16 128; GCN-NEXT: v_mov_b32_e32 v1, s25 129; GCN-NEXT: buffer_store_dword v1, v60, s[0:3], 0 offen 130; GCN-NEXT: v_add_u32_e32 v61, 0xb8, v16 131; GCN-NEXT: v_mov_b32_e32 v1, s26 132; GCN-NEXT: buffer_store_dword v1, v61, s[0:3], 0 offen 133; GCN-NEXT: v_add_u32_e32 v62, 0xbc, v16 134; GCN-NEXT: v_mov_b32_e32 v1, s27 135; GCN-NEXT: buffer_store_dword v1, v62, s[0:3], 0 offen 136; GCN-NEXT: v_add_u32_e32 v63, 0xc0, v16 137; GCN-NEXT: s_waitcnt lgkmcnt(0) 138; GCN-NEXT: v_mov_b32_e32 v1, s36 139; GCN-NEXT: buffer_store_dword v1, v63, s[0:3], 0 offen 140; GCN-NEXT: v_add_u32_e32 v64, 0xc4, v16 141; GCN-NEXT: v_mov_b32_e32 v1, s37 142; GCN-NEXT: buffer_store_dword v1, v64, s[0:3], 0 offen 143; GCN-NEXT: v_add_u32_e32 v65, 0xc8, v16 144; GCN-NEXT: v_mov_b32_e32 v1, s38 145; GCN-NEXT: buffer_store_dword v1, v65, s[0:3], 0 offen 146; GCN-NEXT: v_add_u32_e32 v66, 0xcc, v16 147; GCN-NEXT: v_mov_b32_e32 v1, s39 148; GCN-NEXT: buffer_store_dword v1, v66, s[0:3], 0 offen 149; GCN-NEXT: v_add_u32_e32 v67, 0xd0, v16 150; GCN-NEXT: v_mov_b32_e32 v1, s40 151; GCN-NEXT: buffer_store_dword v1, v67, s[0:3], 0 offen 152; GCN-NEXT: v_add_u32_e32 v68, 0xd4, v16 153; GCN-NEXT: v_mov_b32_e32 v1, s41 154; GCN-NEXT: buffer_store_dword v1, v68, s[0:3], 0 offen 155; GCN-NEXT: v_add_u32_e32 v69, 0xd8, v16 156; GCN-NEXT: v_mov_b32_e32 v1, s42 157; GCN-NEXT: buffer_store_dword v1, v69, s[0:3], 0 offen 158; GCN-NEXT: v_add_u32_e32 v70, 0xdc, v16 159; GCN-NEXT: v_mov_b32_e32 v1, s43 160; GCN-NEXT: buffer_store_dword v1, v70, s[0:3], 0 offen 161; GCN-NEXT: v_add_u32_e32 v71, 0xe0, v16 162; GCN-NEXT: v_mov_b32_e32 v1, s44 163; GCN-NEXT: buffer_store_dword v1, v71, s[0:3], 0 offen 164; GCN-NEXT: v_add_u32_e32 v72, 0xe4, v16 165; GCN-NEXT: v_mov_b32_e32 v1, s45 166; GCN-NEXT: buffer_store_dword v1, v72, s[0:3], 0 offen 167; GCN-NEXT: v_add_u32_e32 v73, 0xe8, v16 168; GCN-NEXT: v_mov_b32_e32 v1, s46 169; GCN-NEXT: buffer_store_dword v1, v73, s[0:3], 0 offen 170; GCN-NEXT: v_add_u32_e32 v74, 0xec, v16 171; GCN-NEXT: v_mov_b32_e32 v1, s47 172; GCN-NEXT: buffer_store_dword v1, v74, s[0:3], 0 offen 173; GCN-NEXT: v_add_u32_e32 v75, 0xf0, v16 174; GCN-NEXT: v_mov_b32_e32 v1, s48 175; GCN-NEXT: buffer_store_dword v1, v75, s[0:3], 0 offen 176; GCN-NEXT: v_add_u32_e32 v76, 0xf4, v16 177; GCN-NEXT: v_mov_b32_e32 v1, s49 178; GCN-NEXT: s_and_b32 s5, s5, 63 179; GCN-NEXT: buffer_store_dword v1, v76, s[0:3], 0 offen 180; GCN-NEXT: v_add_u32_e32 v77, 0xf8, v16 181; GCN-NEXT: v_mov_b32_e32 v1, s50 182; GCN-NEXT: v_add_u32_e32 v17, 8, v16 183; GCN-NEXT: buffer_store_dword v1, v77, s[0:3], 0 offen 184; GCN-NEXT: v_add_u32_e32 v78, 0xfc, v16 185; GCN-NEXT: v_mov_b32_e32 v1, s51 186; GCN-NEXT: s_lshl_b32 s5, s5, 2 187; GCN-NEXT: buffer_store_dword v2, v17, s[0:3], 0 offen 188; GCN-NEXT: v_add_u32_e32 v18, 12, v16 189; GCN-NEXT: v_add_u32_e32 v19, 16, v16 190; GCN-NEXT: v_add_u32_e32 v20, 20, v16 191; GCN-NEXT: v_add_u32_e32 v21, 24, v16 192; GCN-NEXT: v_add_u32_e32 v22, 28, v16 193; GCN-NEXT: v_add_u32_e32 v23, 32, v16 194; GCN-NEXT: v_add_u32_e32 v24, 36, v16 195; GCN-NEXT: v_add_u32_e32 v25, 40, v16 196; GCN-NEXT: v_add_u32_e32 v26, 44, v16 197; GCN-NEXT: v_add_u32_e32 v27, 48, v16 198; GCN-NEXT: v_add_u32_e32 v28, 52, v16 199; GCN-NEXT: v_add_u32_e32 v29, 56, v16 200; GCN-NEXT: v_add_u32_e32 v30, 60, v16 201; GCN-NEXT: buffer_store_dword v1, v78, s[0:3], 0 offen 202; GCN-NEXT: v_add_u32_e32 v1, s5, v16 203; GCN-NEXT: v_mov_b32_e32 v2, s4 204; GCN-NEXT: buffer_store_dword v3, v18, s[0:3], 0 offen 205; GCN-NEXT: buffer_store_dword v4, v19, s[0:3], 0 offen 206; GCN-NEXT: buffer_store_dword v5, v20, s[0:3], 0 offen 207; GCN-NEXT: buffer_store_dword v6, v21, s[0:3], 0 offen 208; GCN-NEXT: buffer_store_dword v7, v22, s[0:3], 0 offen 209; GCN-NEXT: buffer_store_dword v8, v23, s[0:3], 0 offen 210; GCN-NEXT: buffer_store_dword v9, v24, s[0:3], 0 offen 211; GCN-NEXT: buffer_store_dword v10, v25, s[0:3], 0 offen 212; GCN-NEXT: buffer_store_dword v11, v26, s[0:3], 0 offen 213; GCN-NEXT: buffer_store_dword v12, v27, s[0:3], 0 offen 214; GCN-NEXT: buffer_store_dword v13, v28, s[0:3], 0 offen 215; GCN-NEXT: buffer_store_dword v14, v29, s[0:3], 0 offen 216; GCN-NEXT: buffer_store_dword v15, v30, s[0:3], 0 offen 217; GCN-NEXT: buffer_store_dword v2, v1, s[0:3], 0 offen 218; GCN-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen 219; GCN-NEXT: buffer_load_dword v2, v17, s[0:3], 0 offen 220; GCN-NEXT: buffer_load_dword v3, v18, s[0:3], 0 offen 221; GCN-NEXT: buffer_load_dword v4, v19, s[0:3], 0 offen 222; GCN-NEXT: buffer_load_dword v5, v20, s[0:3], 0 offen 223; GCN-NEXT: buffer_load_dword v6, v21, s[0:3], 0 offen 224; GCN-NEXT: buffer_load_dword v7, v22, s[0:3], 0 offen 225; GCN-NEXT: buffer_load_dword v8, v23, s[0:3], 0 offen 226; GCN-NEXT: buffer_load_dword v9, v24, s[0:3], 0 offen 227; GCN-NEXT: buffer_load_dword v10, v25, s[0:3], 0 offen 228; GCN-NEXT: buffer_load_dword v11, v26, s[0:3], 0 offen 229; GCN-NEXT: buffer_load_dword v12, v27, s[0:3], 0 offen 230; GCN-NEXT: buffer_load_dword v13, v28, s[0:3], 0 offen 231; GCN-NEXT: buffer_load_dword v14, v29, s[0:3], 0 offen 232; GCN-NEXT: buffer_load_dword v15, v30, s[0:3], 0 offen 233; GCN-NEXT: buffer_load_dword v16, v31, s[0:3], 0 offen 234; GCN-NEXT: buffer_load_dword v17, v32, s[0:3], 0 offen 235; GCN-NEXT: buffer_load_dword v18, v33, s[0:3], 0 offen 236; GCN-NEXT: buffer_load_dword v19, v34, s[0:3], 0 offen 237; GCN-NEXT: buffer_load_dword v20, v35, s[0:3], 0 offen 238; GCN-NEXT: buffer_load_dword v21, v36, s[0:3], 0 offen 239; GCN-NEXT: buffer_load_dword v22, v37, s[0:3], 0 offen 240; GCN-NEXT: buffer_load_dword v23, v38, s[0:3], 0 offen 241; GCN-NEXT: buffer_load_dword v24, v39, s[0:3], 0 offen 242; GCN-NEXT: buffer_load_dword v25, v40, s[0:3], 0 offen 243; GCN-NEXT: buffer_load_dword v26, v41, s[0:3], 0 offen 244; GCN-NEXT: buffer_load_dword v27, v42, s[0:3], 0 offen 245; GCN-NEXT: buffer_load_dword v28, v43, s[0:3], 0 offen 246; GCN-NEXT: buffer_load_dword v29, v44, s[0:3], 0 offen 247; GCN-NEXT: buffer_load_dword v30, v45, s[0:3], 0 offen 248; GCN-NEXT: buffer_load_dword v31, v46, s[0:3], 0 offen 249; GCN-NEXT: buffer_load_dword v32, v47, s[0:3], 0 offen 250; GCN-NEXT: buffer_load_dword v33, v48, s[0:3], 0 offen 251; GCN-NEXT: buffer_load_dword v34, v49, s[0:3], 0 offen 252; GCN-NEXT: buffer_load_dword v35, v50, s[0:3], 0 offen 253; GCN-NEXT: buffer_load_dword v36, v51, s[0:3], 0 offen 254; GCN-NEXT: buffer_load_dword v37, v52, s[0:3], 0 offen 255; GCN-NEXT: buffer_load_dword v38, v53, s[0:3], 0 offen 256; GCN-NEXT: buffer_load_dword v39, v54, s[0:3], 0 offen 257; GCN-NEXT: buffer_load_dword v40, v55, s[0:3], 0 offen 258; GCN-NEXT: buffer_load_dword v41, v56, s[0:3], 0 offen 259; GCN-NEXT: buffer_load_dword v42, v57, s[0:3], 0 offen 260; GCN-NEXT: buffer_load_dword v43, v58, s[0:3], 0 offen 261; GCN-NEXT: buffer_load_dword v44, v59, s[0:3], 0 offen 262; GCN-NEXT: buffer_load_dword v45, v60, s[0:3], 0 offen 263; GCN-NEXT: buffer_load_dword v46, v61, s[0:3], 0 offen 264; GCN-NEXT: buffer_load_dword v47, v62, s[0:3], 0 offen 265; GCN-NEXT: buffer_load_dword v48, v63, s[0:3], 0 offen 266; GCN-NEXT: buffer_load_dword v49, v64, s[0:3], 0 offen 267; GCN-NEXT: buffer_load_dword v50, v65, s[0:3], 0 offen 268; GCN-NEXT: buffer_load_dword v51, v66, s[0:3], 0 offen 269; GCN-NEXT: buffer_load_dword v52, v67, s[0:3], 0 offen 270; GCN-NEXT: buffer_load_dword v53, v68, s[0:3], 0 offen 271; GCN-NEXT: buffer_load_dword v54, v69, s[0:3], 0 offen 272; GCN-NEXT: buffer_load_dword v55, v70, s[0:3], 0 offen 273; GCN-NEXT: buffer_load_dword v56, v71, s[0:3], 0 offen 274; GCN-NEXT: buffer_load_dword v57, v72, s[0:3], 0 offen 275; GCN-NEXT: buffer_load_dword v58, v73, s[0:3], 0 offen 276; GCN-NEXT: buffer_load_dword v59, v74, s[0:3], 0 offen 277; GCN-NEXT: buffer_load_dword v60, v75, s[0:3], 0 offen 278; GCN-NEXT: buffer_load_dword v61, v76, s[0:3], 0 offen 279; GCN-NEXT: buffer_load_dword v62, v77, s[0:3], 0 offen 280; GCN-NEXT: buffer_load_dword v63, v78, s[0:3], 0 offen 281; GCN-NEXT: buffer_load_dword v0, off, s[0:3], 0 offset:256 282; GCN-NEXT: v_mov_b32_e32 v64, 0 283; GCN-NEXT: s_waitcnt vmcnt(0) 284; GCN-NEXT: global_store_dwordx4 v64, v[0:3], s[8:9] 285; GCN-NEXT: global_store_dwordx4 v64, v[4:7], s[8:9] offset:16 286; GCN-NEXT: global_store_dwordx4 v64, v[8:11], s[8:9] offset:32 287; GCN-NEXT: global_store_dwordx4 v64, v[12:15], s[8:9] offset:48 288; GCN-NEXT: global_store_dwordx4 v64, v[16:19], s[8:9] offset:64 289; GCN-NEXT: global_store_dwordx4 v64, v[20:23], s[8:9] offset:80 290; GCN-NEXT: global_store_dwordx4 v64, v[24:27], s[8:9] offset:96 291; GCN-NEXT: global_store_dwordx4 v64, v[28:31], s[8:9] offset:112 292; GCN-NEXT: global_store_dwordx4 v64, v[32:35], s[8:9] offset:128 293; GCN-NEXT: global_store_dwordx4 v64, v[36:39], s[8:9] offset:144 294; GCN-NEXT: global_store_dwordx4 v64, v[40:43], s[8:9] offset:160 295; GCN-NEXT: global_store_dwordx4 v64, v[44:47], s[8:9] offset:176 296; GCN-NEXT: global_store_dwordx4 v64, v[48:51], s[8:9] offset:192 297; GCN-NEXT: global_store_dwordx4 v64, v[52:55], s[8:9] offset:208 298; GCN-NEXT: global_store_dwordx4 v64, v[56:59], s[8:9] offset:224 299; GCN-NEXT: global_store_dwordx4 v64, v[60:63], s[8:9] offset:240 300; GCN-NEXT: s_endpgm 301 %vec = load <64 x i32>, <64 x i32> addrspace(1)* %ptr 302 %insert = insertelement <64 x i32> %vec, i32 %val, i32 %idx 303 store <64 x i32> %insert, <64 x i32> addrspace(1)* %out.ptr 304 ret void 305} 306 307attributes #0 = { "amdgpu-waves-per-eu"="1,10" } 308